Forum: Mikrocontroller und Digitale Elektronik Fließtext/Lauftext


von Sami R. (sami_reim)


Angehängte Dateien:

Lesenswert?

Hallo liebes Forum,


ich möchte gerne einen Fließtext/Lauftext auf mein LCD-Display ausgeben 
nach einem Tastendruck.
Grundsätzlich funktioniert das auch. Das ganze läuft in einer Schleife, 
die jede Sekunde den gesamten Displaytext um eins nach rechts bewegt 
(http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD).


Wenn ich nun einen anderen Taster drücke, will ich, dass das Programm 
etwas anderes macht (zb eine andere Displayausgabe). Ich habe 
verschiedene Möglichkeiten durchprobiert. Entweder kommt das Programm 
nicht aus der Schleife raus (schiebt also jede Sekunde den Text auf dem 
Display um eins nach rechts, egal wie ich auf die Taster einhaue) oder 
der Fließtext läuft nicht mehr kontinuierlich nach rechts weiter.

Aktuell scrollt der gesamte Text genau ein Zeichen nach rechts und macht 
dann nichts mehr. (siehe Quellcode)

Ich weiß leider keine weiteren Lösungsversuche mehr.
In dem angehängten Quelltext ist unter dem Label "taster4" in Zeile 353 
der entsprechende Fehlercode.



1
;########################################################################
2
;##                        Lauftext (Werbung)                          ##
3
;########################################################################
4
taster4:
5
;    ldi temp1, 0b00001111              ;Cursor soll blinken
6
;    rcall lcd_command                  ;fuer debugging
7
8
9
    rcall   lcd_clear                   ;leere Display
10
11
    ldi     ZH, HIGH(text_5*2)          ;Zeiger auf 5. Textspeicherung (siehe Textdatenbanken)
12
    ldi     ZL, LOW(text_5*2)
13
    rcall   lcd_flash_string
14
15
    ldi      temp1, 0b11000000          ;Zeiger in 2. Zeile
16
    rcall   lcd_command
17
18
    ldi     ZH, HIGH(text_6*2)          ;Zeiger auf 6. Textspeicherung (siehe Textdatenbanken)
19
    ldi     ZL, LOW(text_6*2)
20
    rcall   lcd_flash_string
21
22
    rjmp scrollen
23
24
25
;text schritt für schritt nach rechts wandern lassen
26
;###################################################
27
    scrollen_main:
28
      
29
            in   taster_now, taster_pin      ;jetzigen Zustand der Taster einlesen
30
            mov  display, taster_now           ;Sichern in temp1
31
            eor  taster_now, taster_old      ;mit dem vorhergehenden Zustand XOR
32
            mov  taster_old, display           ;und den jetzigen Zustand für den nächsten
33
                                             ;Schleifendurchlauf als alten Zustand speichern
34
            mov temp5, taster_now
35
36
            breq zeit_abfrage1                        ;Ergebnis des XOR auswerten:
37
                                          ;wenn keine Taste gedrückt war -> neuer Schleifendurchlauf
38
39
            and  display, taster_now          ;War das ein 1->0 Übergang, wurde der Taster also
40
                                          ;gedrückt (in taster_now steht das Ergebnis vom XOR)
41
            brne zeit_abfrage1                   
42
            rjmp taster_druck_helper
43
44
        
45
46
47
                                             ;wenn keine Taste gedrückt war -> neuer Schleifendurchlauf
48
     zeit_abfrage1:
49
            lds temp1, SEKUNDE_ABFRAGE
50
            cpi temp1, 1
51
52
        breq scrollen                   ;falls entsprechende Zeit um, Scrolle Text
53
        rjmp scrollen_main              ;falls nicht, neue Abfrage druch Sprung nach scrollen_main
54
55
56
57
58
59
        scrollen:
60
;            ldi temp2, 0x10             ;lade 16 in temp2, da Durchlauf 16x (Display 16 Zeichen Platz)
61
;            scrollen_sub_loop:
62
63
            ldi temp1, 0b00011100       
64
            rcall lcd_command           ;text ein zeichen nach rechts scrollen
65
66
            ldi temp1, 0
67
            sts SEKUNDE_ABFRAGE, temp1  ;setze SEKUNDE_ABFRAGE auf 0
68
69
70
            rjmp zeit_abfrage1



