Forum: Mikrocontroller und Digitale Elektronik LCD Uhr Immer ein Reset - AVR - ASM


von C. H. (hedie)


Angehängte Dateien:

Lesenswert?

Hallo

Ich wollte mal das Beispiel der LCD Uhr nachmachen...

Ich hab also das LCD angehängt jedoch eines mit einem KS0066U Controller

Diesen kann ich nicht mit der Im Tutorial angegebenen Routine Ansteuern 
deshalb hab ich ein wenig geforscht und wurde auch fündig...

Habe auch ein wenig experimenteirt... Funktioniert Super

Nun Zum Problem ich hab also den Code Übernommen und ein paar rcall 
Änderungen vorgenommen so das es den Befehl in meinen Routinen Findet.

Zum test wird anfangs ein T ausgegeben....

Nun hab ich alles in den Controller geladen und dan.... Das T ist 
sichtbar und danach ein Reset dan wieder das T und Reset und das immer 
so weiter und so weiter

Obwohl eigentlich gar kein reset drin steht.....

Ich hoffe ihr könnt mir helfen

Im Anhang ist mein Code

die Routine findet ihr hier 
Beitrag "KS0066U oder Ähnliche --- LCD Treiber"

Vielen dank bereits jetzt für eure Hilfe

von Spess53 (Gast)


Lesenswert?

Hi

Bist du sicher, daß nicht irgendwo ein 'push ..' zuviel, oder ein 
'pop...' zuwenig ist? Wäre ein typisches Verhalten.

MfG Spess

von C. H. (hedie)


Lesenswert?

Hmm also die Routine Läuft einwandfrei

Nun kann der Push oder das felende Pop nur im obigen code sein....

und da es da keins hat, kanns fats nicht möglichsein....

Zudem bin ich da zuwenig über asm wissend um so etwas exakt zu bestimmen 
:D

von Spess53 (Gast)


Lesenswert?

Hi

Noch ne Idee: Evtl. Watchdog aktiviert. Überprüfe mal deine Fuses.

MfG Spess

von C. H. (hedie)


Lesenswert?

Nee WatchDog ist ausgeschalten

Kann es sein das es daran liegt, das ich folgenden code nicht integriert 
hab?

[avrasm]

.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler


[/avrams]

von Karl H. (kbuchegg)


Lesenswert?

Du gibst die Interrupts frei und gibst auch den Overflow
Interrupt für den Timer frei.
Aber du hast keinen Interrupt Handler in die Interrupt Vektoren
eingetragen.

Darf ich vorschlagen, dass du das Tutorial von Anfang an durch-
arbeitest. Es macht wenig Sinn mitten drinn einzusteigen, wenn
dir die Voraussetzungen für einen Tutorialabschnitt, der weiter
vorne besprochen wurde, fehlen.

von Spess53 (Gast)


Lesenswert?

Hi

Karl Hein hat Recht.

Mfg Spess

von Simon K. (simon) Benutzerseite


Lesenswert?

Spess53 wrote:
> Karl Hein hat Recht.

Jou, nichts ungewöhnliches :-))

von C. H. (hedie)


Lesenswert?

Danke

Das Problem ist jetzt nur, das wenn ich den code an den anfang setze, 
dan kann ich es compilieren jedoch zeigt dann das LCD nichts mehr an 
(logisch wurde dann ja auch noch nicht initialisiert)

wenn ich den code nach die initialisation hänge, kann ich es nicht mehr 
compilieren und das mit etwa 15 fehler

alles etwa gleich wie dieser (nur andere zahlen)

C:\....Assembler\TEMPLCD3\TEMPLCD3.asm(78): error: Overlap in .cseg: 
addr=0x0 conflicts with 0x0:0x14

von Karl H. (kbuchegg)


Lesenswert?

Claudio H. wrote:
> Danke
>
> Das Problem ist jetzt nur, das wenn ich den code an den anfang setze,

Welchen Code?

Du brauchst erst mal in deinem Programm einen Interrupt Vektor.
Ja, genau so nennt man den Teil

.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler


Und der muss ganz am Anfang stehen.
Erst danach, beim label main beginnt die eigentliche Programmausführung.

Lies im Tutorial den Abschnitt Interrupts durch um rauszufinden
was es damit auf sich hat.

von C. H. (hedie)


Lesenswert?

Ok habs hinbekommen....

Jedoch nur die ausgabe Nun ist noch das problem, das es mir keine zehner 
anzeigt

Es geht immer nut bis 9 und dann kommen die zeichen in der reihen folge 
und dann wieder null

 : ; < = > ?

Die Minuten werden angezeigt (bisher nur einer hatte noch nicht 10 
minuten gewartet :D )

Der code den ich abänderte sieht so aus

Ohni die ori's kommen nur linien auf dem display an
1
Ausgabe:
2
        rcall   LCD_Clear             ; das LCD löschen
3
        mov     Temp, Stunden 
4
    ori    Temp, 0x30       ; und die Stunden ausgeben
5
        rcall   LCD_SendChar
6
        ldi     Temp, ':'            ; zwischen Stunden und Minuten einen ':'
7
        rcall   LCD_SendChar
8
        mov     Temp, Minuten
9
    ori    Temp, 0x30        ; dann die Minuten ausgeben
10
        rcall   LCD_SendChar
11
        ldi     Temp, ':'            ; und noch ein ':'
12
        rcall   LCD_SendChar
13
        mov     Temp, Sekunden
14
    ori    Temp, 0x30       ; und die Sekunden
15
        rcall   LCD_SendChar
16
 
17
end_isr:

von Spess53 (Gast)


Lesenswert?

Hi

.org $0000
     rjmp reset   ; sollte es heissen
.org OVF0addr
     rjmp    timer0_overflow       ; Timer Overflow Handler

Das Label 'main' ist eigentlich übeflüssig.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Claudio H. wrote:

>         mov     Temp, Minuten
>     ori    Temp, 0x30        ; dann die Minuten ausgeben
>         rcall   LCD_SendChar

das steht sicher so nicht im Tutorialabschnitt über Zahlen-
ausgabe auf einem LCD. Und auch im Abschnitt über die Uhr
wird eine richtige Zahlenumwandlung gemacht.

Überleg mal: LCD_SendChar gibt genau 1 Zeichen aus.
Wie soll denn da eine 2-stellige Zahl (für deren Ausgabe
offensichtlich 2 Zeichen ausgegeben werden müssen) ausgegeben
werden?

Noch mal: Es hat keinen Sinn aus dem Tutorial einzelne Teile
zusammenzukopieren. Jeder Abschnitt baut auf einem vorhergehenden
auf. Wenn du den nicht durchmachst und verstehst, dann fehlt dir
immer die Hälfte an Grundlagen.

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.