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

[Attiny2313][Asm] Brak reakcji na zmiane stanu wejscia

Lukaszek_69 28 Mar 2010 20:11 1375 4
REKLAMA
  • #1 7891944
    Lukaszek_69
    Poziom 13  
    Witam!
    Mam dziwny problem i od paru godzin nie mogę znaleźć jego przyczyny. Mianowicie nie wiem dlaczego kontroler nie reaguje na zmianę stanu na wejściu PD2. Mam tam podpięty przycisk który ma włączać diodę podpiętą do PD6. Układ działa na 100% pod względem technicznym, ponieważ sprawdziłem go innym programem. Czuję że przyczyna jest gdzieś w napisanym przeze mnie dla niego kodzie ale nie mam pojęcia gdzie tkwi błąd. Dla pewności podaje cały kod, lecz interesuje mnie tylko wywołanie procedury LED z pętli głównej.

    
    .include "tn2313def.inc"
    
    ;-----definicje---------------------------------------------------
    .def tmp = r16
    .def tmp2 = r17
    .def tmp3 = r18
    .def licznik0 = r19
    .def licznik1 = r20
    
    .equ tablica = 0x0060
    
    .equ zero = 0x20
    .equ jeden = 0x73
    .equ dwa = 0x44
    .equ trzy = 0x41
    .equ cztery = 0x13
    .equ piec = 0x09
    .equ szesc = 0x08
    .equ siedem = 0x63
    .equ osiem = 0x00
    .equ dziewiec = 0x01 
    
    
    
    ;-----wektory przerwan-------------------------------------------
    
    .cseg
    .org 0x00
    rjmp reset
    .org 0x02
    rjmp int_1
    .org 0x04
    rjmp timer1_compA
    .org 0x0D
    rjmp timer0_compA
    
    
    ;-----program glowny---------------------------------------------
    
    reset:
    
    	ldi tmp, 0x72
    	out DDRD, tmp
    	ldi tmp, 0xFF
    	out DDRB, tmp		;konfiguracja PORTB i PORTD
    	
    	ldi tmp, RAMEND
    	out SPL, tmp		;ustawienie stosu
    
    	ldi tmp,0x80		;wlaczenie przerwania INT1 + konfiguracja
    	out GIMSK, tmp
    	ldi tmp, 0x08
    	out MCUCR, tmp
    
    	ldi tmp, 0x0B
    	out TCCR1B, tmp		;preskaler 64 + CTC dla timera 1
    
    	ldi tmp, 0x02		;tryb CTC dla timera 0
    	out TCCR0A, tmp
    	ldi tmp, 0x05
    	out TCCR0B, tmp		;preskaler 1024 dla timera 0
    
    	ldi tmp, 0x41
    	out TIMSK, tmp		;wlaczenie przerwania compA dla timera 1 
    						;wlaczenie przerwania compA dla timera 0 
    
    	ldi tmp, 0x3D
    	out OCR1AH, tmp
    	ldi tmp, 0x09
    	out OCR1AL, tmp		;comp1A = 15625
    
    	ldi tmp, 0x07
    	out OCR0A, tmp		;comp0A = 7 co daje 122Hz
    
    	rcall init			;ustawienia wartosci poczatkowych
    
    	sei
    
    end:
    
    	sbis PIND, 2
            rcall LED
    
       	rjmp end
    
    ;-------przerwania-------------------------------------------
    
    timer1_compA:				;przerwanie obslugujace czas
    	inc licznik0
    	ld tmp, X+
    
    	cpi licznik0, 0x0A
    	brne pomin_jednosci		;wykonaj jesli jednosci == 10
    	clr licznik0
    	ldi XH, high(tablica)
    	ldi XL, low(tablica)
    	inc licznik1
    	ld tmp, Y+
    
    	cpi licznik1, 0x0A
    	brne pomin_dziesiatki	;wykonaj jesli dziesiatki == 10
    	clr licznik1
    	ldi YH, high(tablica)
    	ldi YL, low(tablica)
    
    	pomin_dziesiatki:
    	pomin_jednosci:
    
    	reti
    
    timer0_compA:				;przerwanie obslugujace multipleksacje
    
    	in tmp, PORTD			;zmiana wyswietlacza
    	ldi tmp2, 0x30
    	eor tmp,tmp2
    	out PORTD, tmp
    
    	ld tmp2, X				;liczba dla wyswietlacza jednosci
    	ld tmp3, Y				;liczba dla wyswietlacza dziesiatek
    
    	sbic PORTD, 4			;wystawienie jednosci
    	out PORTB, tmp3
    
    	sbic PORTD, 5			;wystawienie dziesiatek
    	out PORTB, tmp2
    	
    	reti
    
    int_1:						;zerowanie licznika
    	ldi XH, high(tablica)
    	ldi XL, low(tablica)
    	ldi YH, high(tablica)
    	ldi YL, low(tablica)
    	clr licznik0
    	clr licznik1
    	ldi tmp, 0x00
    	out TCNT1H, tmp
    	out TCNT1L, tmp
    
    	reti
    
    ;---------procedury------------------------------------------------
    
    LED:						;wlaczenie/wylaczenie diody
    	rcall opoznienie_ok_8ms
    	ldi tmp, 0x40
    	in tmp2, PORTD
    	eor tmp, tmp2
    	out PORTD, tmp
    	ret
    
    init:					
    	ldi XH, high(tablica)	;inicjalizacja wskaznika X
    	ldi XL, low(tablica)
    	ldi tmp, zero			;inicjalizacja tablicy
    	st X+, tmp
    	ldi tmp,jeden
    	st X+, tmp
    	ldi tmp, dwa
    	st X+, tmp
    	ldi tmp, trzy
    	st X+, tmp
    	ldi tmp,cztery
    	st X+, tmp
    	ldi tmp, piec
    	st X+, tmp
    	ldi tmp, szesc
    	st X+, tmp
    	ldi tmp,siedem
    	st X+, tmp
    	ldi tmp, osiem
    	st X+, tmp
    	ldi tmp, dziewiec
    	st X+, tmp
    	ldi XH, high(tablica)
    	ldi XL, low(tablica)
    
    	ldi YH, high(tablica)	;inicjalizacja wskaznika Y
    	ldi YL, low(tablica)
    
    	ldi licznik0, 0x00		;inicjalizacja licznikow
    	ldi licznik1, 0x00
    
    	ldi tmp, 0x1F			;wstepna inicjalizacja portu
    	out PORTD, tmp
    
    	ret
    
    opoznienie_ok_8ms:
    	clr tmp
    	skok_poczatek_8ms:
    	inc tmp
    	rcall opoznienie_ok_1ms
    	cpi tmp, 0x08 
    	brne skok_poczatek_8ms
    	ret
    
    opoznienie_ok_1ms:
    	clr tmp2
    	skok_poczatek_1ms:
    	inc tmp2
    	nop
    	nop
    	cpi tmp2, 0xC8
    	brne skok_poczatek_1ms
    	ret
    	
    


    Wiem że takie wywołanie nie zadziała dobrze(jeszcze niedopracowane) ale chodzi mi o sam fakt żeby dioda chociaż zamigała się. Dodam że teraz dioda zapala się i gaśnie co jakieś 15-30sek(różnie) i także nie wiem czym to może być spowodowane.

    Reszta programu działa bez zarzutu ale tak jak pisałem wcześniej może gdzieś tam tkwi mój problem dlatego wklejam cały kod.

    Z góry dziękuję za pomoc! Pozdrawiam!
  • REKLAMA
  • #2 7958021
    tdx110
    Poziom 18  
    Jeśli miałbym pomóc to musiał bym zobaczyć schemat. Jak jest połączony PORTD,2.
    Z kolei znalazłem kilka błędów.
    Stany wejścia sprawdza się za pomocą PIND,2
    Z tego co wiem taka konfiguracja działała.
    Ustawiałem także DDRD,2 w stan 0 (cbi DDRD,2)(ustawia iż pracuje wtedy jako wejście).
    Dodaj potem jeszcze PORTD,2 w stan 1 (sbi PORTD,2) (ustawi w sumie z taką kombinacją PORTD,2 na wejście w stanie wysokiej impedancji).
  • REKLAMA
  • #3 7960178
    Lukaszek_69
    Poziom 13  
    Nie sądziłem, że jeszcze ktoś się tym zainteresuje, ale tak czy inaczej rozwiązania problemu nie znalazłem. Może trzeba będzie kupić nowy uP i sprawdzić czy ten nie jest czasem w jakiś dziwny sposób uszkodzony...

    Co do połączenia i ogólnie wykonania jestem przekonany praktycznie w 100% że jest ok. Inne programy działają bez zarzutu. Puki co mogę zamieścić zdjęcia układu a jeśli już ktoś naprawdę będzie potrzebował schemat to taki zrobię.

    [Attiny2313][Asm] Brak reakcji na zmiane stanu wejscia [Attiny2313][Asm] Brak reakcji na zmiane stanu wejscia [Attiny2313][Asm] Brak reakcji na zmiane stanu wejscia

    Jeśli chodzi o ustawianie bitów to przecież mam dobrze ustawione(tak mi się wydaje). Innym sposobem ale jest ok. Zresztą debugując nie widziałem żeby były ustawione błędnie. Dlaczego kolega uważa że mój zapis jest błędny?

    Może dodam co udało mi się jeszcze ustalić dodatkowo.
    Zauważyłem że dioda zapala się lub gaśnie gdy na wyświetlaczu pojawia się siódemka, ale ale także z pewnym wyjątkiem:
    [Attiny2313][Asm] Brak reakcji na zmiane stanu wejscia
    gdzie: + dioda się zapala
    - dioda gaśnie
    Niestety nie udało mi się tego rozpracować do końca.
    Mam nadzieje że ktoś jeszcze wpadnie na pomysł co może być nie tak.

    Mile widziane ewentualne dodatkowe sugestie i uwagi.
  • REKLAMA
  • #4 7961144
    OlekM
    Poziom 17  
    Ja zauważyłem taki problem:

    sterując diodą, umieszczasz dane w tmp i tmp2. Z tych samych rejestrów korzystają procedury obsługi przerwania. Jeśli w trakcie wykonywania podprogramu LED zdarzy się przerwanie, to zmieni ono wartości tych rejestrów i kolejne operacje będą wykonane na "popsutych wartościach".

    Widzę trzy drogi ominięcia tego problemu:
    1. umieścić zmienne w innych rejestrach, niż te na których działają przerwania
    2. zapisywać na początku przerwania część rejestrów na stos i później je przywracać
    3. wyłączać przerwania na czas wykonania procedury LED (to najgorszy pomysł)

    Jeszcze inna sprawa. Jeśli nacisnę wspomniany przycisk to (wedle nazw w kodzie) dioda powinna zmieniać stan co około 8 ms - czyli ponad 100 razy na sekundę, raczej nie dostrzeżemy więc jej migania :-)
  • #5 7961461
    Lukaszek_69
    Poziom 13  
    Coś czuje że to chyba będzie to. Ciekawa lekcja na przyszłość, nie wpadłem na to. Dziś już nie mam czasu ale jutro powinienem chwile znaleźć żeby to przetestować i powiadomię o efektach.
    Co do tego że dioda będzie migać bardzo szybko to nie miało dla mnie puki co znaczenia znaczenia. Rozwiązanie tego problemu miałem już opracowane tak że jest to tylko kwestią dodania kodu.
REKLAMA