So Hi!
Da ich seit langem nicht mehr programmiert habe, habe ich jetzt versucht
ein Bascom Programm zu schreiben, welches einen Servo steuert und
welchen man mit 2 Tastern ansteuern können sollte.
Jetzt habe ich ein wenig rumprogrammiert und habe ein Programm erstellt,
was eigentlich genau das machen sollte. Jedoch "hängen" sich die
Interrupts von beiden Tastern immer nach 2-3 ich hatte schon mal 6
Betätigungen geschafft - auf und der Wert bleibt bei weiterer Betätigung
unverändert.
Ich kann mir jedoch nicht diesen Fehler erklären, ich denke aber, dass
ein problem mit dem vom servo-befehl verwendeten timer0 und den
Interrupts int0 und int1 besteht.
Hoffentlich kann mir jemand helfen.
Schon mal besten Dank im Voraus,
hani
Hallo,
Du solltest "disableinterrupts" als ersten Befehl in der Interruptrutine
ausführen und "enableinterrupts" als letzten.
Ansonsten solltest Du das ganze Konzept nochmals überarbeiten.
z.B. Tasten im 10-tel Sekundentakt pollen und nicht mit Intterupt.
Gruß Jürgen
Wenn einer der Interrups auftritt und zwar genau hier dazwischen
Enable Interrupts
--->
Warten = 0
dann wird der Interrupt ausgeführt, dort warten auf 1 gesetzt, das
danach im Hauptprogramm gleich wieder auf 0 und dann die Interrupts nie
wieder eingeschaltet.
Grüße,
Peter
Es hülfe ganz enorm, wenn man mal das Bascom-Manual lesen würde.
Es gibt nämlich speziell für Tastenabfragen den Debounce-Befehl.
Tasten mit externen Interrupts sind dagegen die schlechteste Lösung,
weil sie fast nie funktionieren und deutlich aufwendiger sind.
Peter
OK, Gut danke für die Vörschläge werde mal schauen, dass ich die so
schnell wie möglich implementiere.
Zum einem Ursprünglich hatte ich den gesamten code im"Interruptbereich
stehen, samt der pause und es hatte auch funktioniert, aber nach dem
tastendruck verging immer erst 1Sek(die pause), bis sich der servo
ausrichtete und ich denke mal, dass das daran lag, da der int0 eine
höhere priorität besitzt als der timer0 - dene ich?
Danach hatte ich mich mit dem debounce in der hauptschleife versucht -
jedoch wollte es ums verre**** nicht fuktionieren - aber egal ich
probiers jetzt dann noch mal mit dem debounce.
Sollte es dann etwa so aussehen:?
also die interruptdeklartation weglassen und dann in der Hauptschleife:
Markus H. schrieb:> so> schnell wie möglich implementiere
Also Gut - gesagt-getan:
Jetzt zeigt sich mein avr, wie bereits heute schon einmal gänzlich
unbeeindruckt von einem Tastendruck und die led blinkt munter vor sich
weiter
Oweeehhh und jetzt?
1
'PD2(Int0) und PD3(INT1) als Eingang , PD7 und PD7 als PB0(Servo) und PB0 als Ausgang(LED)
Gott sei Dank, dass hier auch einige nachtaktive sind.
Sollter da der Compiler nicht eine Fehlermeldung ausgeben ? Naja egal -
Jetzt funktonierts endlich.
Vielen Dank an euch Alle für die schnelle Hilfe!
Aber ich denke ich werde doch irgendwann auf eine andere Sprache, wie
z.B. C Umsteigen müssen, denn ich finde mich in einer "klaren, strengen
Syntax" besser zurecht, denn wegen dem einen blöden Fehler hat das ganze
"Projekt" gesponnen.
Also nochmals vielen Dank und zuletzt noch den fertigen code:
Hallo Markus H
.. der Peter Dannegger hat eigentlich schon ein wenig recht..
allerdings muss ich sagen, dass ich mit Tastenabfragen über
einen externen Int eigentlich glücklich bin.
Ich benötige dann nur eine Hardwareentprellung für alle Tasten.
Dein Problem liegt aber in deinem Programm.
Du musst dein programm etwa so schreiben:
Do
If Taste1gedrückt = 1 then
Tu was ich will
Taste1gedrückt = 0 <- zurücksetzen
end if
Loop
END
INT Routine:
Frage Port ab
Wenn Pin_x = 1 then Taste1gedrückt = 1
Return
*****************
Zudem kann man in Bascom niemal einen LCD Befehl in eine INT Routine
setzen.
Das geht immer schief
Gruss Klaus
Klaus De lisson schrieb:> Zudem kann man in Bascom niemal einen LCD Befehl in eine INT Routine> setzen.> Das geht immer schief
Käse, kann man, ist aber normalerweise kontraproduktiv, weil das LCD die
Kiste mächtig bremst ... ist "unschön"
hat aber auch nix mit Bascom zu tun, würde in ASM genauso die Bremse
rein hauen. Für Tastenabfrage braucht man aber auch keine Int
normalerweise, weil die Systembremse eh vor den Tasten sitzt oder steht.