Prerusenie s atmel

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
zawin
Příspěvky: 94
Registrován: 21 črc 2006, 00:00

Prerusenie s atmel

#1 Příspěvek 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
pivko99

#2 Příspěvek 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...
Uživatelský avatar
caven
Příspěvky: 417
Registrován: 15 srp 2006, 00:00

#3 Příspěvek 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 ;)
Uživatelský avatar
zawin
Příspěvky: 94
Registrován: 21 črc 2006, 00:00

#4 Příspěvek 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?
Zirafka
Příspěvky: 819
Registrován: 20 srp 2006, 00:00

#5 Příspěvek 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ě :D
Uživatelský avatar
radekrd
Příspěvky: 642
Registrován: 21 kvě 2008, 00:00
Bydliště: Moravský Krumlov
Kontaktovat uživatele:

#6 Příspěvek 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í.
Uživatelský avatar
caven
Příspěvky: 417
Registrován: 15 srp 2006, 00:00

#7 Příspěvek 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 ...
Uživatelský avatar
Kado
Příspěvky: 44
Registrován: 27 říj 2007, 00:00
Bydliště: PB, SVK

#8 Příspěvek 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
Uživatelský avatar
zawin
Příspěvky: 94
Registrován: 21 črc 2006, 00:00

#9 Příspěvek od zawin »

Dakujem velmi pekne za vasu pomoc :)
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“