/* provaAVR04.c 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ó : ./gcc88 provaAVR04.c ( si tot va bé, genera provaAVR04.hex ) ( gcc88 es pot baixar de http://www.binefa.net/electronica/tutorial04/eines88.zip ) Enregistrament de fusibles per indicar que hi ha cristall de quarç : ./fuseXtal88 ( fuseXtal88 es pot baixar de http://www.binefa.net/electronica/tutorial04/eines88.zip ) o ./fuseXtalUSB88 ( fuseXtalUSB88 es pot baixar de http://www.binefa.net/electronica/tutorial04/einesUSB88.zip ) Enregistrament de l'arxiu hexadecimal al xip : ./prg88 provaAVR04.hex ( prg88 es pot baixar de http://www.binefa.net/electronica/tutorial04/eines88.zip ) o ./prgUSB88 provaAVR04.hex ( prgUSB88 es pot baixar de http://www.binefa.net/electronica/tutorial04/einesUSB88.zip ) 20080506 www.binefa.net www.electronics.cat */ #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) #ifndef BOOL #define BOOL unsigned char #endif #ifndef BYTE #define BYTE unsigned char #endif #ifndef WORD #define WORD unsigned int #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif volatile BOOL bLed; /* És important indicar que és volatile */ 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){ 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){ // 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<