Hallo liebe Technikliebhaber, ich bin im Moment in der Schule dabei ein Projekt zu realisieren und dass ganze halt auf Assemblerbasis. Es soll eine Stoppuhr mit 3 Funktionstasten sein, welche mit Hilfe einer Matrix-Tastatur fungiert. Soweit läuft die Zahlenabfolge einwandfrei, aber das Problem ist halt, dass sobald die Zahlenabfolge läuft und somit auch der Timer, das ganze Programm keine Eingabe von der Matrix-Tastatur annimmt. Ich vermute, dass sobald der Timer läuft, das programm in der ISR zu selten bzw. zu schnell durchläuft, dass er die abfrage nicht realisiert. Laut DeBuger läuft alles einwandfrei, aber leider funktioniert es nicht richtig. Im Anhang ist das Programm und ich würde mich sehr freuen, wenn ihr mir weiter helfen könnt. Schonmal ein großes Dankeschön im Vorrauß. MfG cH!KuN'+
Sorry, mein Fehler ... hab aus Versehen den Beitrag geschrieben obwohl ich nicht Online war. Sorry deswegen... MfG cH!KuN'+
Ein extra Archiv herunterladen und da dann aus mehreren Dateien eine Source herausfischen ist nicht gerade schön ;) Es reicht, wenn du die Assembler Datei hochlädst. Es fehlen auch noch Infos, wie genau die Taster angeschlossen sind. Eine Matrix bei drei Tastern ist wenig sinnvoll.... > Laut DeBuger läuft alles einwandfrei, aber leider funktioniert es nicht > richtig. Irgendwo muss auch im Debugger ein Fehler auftauchen. Welchen verwendest du denn? Ich vermute mal stark, dass er die Tastendrücke nicht erkennt, weil du wohl pollst. Ich würde die drei Tasten, je nach verfügbarkeit von entsprechenden Pins, entweder an drei einzelene externe Ints hängen oder zweipolige Taster nehmen, die dann jeweils mit der ersten "Tasterhälfte" einen Pin auf 0 ziehen und die zweite "Tasterhälfte" der drei ist verbunden, sodass bei jedem Taster immer zuerst ein externer Interrupt ausgelöst wird. In der ISR rufst du dann die 3 Pins der Taster ab. // Edit ganz vergessen: Polling ist natürlich nicht der Grund, dafür dass es nicht funktioniert. Aber beim Polling muss man halt im rechten Moment abfragen und das wird wohl nicht funzen...
> Ein extra Archiv herunterladen und da dann aus mehreren Dateien eine > Source herausfischen ist nicht gerade schön ;) Done ... Source oben drin ;) > Es fehlen auch noch Infos, wie genau die Taster angeschlossen sind. > Eine Matrix bei drei Tastern ist wenig sinnvoll.... Done ... Matrix ist auf der MCU direkt angebracht per Ports und zwar Port 22-28. Wieso ich die drei von der Matrix nehme ist eig. ganz leicht zu erklären: Ich habe auf meinem Board nur 2 Funktionstasten und wollte halt dann die Matrix nehmen, da ich dort mehr Möglichkeiten habe. > Irgendwo muss auch im Debugger ein Fehler auftauchen. Welchen verwendest > du denn? RIDE 51. Mag sein ... ________________ Das größte Problem ist jetzt ganz einfach, dass ich eig. keine Ändernungshilfen wie Tastenwahl und Co. gebrauchen kann, da ich das Projekt schon so abgegeben habe mit diesen Definitionen. Sprich ich brauche eine Lösung und zwar in Code Form. Und am besten wäre es noch heute Abend. Danke für deine Antwort und ich hoffe auf noch weitere Hilfe. Merci MfG PS: lcdhilf.a51 ist das Prog. für die Ansteuerung der LCD-Anzeige und StoppUhr.a51 ist der Hauptprogramm.
Hey Leute, wäre echt super, wenn ich schaun könntet wo der Fehler liegt. Ich brauche so schnell wie möglich ne Antwort sonst habe ich ein großes Problem. Danke. MfG
1 | abfrage: mov taste, #0 |
2 | acall spalten ;Spalten abfragen |
3 | |
4 | jb eingabe, abfrageEnde |
5 | |
6 | spalten: clr eingabe |
7 | |
8 | jb MatrixSpalte1, spaltenMarke1 |
9 | jnb MatrixSpalte1, $ |
10 | setb eingabe |
11 | ret |
Ohne es verstanden zu haben, aber nen Code zu callen und dann reinzulaufen, ist zumindest strange. Falls aber doch beabsichtigt, ich halte solche dirty Tricks für brandgefährlich, besonders für Anfänger. Peter
Hallo Peter, danke für deine Antwort. Okay, wenn du solche "dirty Tricks", wie du sie nennst, für brandgefährlich hälst. Was würdest du mir denn dann raten bzw. was würdest du ändern. Das würde mir jetzt um ehrlich zu sein eher helfen, als wenn du mir mit Gefahrenwahrnungen kommst ^^ Dennoch danke dir. Aber um ehrlich zu sein ... in wie Fern ist es schlimm. Meinst du etwa, weil ich das ganze dopple? MfG PS:
1 | mov taste, #0 |
Ist die letzte Reihe der Matrix-Tasta, also die unterste Reihe.
1 | jnb MatrixSpalte1, $ |
Um ehrlich zu sein, die Funktion des Dollarzeichens habe ich noch nciht so ganz verstanden.
Timo jeremy P. schrieb: > Okay, wenn du solche "dirty Tricks", wie du sie nennst, für > brandgefährlich hälst. Was würdest du mir denn dann raten bzw. was > würdest du ändern. Ganz einfach: zu jedem Call gehört immer genau ein RET. Du callst diese Funktion und springst daraus woanders hin. Daher vermute ich, wird Dein Stack überlaufen. Ich vermute nur, weil ich nicht durchsehe, wo Du hin und her springst. Man sollte immer abgeschlossene Funktionsblöcke machen, die nur einen Eintritt und ein RET haben. Und Sprünge nach außerhalb sind verboten. > Um ehrlich zu sein, die Funktion des Dollarzeichens habe ich noch nciht > so ganz verstanden. Das heißt, der Code ist garnicht von Dir und Du hast ihn auch nicht verstanden? Dann sehe ich schwarz. $ ist der aktuelle Programmcounter. Peter
Der Code is von mir, nur habe ich die Matrix-Tasta Abfrage von nem Kumpel übernommen, da ich mich kurzfristig für sie entschieden hatte und keine Zeit mehr hatte. Jetzt geht es halt nur noch um die Funktion, dass diese gegeben sind. Hier für brauche ich lediglich eine Korrektur und da ich die Abfrage auf die letzte Zeile gekürzt haben mag es sein, dass ich die Rücksprungmarke versehentlich vergessen habe. Du meinst also, dass ich ab dem Punkt, an dem die Reihe #0 getestet wurde ein rücksprung geben soll und genauso auch ein rücksprung an dem punkt an dem die spalten abgefragt werden, oder? MfG
Hier mal ne Abfrageroutine:
1 | ;************************************************************************ |
2 | ;* * |
3 | ;* read 4*3 key matrix * |
4 | ;* * |
5 | ;************************************************************************ |
6 | ; |
7 | ;row0 must be connected to GND ! |
8 | row1 bit p1.0 ;outputs |
9 | row2 bit p1.1 |
10 | row3 bit p1.2 |
11 | |
12 | col0 bit p1.3 ;inputs |
13 | col1 bit p1.4 |
14 | col2 bit p1.5 |
15 | |
16 | dseg at 30h |
17 | scan1: ds 1 ;hold 1. scan |
18 | oldkey: ds 1 ;hold old key |
19 | cseg |
20 | ; |
21 | ;call it with the debouncing time e.g. every 1/64sec |
22 | ;Return: A = 0: no change in key state |
23 | ; A = 1: all keys released |
24 | ; A = 2 .. 13: number of key, changed from released to pressed |
25 | ; |
26 | keyscan: |
27 | orl p1, #00111111b ;set all 6 key lines high |
28 | mov a, #13 |
29 | ks1: jnb col0 ks2 ;search pressed key (=low) |
30 | dec a |
31 | jnb col1 ks2 |
32 | dec a |
33 | jnb col2 ks2 |
34 | dec a |
35 | jbc row1 ks1 ;repeat |
36 | jbc row2 ks1 ;until |
37 | jbc row3 ks1 ;all rows low |
38 | ks2: ;A: 1=no key, 2 .. 13 number of key |
39 | xch a, scan1 ;store as 1.scan |
40 | cjne a, scan1 ks3 ;compare (debouncing) |
41 | cjne a, oldkey ks4 ;compare (new key pressed) |
42 | ks3: clr a ;no change in key state |
43 | ret |
44 | ks4: mov oldkey, a ;store old key |
45 | ret ;A = number of pressed key |
46 | end |
Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.