Página 1 de 1
Compilador C30

Enviado:
10 Jan 2007 21:51
por Bardelli
Olá all
No codigo abaixo, oque seria esse LATB, LATC. Estou tentando usar o compilador C30 para DSPIC, mas o compilador vem se mostrando desafiador. Eis aqui o código
int main ()
{
LATB = 0;
LATC = 0;
LATD = 0;
LATF = 0;
LATG = 0;
// FEDCBA9876543210
TRISB = 0b1111111111111111;
TRISC = 0b1111111111111111;
TRISD = 0b1111111110000000;
TRISF = 0b1111111111111111;
TRISG = 0b1111111111111111;
}

Enviado:
11 Jan 2007 06:57
por proex
LATB = PORTB
LATC = PORTC
LATD = PORTD
LATF = PORTF
LATG = PORTG
Ou seja, se o PORTB estiver configurado como saida, tudo que vc escrever em LATB aparecerá nos pinos do PORTB.
Se vc escrever LATB=0x001, é o mesmo que escrever PORTB=0x001.
Porem, se o PORTB estiver configurado como entrada, para ler o estado desse Port vc tem que ler diretamente o PORTB e nao o LATB.

Enviado:
11 Jan 2007 08:04
por Maia
Tb estou com esse problema. Tinha um programa escrito em pro 18F452 usando o PICC18 da Hi-Tech e tive que passá-lo pra um dsPIC30F4013 por questão de precisão do FP. Tb estou usando o C30 e estou tendo um monte de problemas pra fazer o programa funcionar. Um deles é esse negócio de LAT. Às vezes mando um dado direto pra um bit de uma porta ou pra uma porta inteira e não sai nada nela. Tenho sempre que escrever no LAT? Dá pra clarear mais um pouquinho?
Obrigado.
Abraços,
Maia

Enviado:
11 Jan 2007 09:41
por Maia
Fiz umas experiências e obtive esse resultados. Tenho uns leds ligados nos pinos 4 ao 8 através de resistores ao Vcc.
Se eu fizer:
int main(void)
{
ADPCFG = 0xffff; // Todas as entradas digitais
TRISB = 0x000f;
PORTB = 0xffff; ou LATB = 0xffff;
for(;; ) ;
return(0);
}
Porta B fica em 0 e os leds acesos.
Se eu fizer:
int main(void)
{
ADPCFG = 0xffff; // Todas as entradas digitais
TRISB = 0x000f;
PORTB = 0xffff; ou LATB = 0xffff;
PORTB = 0xffff; ou LATB = 0xffff;
for(;; ) ;
return(0);
}
Funciona direito. Os leds ficam apagados.
Pq tenho que escrever duas vezes na porta B pra ela ir pra 0xffff?

Enviado:
11 Jan 2007 12:40
por proex
A principio tanto faz vc mover um dado para o PortB ou para o LatB, pois o resultado sera o mesmo. Ou seja, o PortB é que receberá o dado.
A diferença esta na LEITURA do Port. Se vc lêr o LATB, estará lendo o valor previamente enviado á esse registro e nao o estado atual dos pinos do PORTB.
Nao entendi porque vc teve que dar dois comando para conseguir enviar o valor para o PORTB:
PORTB = 0xffff;
PORTB = 0xffff;
Nos programas que faço, somente um comando é suficiente.
Veja esse exemplo:
;------------------------------------------------------------------------
#include "p24fj128ga006.h"
// #include <stdio.h>
// #include <ports.h>
unsigned int counter;
int main (void)
{
counter = 1;
AD1PCFG = 0XFFFF; // desabilita conversores AD no PORTB
TRISB = 0; // configura PORTB como saida
while(1)
{
PORTB = counter; // envia o valor de "counter" para PORTB
counter = counter+1; // incrementa "counter"
}
return 0;
}
Veja que só há um comando "PORTB = counter" .
Se vc simular esse programa no C30, verá que assim que esse comando for executado, o PORTB assumirá o valor movido.
Veja tambem que nao foi sequer mencionado o LATB nesse programa.
curiosidade

Enviado:
11 Jan 2007 13:56
por Rogerio Brasiliense
Notei no exemplo acima o laço while como while(1) que sempre será true.
Tem um return quando sair do laço.
O C para PIC é tão diferente do padrão ANSI ?
Ou foi um lapso do amigo.

Enviado:
11 Jan 2007 14:36
por proex
Óia Rogério, com ou sem o return funciona na mesma forma. Nao saberia te dizer o nivel de compatibilidade com o padrão ANSI.

Enviado:
11 Jan 2007 14:56
por Maia
Resolvi meu problema. Se fizer assim funciona:
LATB ou PORTB = 0xffff;
TRISB = 0x0000;
Assim não funciona:
TRISB = 0x0000;
LATB ou PORTB = 0xffff;
Abraços,
Maia

Enviado:
12 Jan 2007 18:04
por a.rairan
O LAT seria a condição "interna" do pino e o PORT a condição externa.
Se você comfigurar o LAT antes de trocar o pino para saida a saida será igual o lat!

Enviado:
12 Jan 2007 21:07
por Maia
Eu não se é coisa do dsPIC ou do C30 (ou alguma burrice minha), mas eu tinha programa funcionando perfeito no 18F452 programado no Hi-Tech que converti pro dsPIC4013 / C30 e só funcionou quando troquei todos os comandos que iam para as portas, pro LATs correspondentes. Por exemplo, era "RB4 = 1;" mudei para "PORTBbits.RB4 = 1;" e não funcionou. Tive que mudar para "LATBbits.LATB4 = 1;". Não sei pq ainda.
Abraços,
Maia