X

PCF8583 i problem z konwersja z BCD>BIN>DEC (Codevisio

yello 09 Mar 2006 22:32
  • #1 09 Mar 2006 22:32
    yello
    Level 10  
    Helpful post? (0)
    Witam,

    Napisalem programik do centralki alarmowej
    w Codevision C AVR na ATMega128.
    Na plytce centralki jest zegar RTC PCF8583.
    Jednym z zadan programu jest wysylanie
    aktualnego czasu pobranego z zegara poprzez
    Uart do szyfratora z LCD.
    Problem polega na tym, ze wbudowane w biblioteki
    procedury pobieraja czas z RTC i konwertuja go bcd2bin.
    Chcialbym wyslac aktualny czas jako string np. "time: 22:24:58"
    Jak narazie uzywam putchar() i wysylam pojedynczo godziny, minuty
    i sekundy, a na koncu CR,LF.
    Ale na porcie szeregowym w oknie terminala na
    PC pojawiaja sie znaki Ascii (#$%-+()0123 itd...) zamiast np. sekund od 0 do 59.
    Probowalem uzywac roznych funkcji wbudowanych (np. atoi() - w tym przypadku jednak nic nie jest wysylane) ale wciaz na port szeregowy wysylane sa znaki ASCI odpowiadajace aktualnie
    odczytanej z zegara liczbie.
    Co robie nie tak ?
    Co i na co powienienem przekonwertowac i w jaki sposob ?

    Z gory dziekuje za jakiekolwiek podpowiedzi

    Pozdrawiam
    Bartek
  • #2 09 Mar 2006 22:49
    Samuraj
    Level 34  
    Helpful post? (0)
    Ja to robie tak jeśli chodzi o lcd

    Code:

    // wyswietlenie liczby
    void lcd_sendnumber(unsigned int number,unsigned char wyr,char znak)
    {
      unsigned char buf[9]="        ";
      ltoa(number,buf);            // zamiana liczby na string (syst. dziesietny)
      if (wyr !=0)
      {
        unsigned char b;
        for (b=wyr;b>1;b--)
          if (buf[b]==' ') lcd_sendchar(znak);   // dodanie spacji na poczatek      
      }   
      lcd_sendstring(buf);           // wyswietlenie na LCD
    }


    void pisz_godzine(void)
    {
      rtc_get_time(0x01,&hour,&minu,&sec,&hsec);
      lcd_sendnumber(hour,2,' ');
      lcd_sendchar(':');
      lcd_sendnumber(minu,2,'0');
    }
  • #3 09 Mar 2006 23:15
    yello
    Level 10  
    Topic author Helpful post? (0)
    Witam,

    Dziękuję serdecznie :))
    Juz wszystko dziala tak jak trzeba.
    Twoja podpowiedz byla bezbledna i nieoceniona.
    Ponizej fragment kodu po lekkim przerobieniu na Uart:


    void sendnumber(unsigned int number,unsigned char wyr,char znak)
    {
    unsigned char buf[9]=" ";
    ltoa(number,buf); // zamiana liczby na string (syst. dziesietny)
    if (wyr !=0)
    {
    unsigned char b;
    for (b=wyr;b>1;b--)
    if (buf[b]==' ') putsf1(" "); // dodanie spacji na poczatek
    }
    puts1(buf); // wyslanie na UART1
    }


    void main()
    {
    while(1)
    {

    rtc_get_time(0,&h,&m,&s,&hs);

    putsf1("time:");

    sendnumber(h,2,' '); //wyslij godziny

    putsf1(":");

    sendnumber(m,2,'0'); //wyslij minuty

    putsf1(":");

    sendnumber(s,2,'0'); //wyslij sekundy

    putsf1("\r\n"); //CR,LF

    waitms(1000);
    }
    }
  • #4 26 Aug 2009 19:08
    Piecia
    Level 14  
    Helpful post? (0)
    Hej
    Pewnie temat juz nieaktualny ale jesli ktos jeszcze zaglada to moze mi pomoze:)
    A wiec tak : chce wyswietlic ta sama metoda jednak po pobraniu danych z RTC wyswietla mi wartosci wszystkich danych (godz, min, sec) jako liczbe 165. Nie wiem czy problem tkwi w zlym programie czy niedzialajacym RTC??? Prosze o pomoc

    dziekuje i pozdr
  Search 4 million + Products
Browse Products