1: //************************************************************************
2: // usando a memoria do atmel
3: // Version : 1.0
4: // microcontrolador : AVR ATMega8
5: // Autor : Aguivone
6: // descrição : escrevendo e lendo a memoria
7: // data : 01/09/2010.
8: //
9: //************************************************************************
10: #define F_CPU 4000000UL // 4 MHz deve vir antes das interrupçoes
11: #include <avr/io.h>
12: #include <avr/interrupt.h>
13: #include <util/delay.h>
14: #include <string.h>
15: #include <avr/eeprom.h>
16:
17:
18: #define liga_pino(x,y) x |= _BV(y)
19: #define desliga_pino(x,y) x &= ~(_BV(y))
20:
21: unsigned char temp;
22:
23: unsigned char caracter;//
24: unsigned int tam_buffer;//usado para contar o tamanho do buffer de recepção
25: unsigned char buffer_serial[14];//buffer da serial
26: volatile char rec_buffer ='S';//usado para ler o buffer de recepção (volatile para funcionar pois sempre ira retornar mesmo valor)
27:
28: ///////////////////////////////////////////////funçoes usadas pela usart////////////////////////////////////////////////
29:
30: void serial_inicializa(unsigned int BAUD)
31: {
32: unsigned int valor = F_CPU/16/BAUD-1; //é recomendavel ver o data sheet para ter certeza se está formula irá funcionar na sua mcu
33: /* baud rate */
34: UBRRH = (unsigned char)(valor>>8);
35: UBRRL = (unsigned char)valor;
36: UCSRA = 0X20;
37: /* habilita receiver and transmitter buffers */
38: UCSRB = 0X98;//deve se habilitar somente a interrupção de recepção para não travar o microcontrolador
39: /* 8 bits , 1 stop bit, assincrono , sem paridade */
40: UCSRC = 0X86;
41: }
42: void impri_serial(const char frase[80])
43: {
44: unsigned int indice=0;
45: unsigned int tamanho = strlen(frase);
46: while(indice<=tamanho)///veja que o programa pode travar se aqui não tiver as duas aspas
47: {
48: while ( !( UCSRA & (1<<UDRE)) ); //espera transmitir para enviar um novo
49: UDR =frase[indice];
50: indice++;
51: }
52: }
53: void put_serial(unsigned char *carac)
54: {
55: while ( !( UCSRA & (1<<UDRE)) ); //espera transmitir para enviar um novo
56: UDR = *carac;
57: }
58: //////////////////////////interrupções requerida para usar a serial///////////////////////////////////
59: ISR(USART_RXC_vect)
60: { // # caracter *
61: caracter = (char)UDR;
62: if(caracter == '*')
63: {
64: if(tam_buffer<14)//max do display
65: {
66: rec_buffer ='F';
67: }
68: else
69: {
70: rec_buffer ='E';//tamanhoa incompativel
71: }
72: }
73: if((caracter != '*')&&(rec_buffer == 'I'))
74: {
75: buffer_serial[tam_buffer]=caracter;
76: tam_buffer++;
77: }
78: if(caracter == '#')
79: {
80: rec_buffer ='I';
81: tam_buffer=0;
82: }
83: }
84:
85:
86: ////////////////////////////////////////////////função principal///////////////////
87:
88: int main(void)
89: {
90: DDRC = 0x00; //inicializa portc como entrada
91: DDRD = 0XFE; //inicializa portD
92: DDRB = 0xFF; //inicializa portb como saida
93: serial_inicializa(4800);//não importa frequencia e 4800
94: sei();
95: impri_serial("Inicializado ... \n\r");
96: while (1)
97: {
98: if(rec_buffer == 'F')//tem dados para ler ?
99: {
100: impri_serial("recebeu primeiro caracter :");
101: impri_serial(&buffer_serial[0]);
102: impri_serial("\n\r");
103: if(buffer_serial[0] == 'E')//houve interrupção
104: {
105: impri_serial("comparou");
106: temp='n';
107: _EEPUT(5,buffer_serial[1]);//endereço/dado
108: _EEGET(temp,5);//local a ser escrito/endereço
109: impri_serial(& temp);
110: liga_pino(PORTB,PB0);
111: _delay_ms(500);
112: desliga_pino(PORTB,PB0);
113: }
114: rec_buffer = 'S';
115: }
116: if(rec_buffer == 'E')//deu erro ?
117: {
118: impri_serial("tamanho inconpativel");
119: rec_buffer = 'S';
120: }
121:
122:
123: }
124: }
125:
126:
127: //para usar float é necessario adiconar a biblioteca
legal...foi muito útil para mim...obrigado...funcionou muito bem aqui pra mim
ResponderExcluir