Stránka 1 z 1
Prerusenie s atmel
Napsal: 28 čer 2008, 14:12
od zawin
Caute, robim program ktory prepina medzi efektami: EFEKT1 az EFEKT3 po prichode prerusenia. Problem je v tom ze to nejak nefunguje. Neviem si s tym rady kde som mohol spravit chybu.
Kód: Vybrat vše
$MODXX51
ORG 0
AJMP INI
ORG 003H
JMP VYBER
EFEKT1: CLR P1.1
CLR P1.0
CALL CAKAJ
SETB P1.1
SETB P1.0
CALL CAKAJ
JMP EFEKT1
EFEKT2: CLR P1.1
CALL CAKAJ
SETB P1.1
CALL CAKAJ
CLR P1.0
CALL CAKAJ
SETB P1.0
CALL CAKAJ
JMP EFEKT2
EFEKT3: CLR P1.1
CALL CAKAJ
SETB P1.1
CALL CAKAJ
CLR P1.1
CALL CAKAJ
SETB P1.1
CALL CAKAJ
CALL CAKAJ
CLR P1.0
CALL CAKAJ
SETB P1.0
CALL CAKAJ
CLR P1.0
CALL CAKAJ
SETB P1.0
CALL CAKAJ
CALL CAKAJ
JMP EFEKT3
INI: SETB IT0
SETB EX0
SETB EA
MOV R4,#1
JMP EFEKT1
VYBER: INC R4
CJNE R4,#1,VYBER2
JMP EFEKT1
VYBER2: CJNE R4,#2,VYBER3
JMP EFEKT2
VYBER3: CJNE R4,#3,VYBER4
JMP EFEKT3
VYBER4: JMP ZNOVA
RETI
ZNOVA: MOV R4,#1
JMP EFEKT1
CAKAJ: DJNZ R1,$
DJNZ R2,$-2
RET
CAKAJ2: MOV R3,#15
DJNZ R1,$
DJNZ R2,$-2
DJNZ R3,$-4
RET
END
Dakujem za rady
Napsal: 28 čer 2008, 16:05
od pivko99
mno, po letmom pohlade na zdrojak si myslim, ze problem je v tom, ze ty pouzivas prerusenie a vtedy treba mat po vykonani prerusenia instrukciu RETI, ty ju tam sice pouzitu mas ale pochybujem, ze k jej vykonaniu niekedy dojde... Potom ti po mnohych preruseniach prepise stack registre R4 atd a potom ti program robi blbiny...
Napsal: 28 čer 2008, 16:43
od caven
jj přesně tak, chybí ti tam návrat z přerušení.. když to otestuješ v tom přerušení tak ti to rovnou skočí na to zobrazování ale nikdy se to přerušení neukončí a nastane chaos v regiistrech

Napsal: 28 čer 2008, 17:13
od zawin
Aha jasne tak tam bude problem ale ako to vyriesit aby to prerusenie preslo az do konca? ked chcem aby to prepinalo medzi tymy efektami?
Napsal: 28 čer 2008, 18:14
od Zirafka
ASM sice nerozumím, ale možná ti poradím.
Přerušení musíš ukončit, jinak začne program bloudit a pak se dějí věci, to už říkali kluci.
No a přerušení se končí na jeho konci, takže můžeš udělat co potřebuješ a pak se vrátíš.
Také se dá v přerušení jen nastavit nějaký příznak a potom v hlavním programu dělat podle toho další akce.
Například:
Start programu
Inicializace procesoru a dalších věcí
DO
if priznak = 1 then EFEKT1
if priznak = 2 then EFEKT2
LOOP
Preruseni
if priznak = 1 then priznak =2
if priznak = 2 then priznak =1
navrat z preruseni
Také je dobré zkontrolovat, jestli jsou přerušení povolená a která. To není podceňování, ale zkušenost...
Snad nepíšu moc zmateně

