Hey,
wie wäre es denn mit Interrupts dan musst du die Taster allerdings an die interrupt eingänge des avr's legen
Hallo,
kann mir einer sagen, wie ich mit BascomAVR am besten ein paar Eingänge ständig abfrage und wenn dann einer betätigt wird soll ein Unterprogramm aufgerufen werden. So, dass keiner verloren geht wenn z.B. zwei Eingänge
kurz hintereinander betätigt werden.
z.B. Portd.0 , Portd.1, Portd.2 Portd.3
Wie macht man sowas?
Gruß Hans
Hey,
wie wäre es denn mit Interrupts dan musst du die Taster allerdings an die interrupt eingänge des avr's legen
Geht das nicht auch ohne Interupt? Ich habs mit If..Then probiert, das geht zwar, aber wenn ich zwei Eingänge hintereinander betätige vergisst er einen.
Wenn man alles ganz langsam macht funktionierts, ist aber beschi.. so.
Poste Deinen Code, dann schauen wir mal was man verbessern kann.![]()
Das Gegenteil von "gut" ist "gut gemeint"!
Nun, ganz grob könnte ich mir das so vorstellen, ohne grade an Bascom zu sitzen:
Angenommen, du hast acht Taster an einem Port.
Dazu eine Byte-Variable, in die per Interrupt der Zustand
des Ports als Oder-Verknüpfung geschrieben wird. Die Oder-Verknüpfung deshalb, weil ein gedrückter Taster zwar ein ungesetztes Bit setzen soll, ein ungedrückter Taster soll aber ein gesetztes Bit nicht löschen, das sollen die entsprechenden Unterprogramme machen.
In der Hauptschleife deines Programms kannst du nun gemächlich die einzelnen Bits dieser Variablen abfragen und bei einer 1 (je nachdem, wie du die Taster beschaltet hast) das entsprechende Unterprogramm aufrufen.
Dieses Unterprogramme löscht nach Vollendung das entsprechende Bit.
Selbst wenn du nun alle Tasten auf einmal drückst, geht nix verloren.
Gruß MeckPommER
Mein Hexapod im Detail auf www.vreal.de
Erst mal Danke alle zusammen!
Ich muss mir zuerst das mit den Interrupts durchlesen und ausprobieren, das hört sich nämlich gut an. Bisher hatte ich es so wie unten. Probiert hab ichs auch mit If..Then usw.
Das ging zwar alles so lala, aber eben nicht gescheid. Wenn man schnell hintereinander die Taste betätigt kriegt er oft garnix mit.
Das ganze schaut so aus:
Gruß
Hans
-AVR 8515 und STK200 Board.
-LCD Display
'///// INITIALISIERUNG //////
$regfile = "8515def.dat"
$crystal = 4000000
Config Lcd = 20 * 4
Config Lcdmode = Port
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6
Config Lcdpin = Pin , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Config Portd = Input
Config Portb = Output
Set Portb.0
Set Portb.1
Set Portb.2
Set Portb.3
Set Portb.4
Set Portb.5
Set Portb.6
Set Portb.7
Cls
'///// HAUPTPROGRAMM ///////
Do
Debounce Pind.0 , 0 , Taste0 , Sub
Debounce Pind.1 , 0 , Taste1 , Sub
Debounce Pind.2 , 0 , Taste2 , Sub
Loop
'---------------------------------------------------------
Taste0:
---------------------------------------------------------
Cls
Waitms 1000
Lcd "Das war Taste0"
Waitms 1000
....
Return
usw...
'///// Unterprogramme /////
END
Wenn ich z.B. 5 Taster abfragen will und der AT908515 nur zwei Interrupt -Pins INT0 und INT1 hat. Was dann?
Dann müsste ich doch von jedem Taster noch eine Leitung abzweigen und damit auf ein Externes ODER gehen (evtl. reichen auch 5 Dioden) und vom Ausgang des ODERs dann auf den INT0- Eingang des AVR.
Wenn jetzt irgend ein Eingang betätigt wird, dann gibts einen INTERRUPT an INT0 (PD2) und ich kann die Interruptroutine aufrufen.
In der INTR Routine lese ich dann die Eingänge ein und schaue nach, wer von denen auf "1" war. Ist das so richtig?
Hat jemand eine Idee obs auch ohne die externe Schaltung geht?
Wie würde das mit der Interruptroutine dann ausschauen?
Hat mal jemand ein paar Codezeilen?
Danke nochmal Hans55
Ich glaube, du hast mich nicht richtig verstanden.
Die Taster sind alle an einem normalen Port. Ein Interrupt, der z.B. alle 10 Millisekunden ausgeführt wird, springt in ein Unterprogramm, in dem die gesetzten Bits in eine Variable übergeben werden.
HIER kommt dann eine logische Oder-Verknüpfung, da die bisher gesetzten Bits in der Variable bleiben und nur die per Tasten hinzugekommenen eingetragen werden sollen.
Mein Hexapod im Detail auf www.vreal.de
Hallo Meckpommer,
als Anfänger mit Bascom (und über 55) hat man schon so seine Probleme. Ich finde ja nicht mal einen Befehl wie OR oder AND um auf die schnelle vergleichen zu können, welcher Eingang sich geändert hat. Vermutlich gibts den in Bascom nicht. Das alles ist vermutlich auch so einfach, dass man in keinem Forum was findet.
Naja, dann heißt das eben weiterforschen.
Gruß Hans55
Hallo,
die Operatoren sind gut versteckt auf dieser Seite zu finden,
http://avrhelp.mcselec.com/language_fundamentals.htm
auch in der lokalen Hilfe.
Wenn soviele Taster auf einmal abgefragt werden sollen, und alle an einem Port sind (wenn nicht müssen die halt alle an einen), kann man doch den ganzen Port auf einmal ein lesen, und dann nur vergleichen,
ob der Wert grösser 0 ist, wenn die Taster nach Vcc schalten,
oder kleiner 255 wenn die nach Gnd schalten.
Danach kann man immer noch die einzelnen Werte raussuchen, um den richtigen Taster zu finden.
Lesezeichen