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

[ATMEGA16] problem z odczytaniem wlaściwego stanu wejścioweg

lukg 25 Paź 2008 23:35 1113 6
REKLAMA
  • #1 5668087
    lukg
    Poziom 2  
    Witam,

    na wstępie dziękuję wszystkim na forum, wasze posty są nieocenionym źródłem wiadomości. Zajmuję się ponad pół roku hobbystycznie elektroniką. Od pewnego czasu siedzę nad problemem związanym z ATMEGA16. Problem dotyczy odczytywania stanu wejść logicznych na mikrokonrolerze. Docelowo ma być to klawiatura, jednak ponieważ projekt klawiatury na płytce stykowej nie chciał działać cofnąłem się do podstaw. Odczytanie 1 wejścia i ustawienie innego wyjścia w ten sam stan logiczny. Poniżej zamieszczam schemat

    [ATMEGA16] problem z odczytaniem wlaściwego stanu wejścioweg

    Podłączyłem mikrokontroler na kwarc 4MHz. Dioda LED2 ma wyświetlać status wejścia PORTA.0, LED1 jest diodą kontrolną która miga w 2 sekundowym cyklu.

    Kod głównej funkcji main wygląda następująco:
    
    	uint16_t j;
    	uint8_t i;
    
    	//inicjalizacja
    	DDRA  = 0x00;
    	DDRB  = 0xFF;
    	PORTB = 0x00;
    	PORTA = 0x00;
    
    	//pętla główna
    	while (1>0){		
    		//wczytanie i wyświetlenie informacji na wyjściu
    		i = PORTA;
    		//ustawienie wyjścia
    		if ((i & 0x01) == 0x00) PORTB &= ~0x01; else PORTB |= 0x01;
    		//wyłączenie diody LED1
    		PORTB &= ~0x02;
    		//opóźnienie
    		for(j=0;j<1000;j++) _delay_loop_2(1000);
    
    		i = PORTA;
    		if ((i & 0x01) == 0x00) PORTB &= ~0x01; else PORTB |= 0x01;
    		//włączenie diody LED1
    		PORTB |= 0x02;
    		for(j=0;j<1000;j++) _delay_loop_2(1000);
    
    	}
    


    Zaprogramowanie mikrokontrolera powyższym kodem skutkuje miganiem diody kontrolnej. Próby odczytania portu wejściowego i zapalenia diody LED2 na porcie wyjściowym nie powiodły się.

    Nie mogę znaleźć błędu więc jeśli ktoś widzi go lub posiada jakieś sugestie które mi pomogą zlokalizować ten błąd - jestem wdzięczny. Z góry dziękuję za wszelkie odpowiedzi.

    pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 5668127
    ZbeeGin
    Poziom 39  
    Do czytania nie używa się PORTA tylko PINA. Kłania się brak znajomości noty katalogowej w dziale I/O Ports.
  • REKLAMA
  • Pomocny post
    #3 5668152
    mirekk36
    Poziom 42  
    nieźle kolega nakombinował, ale czy nie lepiej tak nawet dla siebie - bardziej przejżyście to zaprogramować?

    #define KEY_PIN 0
    #define KEY (1<<KEY_PIN)
    
    // tu ustalasz sobie do których pinów portu masz 
    // podłączone diody LED - w twoim przypadku 0 i 1
    #define LED1_PIN 0 
    #define LED2_PIN 1
    
    // można sobie zdefiniować dla ułatwienia dalej
    #define LED1 (1<<LED1_PIN)
    #define LED2 (1<<LED2_PIN)
    
    // tu definicje makr także upraszczające później 
    // analizę i pisanie kodu
    #define LED1_ON PORTB |= LED1;
    #define LED1_OFF PORTB &= ~LED1;
    
    #define LED2_ON PORTB |= LED2;
    #define LED2_OFF PORTB &= ~LED2;


    potem na początku main:


    DDRA &= ~KEY;  // ustawiamy pin klawisza jako wejście
    PORTA |= KEY;   // podciągamy pin klawisza do VCC
                           // dzięki temu rezystor zewn. jest zbędny
    
    DDRB |= (LED1|LED2);  // ustawiamy piny z diodami LED
                                        // jako wyjścia
    
    PORTB &= ~(LED1|LED2);  // wyłączamy diody LED
    
    
      while (1)
      {
          // jeśli wciśnięty klawisz to dioda LED1 świeci
          // a gdy nie jest wciśnięty do LED1 zgaszony
          if ( !(PINA&KEY) ) LED1_ON;
          else LED1_OFF;
    
          // gdy klawisz nie jest wciśnięty to dioda LED2 świeci
          // a gdy jest wciśnięty do LED2 jest zgaszona
          if (PINA&KEY) LED2_ON;
          else LED2_OFF;
      }


    dzięki temu masz jakieś tam podstawowe działania bardzo uproszczone z klawiszami. Nie wiem czy taki akurat efekt chciałeś uzyskać - ale zobacz, że warto sobie najpierw dokładnie zdefiniować co jest czym żeby się później nie pogubić w kodzie
  • REKLAMA
  • #4 5668307
    lukg
    Poziom 2  
    No oczywiście .... PIN a nie PORT ..... ale głupi błąd. Właśnie wrzuciłem poprawkę i działa bez zarzutu ... dzięki wielkie.

    Co do kodu, pisałem go szybko w celu przetestowania wczytywania i ustawiania portu wiec nie była to wersja końcowa (a jedynie prototyp). Docelowo do klawiatury chcę zastosować rejestr przesuwający z wyjściem równoległym (74HCT164). Pozwoli mi to ograniczyć liczbę linii mikrokontrolera do 3 (2 jako wejście do rejestru, 1 jako wyjście do kontroli który przycisk został nacisnięty).

    Interesujący pomysł z rezystorem podciągającym dostępnym na wejściu mikrokontrolera :)
  • REKLAMA
  • #5 5668690
    Freddie Chopin
    Specjalista - Mikrokontrolery
    mirekk36 napisał:
    
          if ( !(PINA&KEY) ) LED1_ON;
          else LED1_OFF;
          if (PINA&KEY) LED2_ON;
          else LED2_OFF;
    

    a nie lepiej:

    
    if (PINA&KEY)
    {
    LED1_OFF;
    LED2_ON;
    }
    else
    {
    LED1_ON;
    LED2_OFF;
    }
    


    ?

    4\/3!!
  • #6 5668696
    GrEG0
    Poziom 14  
    Tak na marginesie , to diody LED podlacz do plusa. Stan niski procesora ma wieksza wydajnosc prądową.
REKLAMA