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

ATMega 16 [C] - Zapalanie diód z opóźnieniem.

PabLO-FC 09 Sty 2010 15:11 4660 7
REKLAMA
  • #1 7509150
    PabLO-FC
    Poziom 10  
    Witam
    Próbuje zrobić program na AtMege16
    Program ma działać w następujący sposób:
    Przyciskam 1 guzik z klawiatury (klawiaturka jest 4x4, ale wykorzystywane tylko 3x4) i ma zapalić się dioda 0 (podłączona do portu A pin 0) i zgasnąć z opóźnieniem powiedzmy 30sekund
    Przyciskam 2 guzik i zapala się dioda 1 (PA 1) z opóźnieniem 30 sekund i gaśnie po takim samym czasie

    Program teraz działa tak:
    wciskam 1 zapalają sie w ten sposób diody 00001110 a jak dwójkę to 00001101 i gasna automatycznie

    Gdzieś coś pomieszałem i męczę się co jest nie tak, ale wszystko wydaje się być ok. najgorzej jest sprawdzać błędy we własnym programie, bo wtedy ciężko coś znaleść.

    Mój kod wygląda tak

    
    
    /* ATmega 1MHz */
    
    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>
    
    signed char v; // zmienna do odliczania przebiegu pętli opóźniającej
    
    void ustawienia(void)
    {
       //Ustawienie portów dla wyjść (LEDy, LCD) i wejścia (Klawiatura)
    
       //Port A bity 0-3 - LED-y 
       DDRA  = 0x0F;
       PORTA = 0x0F;
    
       //klawiatura 4kolumny i 3 linie
       DDRD  = 0x0f;
       PORTD = 0x7f;
    }
    
    
    /*Sprawdzanie klawiatury - szukanie wciśniętego guzika */
    unsigned char read_keypad(void)
    {
       unsigned char row,col,key;
    /* Wybierany jest wiersz i wyszukiwanie wcisniętego guzika w kolumnach*/
       for(row=0x7e,key=1; row>=0x77; row=(row<<1|0x1)&0x7f)
       {
          PORTD = row;
          for(col=0x10; col< 0x80; col<<=1, key++)
                      if(!(PIND & col)) return key;
       }
       /* Jeśli żaden z przycisków nie został wciśnięty,
          wyjście z kodem zero */
       return 0;
    }
    
    int main(void)
    { 
    	unsigned char key;
    	ustawienia(); //wywołanie funkcji ustawiającej porty
    
        for(;;)
       {
          /*wygaszenie wszystkich diód (diody mają za zadanie zastąpienie dowolnego urządzenia, którym program miałby sterować)*/
          PORTA |= 0x0F;
          //sprawdzanie wcisniętego klawisza
    	  while(!(key = read_keypad()));
    	  {
    			if(key == 1) // włączenie diody 1 (PA 0) na 30 sekund
    			{
    				PORTA &= 0x01;//zapalenie  LED0
    				v==30; 
    				do
    				{
                		_delay_ms(960); // Prawie sekunda opóźnienia 
                		v--;
             		}
    				while(v>0);
    				PORTA |= 0x01;//zgaszenie LED0		
    			}
    			if(key == 2) // włączenie diody 2 (PA 0)  po 30 sekundach na 30 sekund 
    			{	
    				v==30; 
    				do
    				{
                		_delay_ms(960); // Prawie sekunda opóźnienia 
                		v--;
             		}
    				while(v>0);
    				PORTA &= 0x02;//zapalenie  LED1	
    				do
    				{
                		_delay_ms(960); // Prawie sekunda opóźnienia 
                		v--;
             		}
    				while(v>0);
    				PORTA |= 0x02;//zgaszenie  LED1	
    			}
    	  }
    
    	}	
    
    }
    
    
  • REKLAMA
  • #2 7509183
    asembler
    Poziom 32  
    Oczekiwanie to trzebaby zrobic na przerwaniach bo zeby wykonac nastepne nacisniecie to muszisz wyjsc z petli oczekujacej (30s)
  • REKLAMA
  • #3 7509192
    PabLO-FC
    Poziom 10  
    a możesz fragment kodu do tego dać??
  • #4 7509233
    asembler
    Poziom 32  
    Tak zeby nie angazowac czasu procesora i miec mozliwosc naciskania w dowolnej chwili przycisków a co za tym idzie zapalania poszczególnych diod powinienes zadeklarowac tyle zmiennyxh typu byte ile masz LED. Zrobic podprogram przerwania w którym liczona bylalby 1s i w tym podprogramie decrementowac owe zmienne. Po dojsciu do zera wyłaczyc dana diode W programie głowny po wykryci nacisniecia klawisza wystarczy wpisac do zmiennej liczbe np 30s i zapalic diode.
  • #5 7509264
    PabLO-FC
    Poziom 10  
    nie bardzo wiem jak to ma wyglądać, jestem początkujący
  • REKLAMA
  • #6 7509287
    asembler
    Poziom 32  
    W C ci nie pomoge ale masz wytyczoną drogę kombinuj.
  • #7 7510348
    mario06
    Poziom 15  
    
    ...
    PORTA &= 0x01;//zapalenie  LED0 
    ...
    PORTA |= 0x01;//zgaszenie LED0
    ...
    PORTA &= 0x02;//zapalenie  LED1
    ...
    PORTA |= 0x02;//zgaszenie  LED1
    ...
    


    watpie czy takie działanie da poprawne sterowanie diodami nie zależnie czy mają się zapalać 1 czy zerem, działanie dla przykładu pierwsze ustawi najmłodszy bit czyli będziesz miał 0b00000001 po odczekaniu ta wartość zostanie (czyli wnioskuje, że LED zapalają się przy ustawionym 0), i analogicznie jest dla drugiego przycisku
  • REKLAMA
  • #8 7517131
    AdiCorp
    Poziom 10  
    ciężko powiedzieć co tu jest nie tak, proponuje zajrzeć
    Link
    przeczytaj i spróbuj napisać to jeszcze raz :)

    na pewno w ostatnim kursie jest coś co pomoże :)
    pozdro i powodzenia:)
REKLAMA