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