Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst] debounce und inputbin laufen nicht zusammen ???
Hallo,
Ich habe ein funktionierendes Programm(Platine 1), wo ich in der Hauptschleife meine Taster per Debounce abfrage.
Das läuft auch alles.
Jetzt schicke ich von einem anderen AVR(Platine 2)eine Variable über Printbin und empfange die auf Platine 1 mit Inputbin.
Auch das läuft gut und ich kann die veränderte Variable wieder an Platine 2 schicken.
Wenn ich aber nun die Debounce Befehle und Inputbin in meiner Platine 1 beide zusammen in die Hauptschleife einbinde, dann laufen alle debounce Befehle nicht mehr. Die Verbindung über Printbin/Inputbin läuft aber
Woran kann das liegen ???
Gruß
Papsi
Habe da noch was rausgefunden:
In meiner Hauptschleife der Platine 1 sieht es ungefähr so aus:
...
Start:
Do
Toggle Led1 ' Testweise
Inputbin #1 , A
If A = 10 Then Goto XYZ
...
mehrere Debounche Abfragen
...
mehrere If then Abfragen
Loop
...
XYZ:
Mache was
Goto Start
Wenn ich das Programm starte, dann wird die Led1 auch eingeschaltet und dann bleibt der bei Inputbin stehen und wartet, bis da was kommt.
Der soll aber weiterlaufen in seiner Hauptschleife und das macht er nicht.
Wenn ich jetzt was sende und mittels Inputbin was empfangen hat, dann springt er zu XYZ und danach wieder zu Start, dann wird die Led1 getogglet und dann bleibt der wieder bei Inputbin stehen.
Wie kann ich das ändern, das der dort nicht stehen bleibt ???
Gruß
Papsi
PS
www.ab-ins-bett.de :-b
python_rocks
23.01.2008, 08:05
Der soll aber weiterlaufen in seiner Hauptschleife und das macht er nicht.
Hallo Papsi!
Prüfe vorher mit ISCHARWAITING ob ein Zeichen anliegt. Wenn nicht, dann führst du INPUTBIN nicht aus. So wird die Schleife nicht unterbrochen.
mfg
Gerold
:-)
Kannst Du mir mit einem Codeschnippsel mal weiterhelfen ?
Bekomme es irgendwie nicht hin...
python_rocks
23.01.2008, 12:16
Hall Papsi!
http://avrhelp.mcselec.com/index.html?ischarwaiting.htm
Statt WAITKEY kannst du dein INPUTBIN verwenden. Und bei ISCHARWAITING musst du als Parameter ``#1`` übergeben.
mfg
Gerold
:)
python_rocks
23.01.2008, 14:47
Hallo Papsi!
Mehr Beispiele und Erklärungen findest du hier:
http://avrhelp.mcselec.com/index.html?uart.htm
mfg
Gerold
:-)
Hallo,
ich habe jetzt fast 2 Tage probiert - aber - es will einfach nicht so laufen wie ich will.
Kann man das nicht noch anders lösen?
Ich habe jetzt so viele Varianten probiert und mal gehen zum Anfang nur die Debounce und dann einmal die Inputbin und danach dann wieder die Debounce nicht.
Komme nicht weiter...
???
python_rocks
26.01.2008, 19:46
Hallo Papsi!
Zeige mal deinen Testcode den du schon hast. Nicht nur einen Ausschnitt davon.
mfg
Gerold
:-)
Hallo,
stelle doch mal dein Programm ein, dann ist es viel einfacher, dir zu helfen.
Deine Aufgabe ist etwas umfangreich, als das dir einer das ganze Programm schreibt.
Wenn du beim Senden mit einem bestimmten Zeichen endest, welches sonst nicht vorkommt, dann kannst du dir den Empfang dieses Zeichens auch über einen Interrupt anzeigen lassen (CONFIG SERIALIN BYTEMATCH). Dann ist die Auswertung sehr simpel. Geht aber meistens nur, wenn du Strings sendest, weil dann die ASCII Zeichen unter 32 normalerweise nicht vorkommen.
Ohne Ende-Zeichen hast du auch das Problem zu erkennen, wann Schluss ist mit der Übertragung, oder schickst du immer eine feste Anzahl Bytes?
Gruß
Rolf
Hallo,
Soll ich wirklich den ganzen Code posten?
Sind fast 700 Programmzeilen.
(Habe einen Teil gelöscht, da ich über die Max Zeichengröße des Betrages gekommen bin.)
Hier die Empfängerplatine:
$regfile = "m16def.dat"
$crystal = 8000000
Config Porta = Input
Config Portb = Input
Config Portc = Output
Config Portd = Input
Dim Timer As Word
Timer = 55800
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
On Timer1 Sekundentakt
Enable Interrupts
Timer1 = Timer
Tasterx1hoch Alias Pina.6
Tasterx1runter Alias Pina.5
Tasterx2hoch Alias Pina.2
Tasterx2runter Alias Pina.1
Tasterx3hoch Alias Pind.5
Tasterx3runter Alias Pind.4
Tasterx4hoch Alias Pind.1
Tasterx4runter Alias Pind.0
Tasteralleshoch Alias Pind.7
Tasterallesrunter Alias Pina.7
Relaisx1hoch Alias Portc.4
Relaisx1runter Alias Portc.3
Relaisx2hoch Alias Portc.5
Relaisx2runter Alias Portc.2
Relaisx3hoch Alias Portc.6
Relaisx3runter Alias Portc.1
Relaisx4hoch Alias Portc.7
Relaisx4runter Alias Portc.0
Eingang1 Alias Pinb.0
Eingang2 Alias Pinb.1
Eingang3 Alias Pinb.2
Eingang4 Alias Pinb.3
Eingang5 Alias Pinb.4
Eingang6 Alias Pinb.5
Eingang7 Alias Pinb.6
Eingang8 Alias Pinb.7
Dim X1hoch As Word
Dim X2hoch As Word
Dim X3hoch As Word
Dim X4hoch As Word
Dim X11hoch As Word
Dim X21hoch As Word
Dim X31hoch As Word
Dim X41hoch As Word
Dim X13hoch As Bit
Dim X23hoch As Bit
Dim X33hoch As Bit
Dim X43hoch As Bit
Dim X13runter As Bit
Dim X23runter As Bit
Dim X33runter As Bit
Dim X43runter As Bit
Dim X1runter As Word
Dim X2runter As Word
Dim X3runter As Word
Dim X4runter As Word
Dim X11runter As Word
Dim X21runter As Word
Dim X31runter As Word
Dim X41runter As Word
Dim Zeitx1hoch As Byte
Dim Zeitx1runter As Byte
Dim Zeitx2hoch As Byte
Dim Zeitx2runter As Byte
Dim Zeitx3hoch As Byte
Dim Zeitx3runter As Byte
Dim Zeitx4hoch As Byte
Dim Zeitx4runter As Byte
Dim Alleshoch As Bit
Dim Allesrunter As Bit
Dim X1ganzhoch As Bit
Dim X1ganzrunter As Bit
Dim X2ganzhoch As Bit
Dim X2ganzrunter As Bit
Dim X3ganzhoch As Bit
Dim X3ganzrunter As Bit
Dim X4ganzhoch As Bit
Dim X4ganzrunter As Bit
Dim A As Byte
Relaisx1hoch = 0 'Relais X1 hoch aus
Relaisx1runter = 0 'Relais X1 runter aus
Relaisx2hoch = 0 'Relais X2 hoch aus
Relaisx2runter = 0 'Relais X2 runter aus
Relaisx3hoch = 0 'Relais X3 hoch aus
Relaisx3runter = 0 'Relais X3 runter aus
Relaisx4hoch = 0 'Relais X4 hoch aus
Relaisx4runter = 0 'Relais X4 runter aus
Zeitx1hoch = 10 'wielange soll X1 hoch an bleiben
Zeitx1runter = 10 'wielange soll X1 runter an bleiben
Zeitx2hoch = 10 'wielange soll X2 hoch an bleiben
Zeitx2runter = 10 'wielange soll X2 runter an bleiben
Zeitx3hoch = 10 'wielange soll X3 hoch an bleiben
Zeitx3runter = 10 'wielange soll X3 runter an bleiben
Zeitx4hoch = 10 'wielange soll X4 hoch an bleiben
Zeitx4runter = 10 'wielange soll X4 runter an bleiben
X1hoch = 2
X2hoch = 2
X3hoch = 2
X4hoch = 2
X11hoch = 1
X21hoch = 1
X31hoch = 1
X41hoch = 1
X13hoch = 0
X23hoch = 0
X33hoch = 0
X43hoch = 0
X1runter = 2
X2runter = 2
X3runter = 2
X4runter = 2
X11runter = 1
X21runter = 1
X31runter = 1
X41runter = 1
X13runter = 0
X23runter = 0
X33runter = 0
X43runter = 0
Alleshoch = 0
Allesrunter = 0
X1ganzhoch = 0
X1ganzrunter = 0
X2ganzhoch = 0
X2ganzrunter = 0
X3ganzhoch = 0
X3ganzrunter = 0
X4ganzhoch = 0
X4ganzrunter = 0
'-------------------------------------------------------------------------------
' S T A R T H A U P T P R O G R A M M
'-------------------------------------------------------------------------------
Start:
Do
'-------------------------------
' I N P U T B I N T E S T
'-------------------------------
Toggle Led1 ' Testweise
Inputbin #1 , A
If A = 10 Then Goto XYZ
If Relaisx1hoch = 0 And Relaisx2hoch = 0 And Relaisx3hoch = 0 And Relaisx4hoch = 0 Then
Alleshoch = 0
X13hoch = 0
X23hoch = 0
X33hoch = 0
X43hoch = 0
End If
If Relaisx1runter = 0 And Relaisx2runter = 0 And Relaisx3runter = 0 And Relaisx4runter = 0 Then
Allesrunter = 0
X13runter = 0
X23runter = 0
X33runter = 0
X43runter = 0
End If
Debounce Tasterx1hoch , 0 , X1hoch , Sub 'Tasterabfrage
Debounce Tasterx1runter , 0 , X1runter , Sub
Debounce Tasterx2hoch , 0 , X2hoch , Sub
Debounce Tasterx2runter , 0 , X2runter , Sub
Debounce Tasterx3hoch , 0 , X3hoch , Sub
Debounce Tasterx3runter , 0 , X3runter , Sub
Debounce Tasterx4hoch , 0 , X4hoch , Sub
Debounce Tasterx4runter , 0 , X4runter , Sub
Debounce Tasteralleshoch , 0 , Alleshoch , Sub
Debounce Tasterallesrunter , 0 , Allesrunter , Sub
If X1hoch = X11hoch Then 'Relais aus, wenn Zeit um
Relaisx1hoch = 0
X11hoch = 1
X1ganzhoch = 1
End If
If X2hoch = X21hoch Then 'Relais aus, wenn Zeit um
Relaisx2hoch = 0
X21hoch = 1
X2ganzhoch = 1
End If
If X3hoch = X31hoch Then 'Relais aus, wenn Zeit um
Relaisx3hoch = 0
X31hoch = 1
X3ganzhoch = 1
End If
If X4hoch = X41hoch Then 'Relais aus, wenn Zeit um
Relaisx4hoch = 0
X41hoch = 1
X4ganzhoch = 1
End If
If X1runter = X11runter Then 'Relais aus, wenn Zeit um
Relaisx1runter = 0
X11runter = 1
X1ganzrunter = 1
End If
If X2runter = X21runter Then 'Relais aus, wenn Zeit um
Relaisx2runter = 0
X21runter = 1
X2ganzrunter = 1
End If
If X3runter = X31runter Then 'Relais aus, wenn Zeit um
Relaisx3runter = 0
X31runter = 1
X3ganzrunter = 1
End If
If X4runter = X41runter Then 'Relais aus, wenn Zeit um
Relaisx4runter = 0
X41runter = 1
X4ganzrunter = 1
End If
Loop
'-------------------------------------------------------------------------------
' K L E M M E X 1
'-------------------------------------------------------------------------------
X1hoch:
If Alleshoch = 1 And X13hoch = 1 Then Goto Weiterx1hoch
If Relaisx1hoch = 1 And Alleshoch = 1 Then Goto X2hoch 'Relais bleibt an, wenn alles hoch gedrückt wird
Weiterx1hoch:
If Relaisx1runter = 1 Then 'Relais aus, wenn gegenüberliegende gedrückt wird
Relaisx1runter = 0
X13runter = 1
X11runter = 1
Goto Start
End If
If Relaisx1hoch = 1 Then 'Relais aus, wenn wiederholt gedrückt wird
Relaisx1hoch = 0
X11hoch = 1
Goto Start
End If
If X1ganzhoch = 1 And Alleshoch = 1 Then Goto X2hoch
If X1ganzhoch = 1 Then Goto X1runter
Relaisx1hoch = 1 'Relais X1 Hoch zieht an
X1ganzrunter = 0
X11hoch = X1hoch + Zeitx1hoch 'Laufzeitermittlung
If X11hoch > 65000 Then 'Überlaufsperre
X1hoch = 1 'Überlaufsperre
X11hoch = Zeitx1hoch 'Überlaufsperre
End If
If X13hoch = 1 Then Goto Start
If Alleshoch = 1 Then
Waitms 200
Goto X2hoch
End If
Goto Start
X1runter:
If Allesrunter = 1 And X13runter = 1 Then Goto Weiterx1runter
If Relaisx1runter = 1 And Allesrunter = 1 Then Goto X2runter 'Relais bleibt an, wenn alles hoch gedrückt wird
Weiterx1runter:
If Relaisx1hoch = 1 Then 'Relais aus, wenn gegenüberliegende gedrückt wird
Relaisx1hoch = 0
X13hoch = 1
X11hoch = 1
Goto Start
End If
If Relaisx1runter = 1 Then 'Relais aus, wenn wiederholt gedrückt wird
Relaisx1runter = 0
X11runter = 1
Goto Start
End If
If X1ganzrunter = 1 And Allesrunter = 1 Then Goto X2runter
If X1ganzrunter = 1 Then Goto X1hoch
Relaisx1runter = 1 'Relais X1 Runter zieht an
X1ganzhoch = 0
X11runter = X1runter + Zeitx1runter 'Laufzeitermittlung
If X11runter > 65000 Then 'Überlaufsperre
X1runter = 1 'Überlaufsperre
X11runter = Zeitx1runter 'Überlaufsperre
End If
If X13runter = 1 Then Goto Start
If Allesrunter = 1 Then
Waitms 200
Goto X2runter
End If
Goto Start
Sekundentakt:
Timer1 = Timer
Incr X1hoch
Incr X2hoch
Incr X3hoch
Incr X4hoch
Incr X1runter
Incr X2runter
Incr X3runter
Incr X4runter
If X1hoch = 65000 Then X1hoch = 1
If X2hoch = 65000 Then X2hoch = 1
If X3hoch = 65000 Then X3hoch = 1
If X4hoch = 65000 Then X4hoch = 1
If X1runter = 65000 Then X1runter = 1
If X2runter = 65000 Then X2runter = 1
If X3runter = 65000 Then X3runter = 1
If X4runter = 65000 Then X4runter = 1
Return
Den Programmcode der Senderplatine habe ich noch nicht fertig.
Hier mal der Anfang zum testen:
$regfile = "m16def.dat"
$crystal = 8000000
Dim A As Byte
A = 1
Config Pind.6 = Output
Config Pind.5 = Input
Open "COMA.7:2400,8,N,1,inverted" For Output As #1 ' PA.7 ist Sender
Open "COMC.6:2400,8,N,1,inverted" For Output As #2 ' PC.6 ist Sender
Start:
Do
If Pind.5 = 0 Then Goto Senden
Loop
Senden:
Set Portd.6
Waitms 500
Reset Portd.6
A = 10
Printbin #1 , A
Goto StartWenn ich also auf der Senderplatine den Pind.5 setze, dann sendet er mir die Variable A mit 10 an die Empfängerplatine.
Und wenn die 10 empfangen worden ist, dann soll sie nach XYZ springen.
Das klappt auch alles schp
öm, nur wie beschrieben, der bleibt immer bei Inputbin hängen und ignoriert den Rest.
python_rocks
26.01.2008, 20:49
Hallo Papsi!
Du musst mit ISCHARWAITING prüfen, ob ein neues Zeichen anliegt. Wenn nicht, dann darfst du nicht mit INPUTBIN danach fragen. Denn INPUTBIN wartet bis ein Zeichen kommt. Das ganze Programm bleibt also an dieser Stelle stehen. Somit dürfte auch klar sein, weshalb DEBOUNCE nicht funktioniert.
dim is_waiting as byte
...
is_waiting = ischarwaiting(#1)
if is_waiting = 1 then
Inputbin #1 , A
If A = 10 Then Goto XYZ
If Relaisx1hoch = 0 And Relaisx2hoch = 0 And Relaisx3hoch = 0 And Relaisx4hoch = 0 Then
Alleshoch = 0
X13hoch = 0
X23hoch = 0
X33hoch = 0
X43hoch = 0
End If
If Relaisx1runter = 0 And Relaisx2runter = 0 And Relaisx3runter = 0 And Relaisx4runter = 0 Then
Allesrunter = 0
X13runter = 0
X23runter = 0
X33runter = 0
X43runter = 0
End If
end if
Debounce Tasterx1hoch , 0 , X1hoch , Sub 'Tasterabfrage
Debounce Tasterx1runter , 0 , X1runter , Sub
...
Außerdem fehlt mir in diesem Programm irgendwie die OPEN-Anweisung.
Wenn du langen Code zeigen möchtest, dann kannst du diesen in einen Paste-Service wie z.B. LodgeIt! http://paste.pocoo.org/ eingeben und uns dann den Link zu diesem Code posten.
mfg
Gerold
:-)
Die Open Anweisung habe ich aus versehen mit gelöscht.
Sieht so aus:
Open "COMB.1:2400,8,N,1,inverted" For Output As #1 ' PB.1 ist Sender
Open "COMB.0:2400,8,N,1,inverted" For Input As #2 ' PB.0 ist Empfänger
Die Sache mit ISCHARWAITING ist ja gerade mein Problem, das bekomme ich nicht hin!
Das Inputbin läuft ja schon, nur bleibt er wie gesagt stehen...
Wenn ich deinen Programmcode so einfüge meckert Basco rum:
Error : 328 Line : 206 Not valid for SW UART, in File ...
python_rocks
26.01.2008, 21:10
Hallo Papsi!
Wenn ISCHARWAITING nicht funktioniert, dann könnte dir vielleicht INKEY weiterhelfen. Das liefert 0 zurück wenn nichts anliegt. Das hindert dich aber auch daran, ein 0 zu empfangen. Denn das könntest du nicht unterscheiden.
mfg
Gerold
:-)
...
A = Inkey(#1)
if A > 0 then
If A = 10 Then Goto XYZ
If Relaisx1hoch = 0 And Relaisx2hoch = 0 And Relaisx3hoch = 0 And Relaisx4hoch = 0 Then
Alleshoch = 0
X13hoch = 0
X23hoch = 0
X33hoch = 0
X43hoch = 0
End If
If Relaisx1runter = 0 And Relaisx2runter = 0 And Relaisx3runter = 0 And Relaisx4runter = 0 Then
Allesrunter = 0
X13runter = 0
X23runter = 0
X33runter = 0
X43runter = 0
End If
end if
Debounce Tasterx1hoch , 0 , X1hoch , Sub 'Tasterabfrage
Debounce Tasterx1runter , 0 , X1runter , Sub
...
L Ä U F T . . .
(mußte nur Inkey von #1 auf #2 ändern, da #2 der "Empfangsport" ist)
Das ist die Lösung:
...
A = Inkey(#2)
if A > 0 then
If A = 10 Then Goto XYZ
End If
!!! Super Danke !!!
python_rocks
26.01.2008, 21:25
Falls du später nicht nur ein Zeichen empfangen musst, könntest du vielleicht so vorgehen (ungetestet):
dim buffer as string * 10
dim buffer_byte(10) as byte at buffer overlay
dim counter as byte
...
buffer = string(0, 10)
counter = 0
do
A = Inkey(#1)
if A > 0 then
incr counter
if counter > 10 then
' Fehler
'...
end if
buffer_byte(counter) = A
end if
loop until A = 0
if counter > 0 then
'tu etwas mit dem buffer
...
end if
...
mfg
Gerold
:-)
Ne - das reicht mir so...
Damit kann ich dann die Sendersache weitermachen.
PS
Habe da dann noch was: O:)
https://www.roboternetz.de/phpBB2/viewtopic.php?t=37588
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.