BlaueLed
27.01.2010, 20:20
Hallo zusammen,
ich habe mich nach mehreren anderen Bascom Projekten an den Interrupts versucht. Leider funktioniert die Sache mit Int0 und Int1 nicht wirklich. Hier erstmal die Aufgabe, welche ich zu lösen versuche:
Ich habe eine Kette. Jedes Kettenglied wird über einen Initiator erkannt ( 24V über Optokoppler 5V ). Diesen Initiator habe ich an Int0 angeschlossen. Wenn ich die Kette laufen lasse, und folgenden Code verwende funktioniert das sehr gut.
$regfile = "m644pdef.dat"
$crystal = 18432000
$baud = 19200
Config Pind.3 = Input
Config Pind.2 = Input
Pind.3 = 1
Pind.2 = 1
Config Int0 = Rising
On Int0 Takt
Enable Int0
Dim takter as Word
Main:
nop
goto main
Takt:
incr takter
print takter
return
Bei jedem Kettenglied wird die Variable Takter hochgezählt. Ich bekomme dies auch im Terminal angezeigt. An Int1 habe ich einen weiteren Initiator angeschlossen. Dieser erkennt die Kettenglieder, an denen ein weiteres Stück Metall angebracht ist ( Referenzkettengliederkennung ). Den Signalverlauf habe ich angehängt. Zuerst kommt das Signal an Int1. Kurze Zeit danach kommt Int0. Die Signale fallen in umgekehrter Reihenfolge wieder ab. Zuerst Int0 = 0 dann kurze Zeit danan Int1 = 0.
Bei folgendem Code wird Int1 sporadisch auch 2x ausgelöst:
$regfile = "m644pdef.dat"
$crystal = 18432000
$baud = 19200
Config Pind.3 = Input
Config Pind.2 = Input
Pind.3 = 1
Pind.2 = 1
Config Int0 = Rising
On Int0 Takt
Enable Int0
Config Int1 = Rising
On Int1 Referenz
Enable Int1
Enable Interrupts
Dim Takter As Word
Dim referenz as Word
Print "Booting"
Do
nop
Loop
Takt:
Incr takter
Return
Referenz:
If Pind.3 = 1 Then
print "referenz erkannt"
End If
Return
Ein Hardwareproblem schließe ich vorerst aus, da die Signale über Hutschienen Optokoppler getrennt sind. Mir kommt es so vor, als würde Int1 prellen. Es wäre nett, wenn Ihr mal über den Code schauen könntet, ob der Fehler im Programm zu finden ist.
Danke und Gruß
BlaueLed
ich habe mich nach mehreren anderen Bascom Projekten an den Interrupts versucht. Leider funktioniert die Sache mit Int0 und Int1 nicht wirklich. Hier erstmal die Aufgabe, welche ich zu lösen versuche:
Ich habe eine Kette. Jedes Kettenglied wird über einen Initiator erkannt ( 24V über Optokoppler 5V ). Diesen Initiator habe ich an Int0 angeschlossen. Wenn ich die Kette laufen lasse, und folgenden Code verwende funktioniert das sehr gut.
$regfile = "m644pdef.dat"
$crystal = 18432000
$baud = 19200
Config Pind.3 = Input
Config Pind.2 = Input
Pind.3 = 1
Pind.2 = 1
Config Int0 = Rising
On Int0 Takt
Enable Int0
Dim takter as Word
Main:
nop
goto main
Takt:
incr takter
print takter
return
Bei jedem Kettenglied wird die Variable Takter hochgezählt. Ich bekomme dies auch im Terminal angezeigt. An Int1 habe ich einen weiteren Initiator angeschlossen. Dieser erkennt die Kettenglieder, an denen ein weiteres Stück Metall angebracht ist ( Referenzkettengliederkennung ). Den Signalverlauf habe ich angehängt. Zuerst kommt das Signal an Int1. Kurze Zeit danach kommt Int0. Die Signale fallen in umgekehrter Reihenfolge wieder ab. Zuerst Int0 = 0 dann kurze Zeit danan Int1 = 0.
Bei folgendem Code wird Int1 sporadisch auch 2x ausgelöst:
$regfile = "m644pdef.dat"
$crystal = 18432000
$baud = 19200
Config Pind.3 = Input
Config Pind.2 = Input
Pind.3 = 1
Pind.2 = 1
Config Int0 = Rising
On Int0 Takt
Enable Int0
Config Int1 = Rising
On Int1 Referenz
Enable Int1
Enable Interrupts
Dim Takter As Word
Dim referenz as Word
Print "Booting"
Do
nop
Loop
Takt:
Incr takter
Return
Referenz:
If Pind.3 = 1 Then
print "referenz erkannt"
End If
Return
Ein Hardwareproblem schließe ich vorerst aus, da die Signale über Hutschienen Optokoppler getrennt sind. Mir kommt es so vor, als würde Int1 prellen. Es wäre nett, wenn Ihr mal über den Code schauen könntet, ob der Fehler im Programm zu finden ist.
Danke und Gruß
BlaueLed