PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst] debounce und inputbin laufen nicht zusammen ???



Papsi
22.01.2008, 23:31
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

Papsi
23.01.2008, 00:34
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, 07: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
:-)

Papsi
23.01.2008, 11:02
Kannst Du mir mit einem Codeschnippsel mal weiterhelfen ?

Bekomme es irgendwie nicht hin...

python_rocks
23.01.2008, 11: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, 13:47
Hallo Papsi!

Mehr Beispiele und Erklärungen findest du hier:
http://avrhelp.mcselec.com/index.html?uart.htm

mfg
Gerold
:-)

Papsi
26.01.2008, 18:30
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, 18:46
Hallo Papsi!

Zeige mal deinen Testcode den du schon hast. Nicht nur einen Ausschnitt davon.

mfg
Gerold
:-)

for_ro
26.01.2008, 18:52
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

Papsi
26.01.2008, 19:25
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, 19: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
:-)

Papsi
26.01.2008, 19:59
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...

Papsi
26.01.2008, 20:04
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, 20: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
...

Papsi
26.01.2008, 20:24
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, 20: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
:-)

Papsi
26.01.2008, 20:39
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