PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 1 Sek. Verzögerung in Assembler für ATTiny15 ???



popi
19.10.2006, 13:07
Hallo zusammen,

ich bin blutjunger Anfänger auf dem Gebiet der AVR-Programmierung in Assembler.

Deshalb habe ich auch folgendes Problem ;o)

Ich habe ein Prg. (vielen Dank an alle Teilnehmer der Foren) erstellt. Wenn der Komparator nun schaltet, wird dei Interrupt ANA_COMP ($007) gesetzt.
Soweit sogut!

Nun soll die Routine "Delay" das Singal am Port B2 um eine Sek. z.b. verzögern. Es können aber auch 892,5ms sein, es geht hier nicht um genaue Werte.

Da schwierige ist, das Port B2 retriggerbar sein soll.
Also, wenn der Interrupt das "Delay" auslöst und es kommt während der Delayzeit erneut ein Interrupt, dann soll die Zeit neu gestartet werden.

Ein retriggerbares Monoflop also.
Ich habe diese Frage auch in ein weiteres Forum gesetzt, denn ich muss mich langsam mit der Umsetzung des Problems beeilen. Sitze nun bald schon 24 Stunden an dieser einen Sache.

Wäre net, wenn mir bitte jemand helfen könnte.

Danke im Voraus und Grüße

popi



.include "tn15def.inc" ; Definitionsdatei einbinden

rjmp Init
.org $007 ;ana_comp vector adres
rjmp ANA_COMP ;interrupt handler


Init:
ldi r16,0b00001011
nop
nop
out ACSR,r16 ;analogue comp interrupt enable
sei ;global interrupt enable

Main: ldi r16, 0x00 ; 0b11111100 in r16 laden
out PORTB, r16 ; r16 ins IO-Register PORTB ausgeben
;reti
rjmp Main ; Sprung zur Marke "ende" -> Endlosschleife

ANA_COMP:
ldi r16, 0x04 ; 0xFF ins Arbeitsregister r16 laden
out DDRB, r16 ; Inhalt von r16 ins IO-Register DDRB ausgeben
ldi r16, 0x04 ; 0x04 in r16 laden
out PORTB, r16 ; r16 ins IO-Register PORTB ausgeben
ldi r17, 0xff ; r17 auf 255 für Delay setzen
rcall Delay
ldi r16, 0x00 ; 0b11111100 in r16 laden
out PORTB, r16 ; r16 ins IO-Register PORTB ausgeben
reti

Delay:
dec r17 ; Vermindert Inhalt in r17 um 1
brne Delay ; Sprung nur, wenn r17 nun nicht 0 ist.
ret




<pre> pre ist gut gemeint. Im Forum aber bitte "code" (PicNick) </pre>

uwegw
19.10.2006, 16:02
Hast du noch einem Timer frei? Dann könntest du dessem Zählregister im Analog-Int so vorladen, dass er nach eine Sekunde überläuft und seinerseits einen Interrupt auslöst (wo dann der Port gesetzt und der Tiemr gestoppt wird). Und wenn während dieser Sekunde eine neuer Analog-Int reinkommt, wird der Timer wieder neu gestartet und läuft wieder eine Sekunde lang durch...