Hallo Forum.
Ich habe ein Problem, dass ich mit Suchen im Forum nicht lösen kann.
Ich prauche Port D als LCD und UART-Port.
Entsprechend habe ich nur noch PortB für Taster und LEDS.
(AT90S2313)
Hier im Forum wird immer nur der komplette Prot gelesen und entprellt.
Hat vielleicht jemand ein Beispiel wie explizit ein bestimmter Pin
abgefragt und entprellt werden kann ?
Bin so langsam echt am Ende.
By the way, ich bin Newbie und daher stelle ich mich vielleicht
manchmal etwas blöd an - also seid bitte nachsichtig.
Danke Carsten
Hallo,
Du kannst doch den Port komplett einlesen und anschließend mit
einer log. Verknüpfung die uninteressanten Pins "ausblenden":
in r15,PINB
andi r15,0b00000100
oder, falls der AT90S2313 den Befehl "andi" nicht kennt, dann
halt:
in r15,PINB
ldi r16,0b00000100
and r15,r16
das löscht in r15 alle Bits, die mit Null AND-verknüpft werden.
Hier bleibt nur Bit 2 (also PB2) übrig. Den Rest der Entprellerei
kannst Du dann eigentlich wie beim ganzen Port machen.
Gruß,
Christoph
...genau das hatte mir gefehlt.
Danke Dir.
...jetzt muss ich nur noch eine knappe Entprellroutine finden, die bei
mir läuft.
Die von Peter (
http://www.mikrocontroller.net/forum/read-4-20435.html#38426 ) bekomme
ich partout nicht zum rennen.
Ist aber auch ewig verwirrend mit diesem ganzen ge-And-e und ge-OR-e.
Naja schaun mer mal .
Vielleicht hat ja eine richtig kurze, gute und dokumentierte (so das
ich sie verstehe grinsverlegen)
Naja, ich empfehle Dir, die Beispiele hier mal zu ignorieren und
selbst was zusammenzuschreiben.
Entprellen bedeutet ja eigentlich nichts anderes als das schnelle
hin- und herspringen des log. Wertes eines Tasters zu ignorieren und
den Wert erst dann zu akzeptieren, wenn er längere Zeit stabil
geblieben ist.
Du mußt also nur den aktuellen Zustand einlesen und ein paar Mal
zu späteren Zeitpunkten damit vergleichen. Ist es immer derselbe
Wert, dann kann man annehmen, daß er stabil ist. Die Parameter - wie
z.B. die Anzahl der Vergleiche, die notwendig sind, oder die Größe
der Intervalle, in denen "Nachverglichen" wird, kann man durch
Probieren und etwas Überlegen gut bestimmen.
Auf diese Weise hast Du sicherlich mehr davon, als wenn Du fertigen
Code verwendest.
Viel Spaß,
Christoph
...sehe ich auch so.
Ist nur schöner auf diesem Wege auch etwas den Programmierstil anderer
zu sehen.
Letztenendes ist mir das vom Ablauf ja alles klar. Nur mit der
Umsetzung hapert es noch.
Bin halt Anfänger.
Hier, die Routine ist noch zuverlässiger, da sie 4-fach entprellt:
http://www.mikrocontroller.net/forum/read-4-20549.html#new
Es ist richtig, die Routine ist für 1-8 Tasten, d.h. man muß nur die
Bits auswerten, die auch wirklich mit einer Taste verbunden sind. Die
anderen Bits läßt man einfach links liegen.
Wenn es aber aufs Bitsparen ankommt, ist hier eine optimierte Routine
für nur eine Taste, die benötigt nur die unteren 4 Bits eines
Registers:
http://www.mikrocontroller.net/forum/read-4-27035.html#new
Peter
Also, bei dem Bitsparer komme ich auf einen Thread, wo ich nur ein
C-Programm finde.
Das andere Beispiel wollte ich gern mal probieren aber ich bekomme es
nicht zum Laufen.
Der MC zeigt keine Reaktion.
Kann man eigentlich auch online (im MC) debuggen ?
Ich hab ein STK500
Ok, hab ich getan.
Das Proggi von Peter tuts ja nunmal nicht auf meinem 2313.
Mit Deinem Code kann ich leider ohne das drumrum bis jetzt auch noch
nichts tun.
Ist es möglich, diesen mal vollständig zu bekommen?
Bis ich die ganzen Deklarationen und den Timer mir aus der Birne
gedrückt habe, bin ich wahnsinnig geworden.
Ich habs zwar mittlerweile mehrfach gelesen und getippt und auch
verstanden aber auswendig kann ich das noch nicht.
Ich meine diesen Threat:
http://www.mikrocontroller.net/forum/read-1-140056.html#140946
****VERZWEIFLUNG !!*****
"Also, bei dem Bitsparer komme ich auf einen Thread, wo ich nur ein
C-Programm finde."
Also ich sehe da nur mein ASM-Programm (1wire.zip auspacken).
"Das andere Beispiel wollte ich gern mal probieren aber ich bekomme
es
nicht zum Laufen."
Du must schon etwas kooperativ sein, in den Kopf kann Dir keiner
schauen.
Also was hast Du probiert und was geht wie nicht.
Peter
Hallo!
Kannst Du auch was mit C-Code anfangen, oder akzeptieren Deine
Software-Tools nur Assembler ?
In C hätte ich was für Dich - also wenn Du was damit anfangen kannst,
dann poste hier nochmal.
Gruß
Marcus
"Bis ich die ganzen Deklarationen und den Timer mir aus der Birne
gedrückt habe, bin ich wahnsinnig geworden."
Dann fang erstmal klein an:
- Taste drücken -> LED an, Taste loslassen -> LED aus
- Timer -> LED blinken
usw.
Die Beispiele laufen natürlich nur auf der gleiche Hardware, andere
AVRs mußt Du selber anpassen.
Peter
Eines vorweg:
Es ist nicht mein Code, sondern der von Peter Dannegger. Ich habe ihn
lediglich analysiert und umfassender kommentiert, um die von Markus
gestellte Frage zu beantworten. Verstanden habe ich den Code auch erst,
nachdem ich mich intensiv damit beschäftigt hatte. Und das hat schon
einige Zeit gedauert.
Ein komplettes Programm kann ich dir nicht liefern, da ich selbst
diesen Code noch nicht in eigenen Programmen verwendet habe.
Wichtig ist aber, dass du dein Programm so strukturierst, dass es von
einem ständig (periodisch) laufenden Timer-Interrupt gesteuert wird.
Soll heißen: Ein Timer wird so konfiguriert, dass er alle soundsoviel
Prozessortakte einen Interrupt auslöst. In dieser ISR (der
"Herzschlag" des Programms) werden Tasten abgefragt, Blinkzähler
erhöht (oder verringert), Flags für das Hauptprogramm gesetzt usw...
...
Nun gut...
ich habe get8key in mein Studio kopiert.
.include "2313def.inc" angepasst.
Dann hab ich das mal versucht Schrittweise zu simulieren.
Irgendwann bin ich dann ausgestiegen.
In main brabbelt er ja so lange rum, bis der Timer kommt.
Dann springt er nach der get8key-Routine wieder zu init, was ich
persönlich erstmal komisch finde - aber gut.
Hier werden wieder alle Key-Variablen gelöscht ?
Dann wird in main wieder der Interrup disabled, die gelöschte key_press
exclusiv mit leds verknüpft und danach wieder gelöscht (halte ich für
blödsinn - aber gut).
Dann brabbeln wir wieder ne Weile im main rum und das ganze beginnt von
neuem.
Nun denn, hab ich mir gedacht - vielleicht ist der Simulationsbetrieb
ja nicht geeignet zum testen. Also Board ran und auf den 2313
geschossen.
Nix Reaktion.
Irgendwie fehlt mir hier absolut der logische Ablauf.
Wozu das Label get8key, wenn's nicht aufgerufen wird?
Wieso wird immer wieder initialisiert ?
Ich verstehe das nicht :-(
Hallo Peter,
ich habe Deine Routine mal versucht in mein Programm einzubinden.
Wie kann ich die im AVR-Studio simulieren ?
Dein Original läuft aufm MC einwandfrei. Im Simulator bleibt key_press
immer 0.
TIFR muss ich setzen um den Interrupt zu erzeugen.
Dann natürlich PinD.
Aber er kommt nicht zu einem Ergebnis in key_press
Kann man das überhaupt simulieren?
Mit dem Simulator habe ich noch nie gearbeitet.
Man muß da irgendein Stimulus schreiben, mit dem dann die Eingänge
gesetzt werden. Es muß ja eine Flanke erzeugt werden.
Peter
Wie testest Du denn ?
Kann man den Programmablauf online im MC beobachten ?
Gibt's eigentlich sowas wie debug.print um Werte im Outputfenster
darzustellen ?
Hallo Marcus
>In C hätte ich was für Dich - also wenn Du was damit anfangen>kannst,dann poste hier nochmal.
Also ich suche sowas in C, vielleicht kannst du es mir ja mal schicke!
mfg mathias