Forum: Mikrocontroller und Digitale Elektronik ATmeL AT89S8252 Stoppuhr + Matrix-Tasta


von cHiKuN (Gast)


Angehängte Dateien:

Lesenswert?

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'+

von Timo jeremy P. (chikun)


Lesenswert?

Sorry,

mein Fehler ... hab aus Versehen den Beitrag geschrieben obwohl ich 
nicht Online war.

Sorry deswegen...


MfG cH!KuN'+

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

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...

von Timo jeremy P. (chikun)


Angehängte Dateien:

Lesenswert?

> 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.

von Timo jeremy P. (chikun)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Timo jeremy P. (chikun)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Timo jeremy P. (chikun)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.