Ich hoffe, irgendwer hat nen Lösungsansatz. :)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Sami Reim schrieb:
> Ich weiß leider keine weiteren Lösungsversuche mehr.
> In dem angehängten Quelltext ist unter dem Label "taster4" in Zeile 353
> der entsprechende Fehlercode.
>
> Ich hoffe, irgendwer hat nen Lösungsansatz. :)
 Das Ganze sieht nach Code der von einem Basic Compiler generiert und
 dann wahllos reinkopiert wurde. Formatierung und Zeileneinrückung ist
 katastrophal.

 Aber:
  a) Timer1 wird auf 1ms eingestellt, aber es wird mit 10ms gerechnet,
     somit läuft alles 10x schneller.
  b) Timer1 benutzt CS10 und nicht CS00, daß die beiden zufällig auf
     selber bitposition stehen, ändert nichts daran.
  c) SREG wird in der ISR nicht gerettet, wenn der ISR sofort nach
     einem Vergleich und vor dem Sprung zuschlägt, wird es nichts mit
     darauffolgenden Flagauswertung.
  d) Bei deiner Tasterabfrage wird Prellen nicht berücksichtigt.
  e) Das, was du gepostet hast, nennt man Spaghetti-Code, da wird
     einem schwindelig von Vor- und Zurückspringen.

 Versuche das Ganze etwas übersichtlicher zu gestalten.

von c-hater (Gast)


Lesenswert?

Sami Reim schrieb:

> Ich weiß leider keine weiteren Lösungsversuche mehr.
...
> Ich hoffe, irgendwer hat nen Lösungsansatz. :)

Nun, ich würde vorschlagen, du lernst erstmal Programmieren im 
Allgemeinen und Assembler im Besonderen.

Dein Programm ist echt grausam. Mal abgesehen von der miesen 
Formatierung und dem Fehlen eines erkennbaren Grundkonzeptes strotzt es 
nur so von Fehlern.

Es ist überdeutlich zu erkennen, daß es aus fremden Quellen 
zusammenkopiert und mit sehr schwachen Assemblerkenntnissen angepaßt 
wurde.

So wird das nix.

von Sami R. (sami_reim)


Lesenswert?

Hi Marc & c-hater,

erstmal vielen Dank für Eure Antworten! Ihr seid ja ganz schön schnell 
hier ;)

Aktuell bin ich dabei mir Programmieren im Allgemeinen und Assembler im 
Besonderen beizubringen. Ich hab mich bemüht, meinen Code halbwegs 
ordentlich ausschauen zu lassen. Anscheinend habe ich das schonmal nicht 
hinbekommen.


a) Da is mir wohl ein Fehler beim Kommentieren untergekommen. 
Grundsätzlich funktioniert der Timer aber und ist nicht 10x schneller.

b) Hab ich geändert ;)

c) Hier lag tatsächlich der Fehler! Vielen vielen Dank!

d) Meine Tasterabfrage funktioniert problemlos. Es treten keinerlei 
Prell-Anzeichen auf.

e) Solange arbeite ich noch nicht mit Assembler. Kann gut sein, dass es 
unübersichtlich oder Spaghetti-Code ist. Besser habe ich es aber leider 
nicht hinbekommen. :/
In einem Jahr werd ich wahrscheinlich auch sagen: "Was für ne scheiße 
hab ich denn damals bitte geschrieben??" Aber aktuell reichen meine 
Erkenntnisse einfach nicht für viel mehr.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Sami Reim schrieb:
> a) Da is mir wohl ein Fehler beim Kommentieren untergekommen.
> Grundsätzlich funktioniert der Timer aber und ist nicht 10x schneller.
 Nein, mein Fehler beim lesen, dachte deine Mega läuft mit 10MHz.


 Wert für Timer_Grundlage liest man nicht zur Laufzeit aus dem Flash,
 sondern schreibt es als Konstante, etwa so:
1
.equ  Tim1_CTC = 0x2710 - 1                ; -1, weil die Null auch mitgezahlt wird
2
 ;*  Und dann...
3
        ldi     ZL,low(Tim1_CTC)          ;lade Z-Register low 
4
        ldi     ZH,high(Tim1_CTC)         ;lade Z-Register high
5
        out     OCR1AH, zh                ;In Vergleichsregister des Timer Standartwert laden
6
        out     OCR1AL, zl

Sami Reim schrieb:
> d) Meine Tasterabfrage funktioniert problemlos. Es treten keinerlei
> Prell-Anzeichen auf.
 Wahrscheinlich wegen der LCD-Schieberei gleich danach. Trotzdem muss
 man mit so etwas rechnen.

Sami Reim schrieb:
> Aber aktuell reichen meine Erkenntnisse einfach nicht für viel mehr.
 Was ja auch nicht schlimm ist.


 P.S.
 "Standard" schreibt sich mit "d"

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.