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.
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!
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!