Zaslal: so červen 28 2008, 13:12 Předmět: Prerusenie s atmel
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.
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...
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
Založen: May 21, 2008 Příspěvky: 642 Bydliště: Moravský Krumlov
Zaslal: so červen 28 2008, 19:20 Předmět:
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í.
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...
Založen: Oct 27, 2007 Příspěvky: 44 Bydliště: PB, SVK
Zaslal: so červen 28 2008, 22:30 Předmět:
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:
; 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
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.