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

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

Piotr Kania 02 Lut 2009 17:34 1657 3
  • #1 6092461
    Piotr Kania
    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]
  • #2 6092510
    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.
  • #3 6092971
    Piotr Kania
    Poziom 15  
    Przesyłam fragment mojego kodu to działa (ustawia godzine i minuty) ale mnie nie zachwyca
    
    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();
    }
    }
    }
    
    
  • #4 6109367
    JanuszM
    Poziom 17  
    Ja to zrobiłem tak na ATmega128 (wyciąłem zbędne dla tego tematu rzeczy):
    
    
    ----------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:
    
    _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
    
    _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?
REKLAMA