mikrocontroller.net

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


Autor: cHiKuN (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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'+

Autor: Timo jeremy P. (chikun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry,

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

Sorry deswegen...


MfG cH!KuN'+

Autor: Nils S. (kruemeltee) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Timo jeremy P. (chikun)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Timo jeremy P. (chikun)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abfrage:        mov   taste, #0                    
            acall spalten                     ;Spalten abfragen
            
            jb eingabe, abfrageEnde
             
spalten:        clr   eingabe

            jb   MatrixSpalte1, spaltenMarke1
            jnb   MatrixSpalte1, $
            setb  eingabe
          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

Autor: Timo jeremy P. (chikun)
Datum:

Bewertung
0 lesenswert
nicht 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:
 mov   taste, #0 

Ist die letzte Reihe der Matrix-Tasta, also die unterste Reihe.
 jnb   MatrixSpalte1, $ 

Um ehrlich zu sein, die Funktion des Dollarzeichens habe ich noch nciht 
so ganz verstanden.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timo jeremy P. (chikun)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ne Abfrageroutine:

;************************************************************************
;*                                                                      *
;*                              read 4*3 key matrix                     *
;*                                                                      *
;************************************************************************
;
;row0                   must be connected to GND !
row1    bit     p1.0    ;outputs
row2    bit     p1.1
row3    bit     p1.2

col0    bit     p1.3    ;inputs
col1    bit     p1.4
col2    bit     p1.5

        dseg    at 30h
scan1:  ds      1               ;hold 1. scan
oldkey: ds      1               ;hold old key
        cseg
;
;call it with the debouncing time e.g. every 1/64sec
;Return: A = 0: no change in key state
;        A = 1: all keys released
;        A = 2 .. 13: number of key, changed from released to pressed
;
keyscan:
        orl     p1, #00111111b          ;set all 6 key lines high
        mov     a, #13
ks1:    jnb     col0 ks2                ;search pressed key (=low)
        dec     a
        jnb     col1 ks2
        dec     a
        jnb     col2 ks2
        dec     a
        jbc     row1 ks1                ;repeat
        jbc     row2 ks1                ;until
        jbc     row3 ks1                ;all rows low
ks2:                                    ;A: 1=no key, 2 .. 13 number of key
        xch     a, scan1                ;store as 1.scan
        cjne    a, scan1 ks3            ;compare (debouncing)
        cjne    a, oldkey ks4           ;compare (new key pressed)
ks3:    clr     a                       ;no change in key state
        ret
ks4:    mov     oldkey, a               ;store old key
        ret                             ;A = number of pressed key
end


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.