/* provaAVR02.c Prova de funcionament de la placa de proves : http://www.binefa.net/electronica/tutorial03/ que es connecta a la placa convertidora RS232 a TTL : http://www.binefa.net/electronica/tutorial03/ Codi present a : http://www.binefa.net/electronica/tutorial04/ Compilació en tres passos : avr-gcc -g -mmcu=atmega88 -Wall -Wstrict-prototypes -Os -mcall-prologues -Os -c provaAVR02.c avr-gcc -g -mmcu=atmega88 -Wall -Wstrict-prototypes -Os -mcall-prologues -o provaAVR02.out -Wl,-Map,provaAVR02.map provaAVR02.o avr-objcopy -R .eeprom -O ihex provaAVR02.out provaAVR02.hex Enregistrament de fusibles per indicar que hi ha cristall de quarç : avrdude -p m88 -c dapa -u -v -U lfuse:w:0xee:m avrdude -p m88 -c dapa -u -v -U hfuse:w:0xd9:m Enregistrament de l'arxiu hexadecimal al xip : avrdude -p m88 -c dapa -e -U flash:w:provaAVR02.hex 20080401 www.binefa.net */ #include //#include //#include #include #include #include #define F_OSC 3686400 /* Freqüència del cristall emprat */ #define UART_BAUD_RATE 115200 /* Velocitat de programació de la UART */ #define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_OSC)/((UART_BAUD_RATE)*16l)-1) void vEspera_ms(unsigned short us_ms){ unsigned short usV1, usV2; usV1 = 200; while (usV1) { usV2 = 1000; while (usV2) { while ( us_ms ) us_ms--; usV2--; } usV1--; } } void vEscriuCaracter(unsigned char uc){ /* UCSRA <-> UCSR0A UDRE <-> UDRE0 UDR <-> UDR0 while(!(UCSRA & (1 << UDRE))); // Esperar fins que UDR estigui preparat UDR = uc; // Tramesa del caràcter */ while(!(UCSR0A & (1 << UDRE0))); // Esperar fins que UDR estigui preparat UDR0 = uc; /* Tramesa del caràcter */ } void vEscriuCadena(char *sz){ while (*sz) { vEscriuCaracter(*sz); sz++; } } void vIniciaUART(void){ /* UBRRH <-> * UBRRL <-> UBRR0L * UCSRB <-> UCSR0B * RXEN <-> RXEN0 * TXEN <-> TXEN0 * RXCIE <-> RXCIE0 * UCSRC <-> UCSR0C * URSEL <-> * UCSZ0 <-> UCSZn0 * // Iniciació de la velocitat de la UART UBRRH = (uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)>>8); UBRRL = (uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_OSC); // Habilitar transmissor i receptor ( i llur interrupció ) UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE); // 8 bits de dades, sense paritat i 1 bit d'stop UCSRC = (1 << URSEL) | (3 << UCSZ0); */ // Iniciació de la velocitat de la UART UBRR0H = (uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)>>8); /* !!!! */ UBRR0L = (uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_OSC); // Habilitar transmissor i receptor ( i llur interrupció ) UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0); // 8 bits de dades, sense paritat i 1 bit d'stop UCSR0C = (1 << UMSEL01) | (3 << UCSZ00); } void vInicia(void){ vIniciaUART(); sei(); /* S'habiliten les interrupcions */ DDRC|= (1< UDR0 uc = UDR;*/ uc = UDR0; vEscriuCaracter(uc+1); /* Quan la UART rep un caràcter l'escriu. Efecte d'eco. */ } int main(void){ vInicia(); while( 1 ){ /* Bucle infinit */ vEncenLed(); vEspera_ms(1000); vApagaLed(); vEspera_ms(1000); } return(0); }