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

[ATmega169P]Potencjometr impulsowy i przerwania

kasprzak 28 Sty 2011 19:40 2439 12
REKLAMA
  • #1 9070388
    kasprzak
    Poziom 10  
    Witam,
    Muszę zaimplementować obsługę obrotowego potencjometru impulsowego, dokładnie takiego w oparcu o uC ATmega169P (Datasheet).

    Generalnie zasada jest prosta. Przy obrocie zwiera jeden z dwóch pinów (w zależności od kierunku)do masy. Wejście uC jest w stanie wysokim (+5V). Za pomocą przerwania mam obsłużyć to przerwanie. Na razie chcę zaimplementować samą akcję na wykrycie tego przerwania (albo jeżeli ma ktoś pomysł na rozwiązanie wykrycia kierunku obrotu to miło by było podzielić się)

    Napisałem kod jednak bez rezultatów i nie mam pojęcia co jeszcze należy ustawić.
    Spotkał się ktoś z podobnym problemem lub posiada wiedzę jak go rozwiązać?
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <stdlib.h>
    #include <stdio.h>	
    #include <avr/interrupt.h>
    #define F_OSC 16000000
    
    void led3(int l){
    	if(l){
    		PORTD=PORTD & 0x7F;//zapala LED3
    	}else{ 
    		PORTD=PORTD | 0x80;//gasi LED3
    	}
    	_delay_ms(500);	
    }
    
    ISR(PCINT0_vect){
    led3(1);
    }
    
    
    int main(){
    	DDRD=0xFF;
    	DDRE=0x00;
    
    	cli();
    	EIMSK |= (1<<PCIE0);
    	PCMSK0 |= (1<<PCINT7); 
    	PCMSK0 |= (1<<PCINT6);
    	
    	sei();
    
    	while(1){
    	led3(0);
    	_delay_ms(500);
    	}
    }
    

    *pod portem D są diody, a pod E potencjometr (2 piny). Testowo piny portu D są jako wyjście a E na wejście - nie ma to znaczenia tutaj.
  • REKLAMA
  • #2 9070844
    asembler
    Poziom 32  
    Poszukaj pod hasłem impulsator.
  • REKLAMA
  • #3 9070884
    janbernat
    Poziom 38  
    Nie, to chyba nie impulsator.
    Mi brakuje podciągania- PORTE=0x255.
    Oczywiście jak są dodatkowe oporniki to nie musi być.
    W linku jest układ styków- 1 i 4 do masy a 2 i 3 do procesora.
    Jak nie ma podciągania albo dodatkowych oporników to będzie stale 0.
  • #4 9070975
    kasprzak
    Poziom 10  
    Tylko wpinając się woltomierzem mam na 2 i 3 styku po +5V, a w momencie przekręcenia widać zwarcie do masy na chwilę kiedy przekręcam. Także chyba w podciąganiu nie będzie to problem, a z konfiguracją przerwania.
  • REKLAMA
  • #5 9071105
    janbernat
    Poziom 38  
    W ogóle to w funkcji led() nie widać czy wpisujesz 1(jeden) czy l(el).
    Nazwałbyś to trochę bardziej po ludzku.
    Poza tym z przerwania wywołujesz funkcję w której jest _delay().
    To bardzo brzydko.
    Ostatecznie zostaw _delay() tylko w main()- ale to i tak niedobrze.
    W czasie 500ms ten potencjometr może podać trochę impulsów które zginą.
    P.S.
    Może przy ustawianiu PCINT podciąganie jest włączane.
    Inaczej nie potrafię znaleźć powodu dla którego na wejściu procesora jest 5V.
  • #6 9071678
    asembler
    Poziom 32  
    janbernat napisał:
    Nie, to chyba nie impulsator.
    Mi brakuje podciągania- PORTE=0x255.
    Oczywiście jak są dodatkowe oporniki to nie musi być.
    W linku jest układ styków- 1 i 4 do masy a 2 i 3 do procesora.
    Jak nie ma podciągania albo dodatkowych oporników to będzie stale 0.


    A pod słowem "tutaj" w pierwszym poscie wyświetla sie strona TME Impulsator.
    To co w takim razie to jest skor impulsator nie jest impulsatorem?
  • #7 9071847
    janbernat
    Poziom 38  
    A co sie będę spierał.
    Nie mam tego ustrojstwa to i nie sprawdzę.
    ctr w tme jest podany jako producent potencjometrów.
    A to że można zrobić impulsowy na mikroprzełącznikach- to może zrobili.
    Normalny impulsator ma trzy końcówki- a ten ma cztery.
    A w opisie styków podane jest że jak kręci się w lewo to podaje impulsy na jedną końcówkę- a jak w prawo to na drugą.
    Ale jak napisałem- nie mam i nie sprawdzę.
  • #8 9073512
    kasprzak
    Poziom 10  
    janbernat napisał:
    ...A w opisie styków podane jest że jak kręci się w lewo to podaje impulsy na jedną końcówkę- a jak w prawo to na drugą...

    Dokładnie. Połączone jest tak, że 1 i 4 idą do GND, 2 i 3 do mikrokontrolera
    [ATmega169P]Potencjometr impulsowy i przerwania
    Wstawić 10k podciągnięte do +5V dodatkowo?
  • REKLAMA
  • #9 9073731
    janbernat
    Poziom 38  
    Ja bym wstawił- żeby mieć pewność że te +5V to nie są zakłócenia.
    I jeszcze kondensatory 10-47nF od 2-3 do masy.
  • #10 9074441
    piotrva
    VIP Zasłużony dla elektroda
    dodatkowo podpiął bym to przez najzwyklejsze diody do INT0 i w przerwaniu obsługiwać wykrywanie zwartego pinu.
    albo lepiej, skoro masz procesor z PCINT to wykorzystaj dwa piny PCINT i odpowiednia obsługa programowa. dokładając timer możesz z grubsza mierzyć czas impulsu żeby eliminować drgania styków
  • #11 9074743
    kasprzak
    Poziom 10  
    INT0 mam zajęte przez układ odbioru podczerwieni (TSOP). Muszę działać na wymienonycc portach E (PCINT6/PE6 i PCINT7/PE7).

    O tą odpowiednią obsługę programową pytam, bo czegoś widocznie zapominam skoro kod podany w pierwszym poście nie działa.
  • #12 9077988
    janbernat
    Poziom 38  
    Może spróbuj zadeklarować int l jako volatile.
    Ostatecznie zmieniasz to i w przerwaniu i w funkcji.
  • #13 9362692
    kasprzak
    Poziom 10  
    Pomogło podpięcie rezystora podciągającego.
REKLAMA