PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Interrupts



tranh85bo
20.05.2008, 22:04
Hallo ,
Ich bin Anfänger in Bascom.
Ich habe ein RNcontrol v1.4 mit dem Chip ATmega32.
Ich beschäftige mich mit Servomotor und PMW Signal.
Mein Problem war:
Ich will meinen Motor nach 50 Pülse bleibenstehen.
Unten ist der Code

$programmer = 13
$crystal = 16000000
$baud = 9600
$regfile = "m32def.dat"
Config Int0 = Falling
Dim Zaehlerirq0 As Integer
Zaehlerirq0 = 0
Enable Interrupts
Enable Int0
On Int0 Irq0
Config Timer1 = Pwm , Pwm = 8 , Compare B Pwm = Clear Down
Pwm1b = 0
Tccr1b = Tccr1b Or &H02
Config Pinc.6 = Output
Config Pinc.7 = Output
Config Pind.4 = Output
Portc.6 = 0
Portc.7 = 0
'Hauptprogramm
Do
Portc.6 = 1
Portc.7 = 0
Portd.4 = 1
Pwm1b = 80
Print Zaehlerirq0
Waitms 500
Loop Until Zaehlerirq0 > 50
End
Irq0:
Incr Zaehlerirq0
Return
Der Motor läuft ewig.Ausserdem hab ich in Terminalemulator erkannt ,dass
die Zaehlerirq0 zählt nicht.
Was habe ich falsch gemacht?
Könntet ihr mir helfen?
Vielen Dank!
MFG.

Jaecko
21.05.2008, 07:13
So wie ich das seh, wird in IRQ0 der Zähler erhöht. Wenn der Zähler 50 überschreitet... was passiert dann? Das Programm wird nur beendet, aber PWM-technisch verändert sich da nichts. Ein END ist im Prinzip eine leere Do-Loop-Schleife.
Da müsste also zwischen Loop und End noch irgendwas rein, um den Motor abzuschalten (z.B. PWM1B = 0 oder 255, je nach Auslegung)

Warum aber IRQ0 nicht zählt, seh ich gerade auch nicht. Evtl kommen keine richtigen Pulse an. Versuch mal, die Interrupts/INT0 erst nach dem On Int zu enablen.

tranh85bo
27.05.2008, 10:51
Hi ,ich hab versucht .
Hier unter nochmals neue code.(Wie du meinst)

$programmer = 13
$crystal = 16000000
$baud = 9600
$regfile = "m32def.dat"
Config Int0 = Falling
Dim Zaehlerirq0 As Long
Zaehlerirq0 = 0
Enable Interrupts
On Int0 Irq0
Enable Int0
Config Timer1 = Pwm , Pwm = 8 , Compare B Pwm = Clear Down
Pwm1b = 0
Tccr1b = Tccr1b Or &H02
Config Pinc.6 = Output
Config Pinc.7 = Output
Config Pind.4 = Output
'Hauptprogramm
Do
Portc.6 = 1
Portc.7 = 0
Portd.4 = 1
Pwm1b = 80
Print Zaehlerirq0
Waitms 500
Loop Until Zaehlerirq0 > 500
Portc.6 = 0
Portc.7 = 0
Pwm1b = 0
End
Irq0:
Incr Zaehlerirq0
Return
Aber der Motor läuf ohne Ende und in Terminal emulator bekomme ich nur 0.
MFG