Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

pomysł na menu do zegara, zrobienie na 3 przyciskach?

02 Lut 2009 17:34 1513 3
  • Poziom 15  
    Witam mam problem z zegarem RTC zegar działa prawidłowo ale nie wiem jak napisać menu żeby go ustawić, coś prostego napisałem ale nie jestem z niego zadowolony. Chciałbym zeby program działał tak, leci sobie w pętli gdy przyjdzie przerwanie od PCF wyświetla się aktualna godzina. Następnie chciałbym za pomocą 1 przycisku wejść do menu (oczywiście zablokować przerwania) i za jego pomocą w nim się poruszać zwiększając bądź zmniejszając wartości godzin , min, dni, miesięcy lat. Czy to jest możliwe do zrobienia na 3 przyciskach? Dzięki za wszelkie propozycje na menu !

    Poprawiłem tytuł - regulamin p.11
    [zumek]
  • Poziom 39  
    Otrzymałem raport, który dotyczy tego tematu.
    Raportujący napisał:
    Przydało by się minimum wysiłku, żeby pokazać co się do tej pory zrobiło, w jakim języku ma być program napisany, kawałek schematu dla lepszego rozeznania.

    Czekamy na rozwinięcie tematu.
  • Poziom 15  
    Przesyłam fragment mojego kodu to działa (ustawia godzine i minuty) ale mnie nie zachwyca
    Code:

    void nastawa(void)
    {
    lcd_xy(0,0);
    nalcd((g1&0xf0)>>4,g1);
    write_text(":");
    lcd_xy(0,3);
    nalcd((m1&0xf0)>>4,m1);
    write_text(":");
    lcd_xy(0,6);
    nalcd((s1&0xf0)>>4,s1);
    }
    void ustaw(void) // ustawia godzine
    {
    cli();
    lcd_xy(0,0);
    nastawa();

    if bit_is_clear(PIND,6){sw1=1;}
    if(sw1)
    {
    g1++;
    _delay_ms(200);
    if((g1&0x0f)>9)
    {
    g1+=0x06;
    }
    if((g1&0x3F)>0x23)
    {
    g1&=0xc0;
    }
    nastawa();
    //rtc_write(0x04,g1); zapis godziny do rtc
    sw1=0;
    }

    if bit_is_clear(PIND,7){sw2=1;}
    if(sw2)
    {
    m1++;
    _delay_ms(200);
    if((m1&0x0f)>9)
    {
    m1+=0x06;
    }
    if(m1>0x59)
    {
    m1=0;
    }
    nastawa();
    //rtc_write(0x04,g1); zapis godziny do rtc
    sw2=0;
    }
    if bit_is_clear(PIND,5){sw0=0;}
    if(!sw0)
    {
    s1=0;
    rtc_write(0x04,g1);
    rtc_write(0x03,m1);
    rtc_write(0x02,s1);
    lcd_clr();
    sei();
    }
    }
    int main(void)         // program główny
    {
    GICR = _BV(INT0); //GIMSK
    //włącz obsługę przerwań Int0
    MCUCR = _BV(ISC01);
    // włącz generowanie przerwań przez
    // opadające zbocze na Int0

    PRZYCISK0_INPUT();
    PRZYCISK0_HI();
    PRZYCISK1_INPUT();
    PRZYCISK1_HI();
    PRZYCISK2_INPUT();
    PRZYCISK2_HI();
    sw0=0;
    sw1=0;
    sw2=0;

    fzegar=0;
    lcd_init();
    lcd_clr();
    lcd_xy(0,0);
    write_text("ZEGAR RTC");
    _delay_ms(500);
    lcd_clr();
    sei();
    while(1)
    {
    if bit_is_clear(PIND,5){sw0=1;}
    if(sw0)
    {
    ustaw();
    }
    }
    }

  • Poziom 17  
    Ja to zrobiłem tak na ATmega128 (wyciąłem zbędne dla tego tematu rzeczy):
    Code:


    ----------przerwanie--------------------
    SIGNAL(SIG_OUTPUT_COMPARE1A)      //przerwanie co 3,84ms
    {
          switch (nrLED)                                          //   EVERY TIME IN INTERRUPT
          {
             case 1:
             {
                PORTB=_1;  //pod PORTB podpięte są katody 7segm. a _1 to komórka pamięci w której jest to, co chcę wysłać na pierwszy wyświetlacz
                //tutaj brakuje instrukcji przełączania anod
                nrLED++;  //inkrementuję zawartość nrLED, żeby przy następnym przerwaniu załadowało drugi wyświetlacz
                break;
             }
             case 2:
             {
                PORTB=_2;   //pod PORTB podpięte są katody 7segm. a _2 to komórka pamięci w której jest to, co chcę wysłać na drugi wyświetlacz
                //tutaj brakuje instrukcji przełączania anod
                nrLED++;
                break;
             }
             case 3:
             {
                PORTB=_3;  //pod PORTB podpięte są katody 7segm. a _3 to komórka pamięci w której jest to, co chcę wysłać na trzeci wyświetlacz
                //tutaj brakuje instrukcji przełączania anod
                nrLED++;
                break;
             }
             case 4:
             {
                PORTB=_4;  //pod PORTB podpięte są katody 7segm. a _4 to komórka pamięci w której jest to, co chcę wysłać na pierwszy wyświetlacz
                //tutaj brakuje instrukcji przełączania anod
                nrLED=1;
                break;
             }
             default :
             {
                nrLED=1;
                break;
             }
          }
    }
    ----------koniec przerwania--------------------

    ----------main--------------------
    {
       while(1) //kręci w kółko cały main
       {
          if (!(PING & (1<<PG4)))   //wejdź do klamry jeśli wcisnieto przycisk SET TIME
          {

             _1=0x01;    //tu wpisuje na wyświetlacz 17:56
             _1=0x07;    //ale tylko dopóki trzymasz przycisk SET TIME
             _3=0x05;    //po zwolnieniu przycisku załaduje dane z hourM, hourL, minuteM, minuteL
             _4=0x06;


             Delay20ms();
             while (!(PING & (1<<PG4)));     //czeka aż puszczę
             Delay20ms();
          }


          _1=hourM;   //w hourM trzymam starszą godzinę pobraną z RTC
          _2=hourL;   //w hourM trzymam mlodsza godzinę pobraną z RTC
          _3=minuteM;   //w minuteM trzymam starszą minute pobraną z RTC
          _4=minuteL;   //w minuteM trzymam mlodsza minute pobraną z RTC

       }
    }
    ----------koniec main--------------------




    To działa tak - przerwanie co 3,84ms multipleksuje 4 pojedyncze 7-segmentowe wyświetlacze. Nie jest wyłączane i służy tylko i wyłącznie do wrzucania na wyświetlacze danych ze zmiennych _1, _2, _3, _4. Cyfra oznacza numer wyświetlacza liczony od lewej strony.

    While(1) powoduje kręceni się w kółko całego main - żeby program nam się nigdy nie "skończył".

    I teraz tak - jak nie wciskasz przycisku SET TIME podłączonego do portu PG4, to na wyświetlacz ładowane są dane wcześniej odczytane z RTC PCF8583. Jest to kod:
    Code:

    _1=hourM;
    _2=hourL;
    _3=minuteM;
    _4=minuteL;

    a jeśli wciśniesz przycisk i będziesz go trzymał, to na wyświetlaczu pojawią się cyfry 1756
    Code:

    _1=0x01;
    _1=0x07;
    _3=0x05;
    _4=0x06;

    Reasumując: przerwanie non-stop wyrzuca cyfry na wyświetlacz (dba pełne multpleksowanie 4 wyświetlaczy) a w pętli głównej mówisz CO ma być wyświetlane.

    Mogę podesłać Tobie cały kod ale ma 2811 linii. Sam nie wiem co zajmuje tyle miejsca ale działa i plik bin ma ok. 30kB (co jest niestety dużo jak na zegar). Najwięcej miejsca zajmuje właśnie obsługa przycisków. Trochę nacudowałem ale nie chce mi się tego optymalizować.
    Zastosowałem 4 przyciski: SET, ALARM, UP, DOWN.
    Zamieszczam 2 zdjęcia jakbyś chciał coś podpatrzeć.
    Pozdrawiam, Janusz
    pomysł na menu do zegara, zrobienie na 3 przyciskach?
    pomysł na menu do zegara, zrobienie na 3 przyciskach?