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

[C] Obsługa przycisku avr

bonifacy3030 11 Paź 2010 22:53 6721 9
REKLAMA
  • #1 8609364
    bonifacy3030
    Poziom 10  
    Witam

    Koledzy mam taki problem, chciałbym napisać kod w C by jeden przycisk spełniał dwie funkcję, mianowicie napisanie kodu do przycisku który ustawiał by zadaną temperaturę. O ile nie jest problem napisanie ścieżki z zwiększaniem temperatury poprzez pojedyncze naciskanie przycisku to nie mam pojęcia jak napisać kod żeby ten sam przycisk po dłuższym wciśnięciu zaczął automatycznie zwiększać temperaturę do momentu jego puszczenia. Każdorazowe wciskanie przycisku jest meczące i denerwujące. Przeszukałem już całą sieć i albo źle szukam albo takiego wątku nie było albo nie ma jeszcze. Dzięki z góry za pomoc.
    Pozdrawiam :D
  • REKLAMA
  • #2 8609384
    calasilyar
    Poziom 11  
    może coś takiego [pseudokod-c]?

    if ( przycisk wciśnięty)
    {
             wait(delay);
             if ( przycisk wciśnięty)
             {
                      wait(2s);
                      while( wciśnięty )
                      {
                      temp += kwant;
                      wait(delay);
                      }
             }
    }
  • REKLAMA
  • #3 8609534
    gaskoin
    Poziom 38  
    Wystarczy ustawić go na zewnętrzne przerwanie i nie wyzwalać go zboczem tylko poziomem :) W przerwaniu robić inkrementację temperatury
  • REKLAMA
  • #4 8612856
    bonifacy3030
    Poziom 10  
    Dzięki chłopaki za porady. Po krótkim czasie udało mi się wyczarować coś takiego z ograniczeniem zwiększania i zmniejszania temperatury w granicach od 0 do 100:

    /* Główna pętla  */
      while(1)
      {
        if(!(PIND & 0x08)) // przycisk "+"
      {  
        _delay_ms(80);
    	
    	if(!(PIND & 0x08))
      {
    
    if(n < 100) //ograniczenie temp do 100
      {
    
       n++;
       lcd(n);
      }
     }
    }
         if(!(PIND & 0x10)) //przycisk "-"
      {  
         _delay_ms(80);
    	
    	if(!(PIND & 0x10))
      {
    
    if(n > 0) //ograniczenie zmniejszania temp do 0
      {
    
       n--;
       lcd(n);
    }
      }
     }
    }


    Pozdrawiam :D
  • REKLAMA
  • #5 8651087
    bonifacy3030
    Poziom 10  
    Witam mam kolejny problem.
    Głowie się od pewnego czasu jak napisać kod dla "multiprzycisku" tzn:
    - pojedyncze wciskanie przycisku wywołuję zapalanie i gaśnięcie diody LED 1 (z tym akurat nie ma problemu),
    -szybkie podwójne wciśnięcie tego samego przycisku albo dłuższe jego przytrzymanie powoduję zapalenie lub zgaśnięcie diody LED 2 jednocześnie nie wpływając na stan diody LED 1 czy jest ona zapalona czy nie.

    Dzięki za wszelakie podpowiedzi.[/code]
  • #6 8651129
    gaskoin
    Poziom 38  
    możesz do tego zapuścić timer, i policzyć liczbę wciśnięć np w przeciągu 250 ms.

    Przy wciśnięciu przycisku odpalasz timer i inkrementujesz liczbę wciśnięć, po skończeniu liczenia (ocr lub ovf) wystawiasz flagę odpowiedniej funkcji w zależności od liczby wciśnięć
  • #7 8652041
    bonifacy3030
    Poziom 10  
    Właśnie chodzi mi o jakiś prosty kod, który nie włącza w to timera i przerwań, bo mam podłączony termometr DS18B20 i gdzieś wyczytałem, że podobno ma on problemy z odczytem temperatury gdy występują przerwania.
    Napisałem już coś takiego:

    
    if(!(PINX & 0xXX)
    {
    _delay_ms(1000);     
     if(!(PINX & 0xXX)
    {
      PORTX ^=(1<<2);  // jeżeli wcisnę przycisk i przytrzymam dłużej niż 1 sek
    }                             // to zapala mi się LED 2 jeżeli powtórzę czynność to gaśnie
    
    PORTX ^=(1<<1);            // gdy jest wciśnięty krócej niż 1 sek to zapala się LED1
     while(!(PINX & 0xXX)) {}  // oczywiście gdy powtórzę  to gaśnie 
    _delay_ms(80);                
    


    Jak widać kod jest banalnie prosty, ale ma wadę, tzn. gdy chcę zapalić LED 2 przy wyłączonym LEDZ'ie 1 to zapala mi się ten drugi LED ale jednocześnie pierwszy też.
    Chciałbym jakoś to rozgraniczyć żeby LED 2 nie miał wpływu na stan LED'a1 czy jest włączony czy nie. Siedzę na tym już jakiś czas i nie mam pojęcia jak to dalej ugryźć.
    Chciałem napisać banalny kod, który nie zajmuję jednej kartki A4 albo więcej, ale może niektórych rzeczy nie da się tak łatwo zrobić. Podkreślam ze jestem dopiero początkującym avr'owcem w języku C więc wszelakie rady są mile widziane.
    Do usłyszenia :)
  • #8 8652088
    gaskoin
    Poziom 38  
    myślałem, że nie będziesz chciał zatrzymywać procesora na tą jedną sekundę- wtedy zostaje timer, zmień kod na taki:

    if(!(PINX & 0xXX)
    {
    _delay_ms(1000);     
     if(!(PINX & 0xXX)
    {
      PORTX ^=(1<<2);  // jeżeli wcisnę przycisk i przytrzymam dłużej niż 1 sek
    }                             // to zapala mi się LED 2 jeżeli powtórzę czynność to gaśnie
    else
    {
    PORTX ^=(1<<1);
    }            // gdy jest wciśnięty krócej niż 1 sek to zapala się LED1
     while(!(PINX & 0xXX)) {}  // oczywiście gdy powtórzę  to gaśnie
    _delay_ms(80);     


    Nie dałeś elsa wobec czego drugi fragment kodu był wykonywany zawsze
  • #9 8652321
    bonifacy3030
    Poziom 10  
    Gaskoin naprawdę wielkie DZIĘKUJĘ!!!
    Okazało się jak to zawsze diabeł tkwi w szczegółach. Nawet na myśl by mi nie przyszło żeby tego ELSA wstawić akurat w tym miejscu. No i tak dzięki twojej pomocy wyszedł skromny kodzik do obsługi dwóch Led'ów jednym przyciskiem bez włączania timera i przerwań.
    Jeszcze raz dzięki, pozdrawiam i do usłyszenia :D
REKLAMA