como controlar sequencias pela porta serial?

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

como controlar sequencias pela porta serial?

Mensagempor renan-papaco » 15 Mai 2013 00:37

preciso controlar sequencias de bytes pela porta serial do tipo:

envia caractere "A" e um led pisca na porta P1
envia caractere B e pisca dois leds na porta P1
envia caractere C e pisca outros leds de acordo com a sequencia q quero... como um comando switch case.
acontece q o livro q tenho só ensina a acender um led por vez de acordo com o caractere enviado.
tem como fazer um loop de "piscadas" diferente controlado pela serial?

só quero apenas q me deem um exemplo de como fazer isso no SDCC.

se não puderem me ajudar pelomenos me indiquem algum livro na qual eu possa aprender td sozinho q seja baseado em C...
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: como controlar sequencias pela porta serial?

Mensagempor Francesco » 24 Mar 2014 18:23

Olá Renan,

O que você precisa fazer não é difícil, mas precisa de umas idéias um pouco mais complexas. Vou colocar um código aqui para você entender...

cpp code
unsigned char piscaP1_0 ;
unsigned char piscaP1_1 ;
unsigned char piscaP1_2 ;

void timer0_isr(void) interrupt 1
{
static unsigned int tempo = 0 ;
if( ++tempo >= 1000 )
{
if( piscaP1_0 )
P1 ^= 0x01 ;
else
P1 &= 0xFE ;
if( piscaP1_1 )
P1 ^= 0x02 ;
else
P1 &= 0xFD ;
if( piscaP1_3 )
P1 ^= 0x04 ;
else
P1 &= 0xFB ;
tempo = 0 ;

}
}

void main( void )
{
unsigned char dado ;

inicializa_serial() ;
inicializa_timer() ;

piscaP1_0 = 0 ;
piscaP1_1 = 0 ;
piscaP1_2 = 0 ;

while( 1 )
{
dado = recebe_serial() ;
switch( dado )
{
case 'A' :
piscaP1_0 = !piscaP1_0 ;
break ;
case 'B' :
piscaP1_1 = !piscaP1_1 ;
break ;
case 'C' :
piscaP1_2 = !piscaP1_2 ;
break ;
}
}
}


Estou acreditando que você tenha 3 funções, uma chamada inicializa_serial(), para inicializar a serial da maneira que você precisa... outra chamada recebe_serial(), que vai receber os caracteres da serial... e inicializa_timer(), que vai colocar o timer para gerar uma interrupção a cada 1ms.

Na chamada da interrupção, coloquei um contador de 1000, assim ele executa a cada segundo. Quando ele executa, vai verificar a variável piscaP1_0. Se ela valer 0, ele apaga o led (P1.0). Se ela valer 1, ele inverte o estado do led (P1.0). A mesma coisa com piscaP1_1 e piscaP1_2.

Quando o programa principal receber o caractere 'A', ele inverte piscaP1_0. Se ele estiver com 0, vai para 1 e o led começa a piscar. Se você enviar novamente 'A', ele vai de 1 para 0 e pára de piscar.

Espero ter ajudado.
Qualquer problema, conte conosco.
Um abraço.

Francesco
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP


Voltar para 8051

Quem está online

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

x