logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega32][C]zapis nr pastylki ds1990a do pamięci EEPROM

owitech 25 Maj 2009 18:40 1635 2
  • #1 6573704
    owitech
    Poziom 2  
    Witam
    Mam taki problem muszę napisać korzystając z AVR-GCC(zestaw zl3avr (z uC Atmega32) program weryfikujący numer pastylki ds1990a, po odczycie nr pastylki trzeba zapisać go do pamięci EEPROM przez naciśnięcie klawisza, przy następnym odczycie pastylki mam ją porównać do poprzedniego nr, jeśli nr będzie taki sam to ma wyświetlać np "ok otwarte" a jeśli nr się nie zgadza to np "brak dostępu".drugi klawisz ma kasować nr zapisany w pamięci. Kod do odczytu pastylki mam tylko nie wiem jak się wziąć za resztę.niestety jestem słaby z programowania a jest mi ten program niestety bardzo potrzebny. Jeśli ktoś wie jak to zrobić to bardzo proszę o pomoc.

    Z góry bardzo dziękuje za podpowiedzi.
  • #2 6579567
    dawid512
    Poziom 32  
    Do projektu dołącz sobie pliczek <avr/eeprom.h> i zobacz co w nim siedzi na pewno się przyda.
  • #3 6593623
    owitech
    Poziom 2  
    Zaglądałem do tego już, znalazłem też w dokumentacji technicznej atmegi32 kod tylko teraz zastanawiam sie jak to połączyć do reszty programu i klawiszy . Będę bardzo wdzięczny za podpowiedź jak to połączyć w całość i dodać do tego klawisze.
    kod z dokumentacji atmegi32
    
    void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
    {
    /* Wait for completion of previous write */
    while(EECR & (1<<EEWE))
    ;
    /* Set up address and data registers */
    EEAR = uiAddress;
    EEDR = ucData;
    /* Write logical one to EEMWE */
    EECR |= (1<<EEMWE);
    /* Start eeprom write by setting EEWE */
    EECR |= (1<<EEWE);
    }
    =======================
    unsigned char EEPROM_read(unsigned int uiAddress)
    {
    /* Wait for completion of previous write */
    while(EECR & (1<<EEWE))
    ;
    /* Set up address register */
    EEAR = uiAddress;
    /* Start eeprom read by writing EERE */
    EECR |= (1<<EERE);
    /* Return data from data register */
    return EEDR;
    }
    

    kod do obsługi pastylki:
    
    int main(void)     //program główny
    {
     unsigned char i,zp;
    
     //tablica komunikatów do wyświetlenia
     char *info[5]={
                    PSTR("Wykryto pastylke"),
                    PSTR("Wykryto zwarcie "),
                    PSTR("Brak pastylki   "),
                    PSTR("                "),
                    PSTR("Blad CRC        "),
                   };
    /*
    tutaj myslalem zeby wstawic jeszcze to i zwiększyc tablice
    PSTR("Otwarte         "),
    PSTR("Zamkniete       "), 
    */
     DDRB=0xff;        //PORTB - wy
     DDRD=0;           //PORTD - we
     PORTD=0;          //bez podciągania
     led0=1;           //gaś LED-a
     led1=0;
    //>>>>>>>>>>>>>>>>>>    Inicjowanie wyświetlacza LCD   <<<<<<<<<<<<<<<<<<<<<<<<<
     lcd_rs=0;
     czekaj(45*tau);        //opóźnienie ok. 45ms dla ustabilizowania się napięcia
                            //zasilania LCD (katalogowo min. 15 ms)
     for(i=0;i<3;i++)       //3-krotne wysłanie 3-
     {
      lcd_e=1;
      PORTB=(PORTB&0x0f)|0x30;   //wyślij 3- do LCD
      asm("nop");
      asm("nop");
      asm("nop");
      lcd_e=0;
      czekaj(5*tau);        //ok. 5ms
     }
     lcd_e=1;
     PORTB=(PORTB&0x0f)|0x20;    //wyślij 2- do LCD
     asm("nop");                 //wymagane wydłużenie impulsu
     asm("nop");
     asm("nop");
     lcd_e=0;               //impuls strobujący
     czekaj(10L);
     piszilcd(0x28);        //interfejs 4-bitowy, 2 linie, znak 5x7
     piszilcd(0x08);        //wyłącz LCD, wyłącz kursor, wyłącz mruganie
     piszilcd(0x01);        //czyść LCD
     czekaj(1.64*tau);      //wymagane dla instrukcji czyszczenia ekranu opóźnienie
     piszilcd(0x06);        //bez przesuwania w prawo
     piszilcd(0x0c);        //włącz LCD, bez kursora, bez mrugania
    
     while(1)               //główna pętla programu
     {
      zp=0;
      pastylka_wy=stan_0;   //sekwencja inicjująca pastylkę
      czekaj(5);            //impuls inicjujący "0" ok. 480us
      pastylka_wy=stan_1;   //zwolnij linię
      czekaj_1w(128);       //po odczekaniu ok. 65us czekaj na impuls obecności
      if(pastylka_we==0)
      {
       zp++;                //zapamiętaj fakt wykrycia impulsu obecności pastylki
      }
      czekaj(4);
      czekaj_1w(56);        //czekaj ok. 416us do zakończenia slotu inicjującego
      if(pastylka_we==0)
      {
       zp++;           //jeśli pozostaje w stanie niskim, to oznacza zwykłe zwarcie
      }
      if(zp==1)        //reakcja na rozpoznane sytuacje
      {                //jeśli zp=1, to oznacza że pastylka zgłosiła się
       wys_bajt(0x33); //wyślij do pastylki kod rozkazu przesłania numeru seryjnego 
       czytajbajt();     //czytaj numer seryjny pastylki (+ kod rodziny + CRC)
       zp=0;           //w zp będzie liczone CRC - wstępne zerowanie
       for(i=0;i<8;i++)
       {
        obliczanie_crc(bufor1w[i],&zp);     //licz CRC ze wszystkich bajtów odebranych
       }
       lcdxy(0,0);
       if(zp==0)
       {               //zerowa wartość CRC oznacza prawidłowość danych
        led0=0;        //zapal LED-a
    	led1=1;
        pisztekst(info[0]);      //wyświetl komunikat na LCD o rozpoznaniu pastylki
        lcdxy(1,0);
        pbufor1w=&bufor1w[7];
        for(i=6;i!=0xff;i--)     //wyświetlenie danych z pastylki
        {
         utoa((unsigned char)bufor1w[i],buflcd,16); //przepisz bufor1w do
                       //bufora wyświetlacza z jednoczesną konwersją na ASCII
         pbuflcd=&buflcd[0];     //ustaw wskaźnik bufora LCD na początek 
         if(strlen(buflcd)<2)    //jeśli odebrano pojedynczą cyfrę, trzeba dopisać 0
         {
          piszznak('0');         //wyświetlenie zera wiodącego
         }
         while(*pbuflcd)         //wyświetl zawartość bufora LCD
         {
          piszznak(toupper(*pbuflcd++));  //wyświetl dane z konwersją na duże litery
         }
        }
       }
       else
       {
        pisztekst(info[4]);      //komunikat o błędzie obliczenia CRC
       }
       czekaj(3000*tau);         //przytrzymaj wynik na wyświetlaczu przez ok. 3s
      }
      else
      {
       led0=1;                  //gaś LED-a
       led1=0;
       lcdxy(1,0);
       pisztekst(info[3]);      //wyczyść dolną linię wyświetlacza
       lcdxy(0,0);
       if(zp==2)
       {                         //to było tylko zwarcie
        pisztekst(info[1]);      //wyświetl komunikat o zwarciu
       }
       else
       {
        pisztekst(info[2]);      //wyświetl komunikat o braku pastylki
       }
      }
     }
    }
    

    z góry dziękuje za pomoc
REKLAMA