PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : interrupt in bascom



pebisoft
02.02.2005, 18:41
hallo, ich möchte in bascom in einer interupt-routine
innerhalb einer zeit von gesamt 0,000064 sec die pins schalten.
0-0,000020sec pind1 und von 0,000021-0,000040sec pind2 und
von 0,000041-0,000064sec pind1.
mfg pebisoft

albundy
02.02.2005, 19:04
64 µs, das kommt mir doch sehr bekannt vor.
Ich hatte es auch schon probiert mit 1 µs Interrupt und dann in der Int - Routine mit "case of" auswählen. Aber das Timing in Bascom wird kaum funktionieren. Versuch es lieber mit ASM.

albundy
03.02.2005, 00:22
Versuch das mal:


$crystal = 8000000
Config Timer0 = Timer , Prescale = 1 , Clear Timer = 1
Timer0 = 8
On Int0 Int0_ovf
Enable Interrupts
Enable Int0

Dim Wert As Byte

Do
Loop

Int0_ovf:
Timer0 = 8
$asm
lds r16,{Wert} '1µs Wert in R16 laden
cpi r16,65 'Wert=65 ?
brne _label0 'nein weiter Label0
clr r16 'sonst Wert=0
_label0:
cpi r16,21
brlo _label1 'wenn kleiner 21 -> label1
brge _label2 'wenn größer oder gleich 21 -> label2
jmp _label3 'sonst label3
_label1:
ldi r17,1
Out Portd , R17 'Portd.1=1
jmp _end
_label2:
ldi r17,2
Out Portd , R17 'Portd.2=1
jmp _end
_label3:
ldi r17,1
Out Portd , R17 'Portd.1=1
_end:
inc r16 'Wert erhöhen
sts {wert},r16 'Wert speichern
$end Asm
Return

albundy
03.02.2005, 00:36
Sorry, das mit Timer0=8 ist natürlich Quatsch.

Config Timer0 = Timer , Prescale = 8 , Clear Timer = 1

So sollte es heißen, für 1µs Timer0 Interrupt.