Compilador C30

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Compilador C30

Mensagempor Bardelli » 10 Jan 2007 21:51

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;
}
Bardelli
Byte
 
Mensagens: 126
Registrado em: 20 Out 2006 12:42

Mensagempor proex » 11 Jan 2007 06:57

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.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Maia » 11 Jan 2007 08:04

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
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor Maia » 11 Jan 2007 09:41

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?
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor proex » 11 Jan 2007 12:40

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.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

curiosidade

Mensagempor Rogerio Brasiliense » 11 Jan 2007 13:56

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.
Rogerio Brasiliense
Bit
 
Mensagens: 47
Registrado em: 13 Out 2006 10:36

Mensagempor proex » 11 Jan 2007 14:36

Ó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.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Maia » 11 Jan 2007 14:56

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
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor a.rairan » 12 Jan 2007 18:04

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!
André "Away" Rairan
a.rairan
Byte
 
Mensagens: 192
Registrado em: 11 Out 2006 18:53
Localização: São Caetano do Sul - SP - Brasil

Mensagempor Maia » 12 Jan 2007 21:07

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
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x