quarta-feira, 8 de setembro de 2010

usando a eeprom do atmega8 - avr studio


 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

Um comentário :

  1. legal...foi muito útil para mim...obrigado...funcionou muito bem aqui pra mim

    ResponderExcluir

olá,digite aqui seu comentário!