Napsal: 28 čer 2008, 20:20
od radekrd
Nebo ten rozhodovací blok nedávej do přerušení, ale volej ho v každém tom efektu, času je tam evidentně mraky a v přerušení jenom inkrementuj registr. Možná to není úplně ideální, ale v tomto případě to nevadí.
Napsal: 28 čer 2008, 23:19
od caven
jj mám to taky tak. v přerušení pouze přičteš a otestuješ zda není větší a potom nakonci každého toho efektu zavolám testování a rozhodnutí jaký efekt se právě provede...
žádný zázrak, ale funguje to ...
Napsal: 28 čer 2008, 23:30
od Kado
Upravil som tvoj program do "kultivovanejsej podoby", nehnevaj sa, ale bolo tam vela chybco sa tyka dodrziavania urcitych pravidiel pri pisani programov pre 8051 (zrejme pre AT89C2051, AT89C51, AT89S51 atd)
prikladam upraveny program: podstata je v tom, ze v obsluhe prerusenia od INT0 (zostupa hrana) sa zvysuje hodnota registra r4, pricom sa este porovnava s konstantou #4 (maximum), ak ju dosiahne, tak znova nastavi register na hodnotu #1. V hlavnom slucke sa testuje obsah registra r4 a na zaklade zistenej hodnoty sa vola prislusny podprogram (v tvojom pripade konkretny efekt), po vykonani podprogramu sa dokonci testovanie cely cyklus sa opakuje odznova...
Predpokladam, ze budes pripajat na vyvod INT0 tlacidlo, pricom program nie je osetreny voci zakmitom (pri stlacani tlacidla),
Kód: Vybrat vše
; program pre 8051 "Efekt"
;
$MOD51 ; mod prekladaca
;
cseg ; programovy segment
ORG 0h ;adresa po resete
sjmp start
ORG 003H ; prerusenie od int0
ajmp ext_prerus_0
;
;-----------------------------
org 30h ;
start: SETB IT0
SETB EX0 ; povolenie prerusenia od int0
SETB EA ; povolenie global. prerusenia
MOV R4,#1 ; zacneme prvym efektom
;JMP EFEKT1
;---------------------
; hlavna slucka
main: CJNE R4,#1, VYBER2
acall EFEKT1
VYBER2: CJNE R4,#2, VYBER3
acall EFEKT2
VYBER3: CJNE R4,#3, VYBER4
acall EFEKT3
VYBER4: sjmp main ; a znova na zaciatok
;------------------------
; ---------------------------------
; podprogramy pre jednotlive efekty
;----------------------------------
;efekt 1
EFEKT1: CLR P1.1
CLR P1.0
acall CAKAJ
SETB P1.1
SETB P1.0
acall CAKAJ
ret ; a naspat z podprogramu
;---------------------------
; efekt 2
EFEKT2: CLR P1.1
acall CAKAJ
SETB P1.1
acall CAKAJ
CLR P1.0
acall CAKAJ
SETB P1.0
acall CAKAJ
ret
;---------------------------
; efekt 3
EFEKT3: CLR P1.1
acall CAKAJ
SETB P1.1
acall CAKAJ
CLR P1.1
acall CAKAJ
SETB P1.1
acall CAKAJ
acall CAKAJ
CLR P1.0
acall CAKAJ
SETB P1.0
acall CAKAJ
CLR P1.0
acall CAKAJ
SETB P1.0
acall CAKAJ
acall CAKAJ
ret
;-------------------------------------
;podprogramy oneskorenia
CAKAJ: DJNZ R1,$
DJNZ R2,$
RET
;-------------------------------------
; (tak sa zda, ze ho ani nepouzivas!)
CAKAJ2: MOV R3,#15
DJNZ R1,$
DJNZ R2,$-2
DJNZ R3,$-4
ret
;-------------------------------------
; obsluha prerusenia od int0
;-------------------------------------
;- pri kazdom preruseni sa zvysi hodnota v r4 a ak dosiahne hodnotu #4, tak nastavi prvy efekt r4=1
ext_prerus_0: inc r4 ; dalsi efekt
cjne r4, #4, ext_prerus_0_end
mov r4,#1 ; prvy efekt
ext_prerus_0_end: reti ; a von z obsluhy prerusenia
;------------------------------------
END
Napsal: 29 čer 2008, 08:47
od zawin
Dakujem velmi pekne za vasu pomoc
