Bonjour à tous,
Mes déboires avec le ATMEGA8535 continuent... Je ne parviens pas à faire fonctionner la liaison UART, dans le sens micro-> PC.
J'ai tenté 2 codes, le premier tiré de la datasheet :
Code:#define F_CPU 8000000UL #include <util/delay.h> #include <avr/interrupt.h> //fuses, page 235 sde la DS. #define FOSC 8000000// Clock Speed #define BAUD 9600 #define MYUBRR FOSC/16/BAUD-1 //code atmel : void USART_Init( unsigned int baud ) { // Set baud rate UBRRH = (unsigned char)(baud>>8); UBRRL = (unsigned char)baud; // Enable receiver and transmitter UCSRB = (1<<RXEN)|(1<<TXEN); // Set frame format: 8data, 2stop bit UCSRC = (1<<USBS)|(3<<UCSZ0); } void USART_Transmit( unsigned char data ) { // Wait for empty transmit buffer while ( !( UCSRA & (1<<UDRE)) ) ; //Put data into buffer, sends the data UDR = data; } unsigned char USART_Receive( void ) { // Wait for data to be received while ( !(UCSRA & (1<<RXC)) ) ; // Get and return received data from buffer return UDR; } int main(void) { //setup init_IO(); //USART_Init(MYUBRR); //init liaison série while(1) { //la loop //essai serial USART_Transmit('b'); USART_Transmit('o'); USART_Transmit('n'); USART_Transmit('j'); USART_Transmit('o'); USART_Transmit('u'); USART_Transmit('r'); _delay_ms(4000); } }
Le second, tiré de cette page :
Code:#include <avr/io.h> #define F_CPU 8000000UL #include <util/delay.h> #include <avr/interrupt.h> //uses, page 235 de la DS. //This function is used to initialize the USART //at a given UBRR value void USARTInit(uint16_t ubrr_value) { //Set Baud rate UBRRL = ubrr_value; UBRRH = (ubrr_value>>8); /*Set Frame Format >> Asynchronous mode >> No Parity >> 1 StopBit >> char size 8 */ UCSRC=(1<<URSEL)|(3<<UCSZ0); //Enable The receiver and transmitter UCSRB=(1<<RXEN)|(1<<TXEN); } //This function is used to read the available data //from USART. This function will wait untill data is //available. char USARTReadChar() { //Wait untill a data is available while(!(UCSRA & (1<<RXC))) { //Do nothing } //Now USART has got data from host //and is available is buffer return UDR; } //This fuction writes the given "data" to //the USART which then transmit it via TX line void USARTWriteChar(char data) { //Wait untill the transmitter is ready while(!(UCSRA & (1<<UDRE))) { //Do nothing } //Now write the data to USART buffer UDR=data; } void init_IO() { [...] //serial config: DDRD = 0<<PD0; //RX DDRD = 1<<PD1; //TX } int main(void) { //setup init_IO(); USARTInit(51); //UBRR = 51 //couché le chien WDTCR = 0b00000000; while(1) { //la loop USARTWriteChar('b'); USARTWriteChar('o'); USARTWriteChar('n'); USARTWriteChar('j'); USARTWriteChar('o'); USARTWriteChar('u'); USARTWriteChar('r'); _delay_ms(4000); MiseAJourAfficheurs(); } return 1; }
Coté hard, j'ai un montage à base de MAX232 pour branchement sur un port série physique, et un module USB-série. J'observe bien toutes les 4 secondes la led de RX qui s'illumine sur les modules (plus rapide dans le second cas, la vitesse étant plus rapide). J'ai à chaque fois configuré hyperterminal aux vitesses et configurations spécifiées, mais rien n'apparait sur l'écran. Je ne comprends pas... Même résultat avec les 2 convertisseurs. Ces derniers fonctionnent correctement en boucle fermée (quand je ponte TX et RX). Je n'ai pas encore testé les fonctions de réception sur le micro, uniquement la transmission. Mon micro fonctionne avec un quartz de 8MHz.
Pour info, voici les fuses que j'utilise : high fuse : 0b11011001 low fuse : 0b11111111 J'ai juste (je pense) modifié le type d'oscillateur pour passer sur l'externe. Les autres bits étant les valeurs par défaut.
Des idées ?
Merci d'avance !
EDIT : Pardon pour la faute de frappe dans le titre, mais je n'arrive pas à la modifier...
-----