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, 02: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, 02: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, 02: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, 02: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, 02: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, 02: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, 02: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, 02: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ů“