Bonjour,
je suis entrain de me mettre à la famille atmel, et j'en profite pour coder mes propres librairie.
Cependant je bute sur un petit probléme avec la liaison serie.
Ma fonction usart_init(); est definie comme tel:unsigned char data=0xf0;//variable globale data
//interrupt when reception complete
ISR(USART_RX_vect)
{
data = UDR0; // put the recieved byte value into the variable
UDR0 = data; // Echo back the received byte back to the computer
}
void main()
{
usart_init();
sei();//enable interrupts
DDRB=0xff;//portC en sortie
PORTB=0xff;
_delay_ms(2000);
while(1)
{
PORTB=data;
}
}
Ce programme trés simple genére une interruption lorsque le µc reçoit une donnée sur la ligne. Il stocke la donnée dans une variable data, et l'affiche sur le portB.void usart_init( )
{
//Set baud rate
UBRR0 = 25;//9600bauds avec F_CPU = 4MHz
UCSR0B = (1<<RXEN0)|(1<<TXEN0);//Enable receiver, transmitter
UCSR0B |= (1 << RXCIE0); //Enable interrupt receiver
// Set frame format: 8data, 1 stop bit, no parity
UCSR0C = (3<<UCSZ00);
}
Je travail en simulation sous isis (proteus) en attendant de recevoir mon materiel.
L'interruption se génére parfaitement car on voit le retour de la lettre saisie au clavier dans l'hyper terminal virtuel.
Par contre impossible d'afficher le code ASCII de la lettre saisie sur le portB !
Cependant, lorsque je saisie une lettre dans l'hyper terminal avant la tempo _delay_ms(2000);, le code ASCII s'affiche sans probléme sur le port. Une fois la tempo passée, je n'arrive pas à changer la valeur ecrite sur le port.
edit: par contre lorsque la tempo est passé et qu'on n'a pas saisie de lettre dans l'hyper terminal, le PORTB recopie bien la valeur d'initialisation de data (0xf0).
C'est comme si mon while(1) ne s'executé qu'une seule fois...
D'où peut venir le probléme à votre avis ?
Merci
-----