Forum: Mikrocontroller und Digitale Elektronik Problem mit LCD-Anzeige und ATtiny2313


von Philipp B. (phbu)


Angehängte Dateien:

Lesenswert?

Hallo Forumnutzer,

habe versucht die Schaltung (s. Bild) zu testen. Allerdings bekomme ich 
nur auf der zweiten Zeile einen gelben Strich.

Ich vermute, dass ich evtl. im Programm den Timer für die Verzögerung 
wegen dem LCD falsch verwende.
Hier mal das Programm:
1
.include "tn2313def.inc"
2
3
; #Makros#
4
.equ F_CPU=1000000
5
.equ RS=PD3
6
.equ RW=PD4
7
.equ E=PD5
8
.def temp=r16
9
.def LCD_data=r17
10
.def Clock_Counter=r18
11
12
; #Code-Segment#
13
.cseg
14
  ; #Interrupts#
15
  .org 0x00 ; RESET
16
    rjmp RESET
17
  ; #Programm#
18
    RESET:
19
    ; Watchdog deaktivieren
20
    in temp,MCUSR
21
    andi temp,(0xFF&(0<<WDRF))
22
    out MCUSR,temp
23
    in temp,WDTCSR
24
    ori temp,(1<<WDCE)|(1<<WDE)
25
    out WDTCSR,temp
26
    ldi temp,(0<<WDE)
27
    out WDTCSR,temp
28
    ; Stackpointer initialisieren
29
    ldi temp,RAMEND
30
    out SPL,temp
31
    ; Eingänge und Ausgänge definieren
32
    ldi temp,0xFF ; Datenrichtungsregister B definieren
33
    out DDRB,temp
34
    ldi temp,(1<<RS)|(1<<RW)|(1<<E) ; Datenrichtungsregister D definieren
35
    out DDRD,temp
36
    ; LCD konfigurieren
37
    ldi LCD_data,0x3C ; 8 Bit-Interface, 2-zeilig, 5x11 Pixel
38
    rcall cmdLCD ; LCD-Befehl übertragen
39
    ; LCD konfigurieren - On/Off control
40
    ldi LCD_data,0xC ; Display ein, Cursor aus, Cursorblinken aus
41
    rcall cmdLCD ; LCD-Befehl übertragen
42
    ; "Test" schicken
43
    loop:
44
    ldi LCD_data,0x1 ; LCD löschen
45
    rcall cmdLCD
46
    ldi LCD_data,'T'
47
    rcall dataLCD
48
    ldi LCD_data,'e'
49
    rcall dataLCD
50
    ldi LCD_data,'s'
51
    rcall dataLCD
52
    ldi LCD_data,'t'
53
    rcall dataLCD
54
    rcall delay_2_6s
55
    rjmp loop
56
    
57
  ; #Unterprogramme#
58
    cmdLCD:
59
      out PORTB,LCD_data
60
      ldi temp,(0<<RS)|(0<<RW) ; Befehlsmodus, Schreibmodus
61
      out PORTD,temp
62
      sbi PORTD,E ; E-Pin am LCD aktivieren
63
      rcall delay_66ms
64
      cbi PORTD,E ; E-Pin am LCD deaktivieren
65
      rcall delay_66ms
66
      ret
67
    dataLCD:
68
      out PORTB,LCD_data
69
      ldi temp,(1<<RS)|(0<<RW) ; Datenmodus, Schreibmodus
70
      out PORTD,temp
71
      sbi PORTD,E ; E-Pin am LCD aktivieren
72
      rcall delay_66ms
73
      cbi PORTD,E ; E-Pin am LCD deaktivieren
74
      rcall delay_66ms
75
      ret
76
    delay_66ms:
77
      ; Timer initialisieren und starten
78
      ldi temp,(1<<CS02) ; Prescaler 256, Normal-Modus
79
      out TCCR0B,temp
80
      ; Timer Overflow-Flag löschen
81
      ldi temp,(1<<TOV0)
82
      out TIFR,temp
83
      delay_loop0:
84
      in temp,TIFR
85
      andi temp,(1<<TOV0)
86
      cpi temp,(1<<TOV0)
87
      brne delay_loop0
88
      ret
89
    delay_2_6s:
90
      inc Clock_Counter
91
      ; Timer initialisieren und starten
92
      ldi temp,(1<<CS02)|(1<<CS00) ; Prescaler 1024, Normal-Modus
93
      out TCCR0B,temp
94
      ; Timer Overflow-Flag löschen
95
      ldi temp,(1<<TOV0)
96
      out TIFR,temp
97
      delay_loop1:
98
      in temp,TIFR
99
      andi temp,(1<<TOV0)
100
      cpi temp,(1<<TOV0)
101
      brne delay_loop1
102
      cpi Clock_Counter,11
103
      brne delay_2_6s
104
      ldi Clock_Counter,0
105
      ret
106
107
; #SRAM-Segment#
108
.dseg
109
  
110
; #EEPROM-Segment#
111
.eseg

Wahrscheinlich wieder ein ganz einfacher Fehler...
Verwendet habe ich übrigens dieses 
Display:http://www.ebay.de/itm/1602-Character-HD44780-LCD-Display-Anzeigen-Zeichen-Blau-Rucklicht-Modul-/301677296769?pt=LH_DefaultDomain_77&hash=item463d5e3c81

Wäre dankbar für jede Hilfe.

Mit freundlichen Grüßen
PHBU

von Karl H. (kbuchegg)


Lesenswert?

Tu dir selbst einen Gefallen:

von deinem Spannungsregler gehst du mit der positiven 
Versorgungsspannung auf die waagrechte Pinleiste, die mit einem roten 
Strich (und einem +) markiert ist. GND legst du auf die blaue Leiste.


Und dann schliesst du alle Teile so an, dass du dir die 
Versorgungsspannung IMMER von dieser roten bzw. blauen Leiste holst. Man 
kann auch die jeweils blauen Pinleisten bzw. roten Pinleisten 
miteinander verbdinden, dann braucht man nicht immer quer übers ganze 
Board mit den Kabelb, sondern holt sich zb GND für den Prozessor von der 
blauen Leiste 'unter' dem µC, und Vcc von der roten Leiste 'über' dem 
µC.

Im Moment kann ich in dem Kabelwirrwarr noch nicht einmal erkennen, ob 
der µC überhaupt an die Stromversorgung angeschlossen ist.

Tip: sieh von der anderen Seite auf das LCD. Dann ist der Initial-Balken 
nicht in der zweitern Zeile, sondern in der ersten

von Philipp B. (phbu)


Lesenswert?

Hallo Karl Heinz,

>Tu dir selbst einen Gefallen:

Okay, werde morgen die Schaltung nochmal besser umverdrahten.
Ich hab mir die Schaltung im aktuellen Zustand nochmal angeschaut und 
gemessen. µC bekommt Spannung sowie LCD.
Wenn ich's umverdrahtet habe, kann ich nochmal mit dem Oszi durchmessen.

>Tip: sieh von der anderen Seite auf das LCD. Dann ist der Initial-Balken
>nicht in der zweitern Zeile, sondern in der ersten

Wer lesen kann, ist klar im Vortiel... (schäm)

Nur noch ne Frage zur Theorie: Stimmt der obige ASM-Code? Oder ist vllt. 
ein Codefehler beim Timer des ATtinys?

Danke nochmal im Voraus!

Mit freundlichen Grüßen
PHBU

von spess53 (Gast)


Lesenswert?

Hi

>Nur noch ne Frage zur Theorie: Stimmt der obige ASM-Code? Oder ist vllt.
>ein Codefehler beim Timer des ATtinys?

Ich habe deinen Code nur überflogen: Aber mir fehlen die Wartezeiten 
,lt. Datenblatt des Displaycontroller, vor der Initialisierung und nach 
den einzelnen Befehlen.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Wozu willst du da eigentlich einen Timer nehmen?

ob du jetzt mit dem Timer eine Anzahl an Takten abwartest, oder ob der 
µC eine ausgeklügelte Anzahl an Registern in geschachtelten Schleifen 
runterzählt, ist Jacke wie Hose. Ein Timer bringt dir da keinerlei 
Vorteile.

(allerdings sollte man auch das TCNT Register vorher explizit auf 0 
setzen. Sonst ist es ein wenig witzlos, wenn du beim Eintritt in die 
delay Funktion zufällig einen Timer-Stand von 254 hast und der Timer 
dann nur 1 Timertakt bis zum Überlauf braucht)

von Philipp B. (phbu)


Lesenswert?

Hallo nochmal,

lag tatsächlich an der Verdrahtung: Habe PB0..7 mit PB7..0 vertauscht -> 
alle Befehle und Daten wurden vom LCD-COntroller nicht verstanden.

Funktioniert jetzt alles!

Danke nochmal für eure Hilfe und sorry für die schlechte Verdrahtung.

Mit freundlichen Grüßen
PHBU

von Philipp B. (phbu)


Angehängte Dateien:

Lesenswert?

Hallo nochmal,

ich habe folgende Codeabschnitte/Unterprogramme:
- Makros
1
.equ F_CPU=1000000
2
.equ T_Min=PD0
3
.equ T_Sek=PD1
4
.equ T_Start_Stop=PD2
5
.equ PullUps=(1<<T_Min)|(1<<T_Sek)|(1<<T_Start_Stop)
6
.equ RS=PD3
7
.equ RW=PD4
8
.equ E=PD5
9
.def temp=r16
10
.def LCD_data=r17
11
.def minutes=r18
12
.def seconds=r19
- unfertiges Hauptprogramm
1
; Zeit einstellen
2
    settingTime:
3
    ldi ZL,LOW(text1)
4
    rcall write_text
5
    rcall newLine
6
    mov LCD_data,minutes ; Minuten auf LCD ausgeben
7
    rcall numberLCD
8
    ldi LCD_data,':' ; Doppelpunkt auf LCD ausgeben
9
    rcall dataLCD
10
    mov LCD_data,seconds ; Sekunden auf LCD ausgeben
11
    rcall numberLCD
12
    sbis PIND,T_Min ; wenn der Minuten-Taster gedrückt wird
13
    inc minutes
14
    sbis PIND,T_Sek ; wenn der Sekunden-Taster gedrückt wird
15
    inc seconds
16
    sbic PIND,T_Start_Stop ; wenn der Start-Stop-Taster gedrückt wurde
17
    rjmp settingTime
18
    end:
19
    rjmp end
- Subroutine, um Texte aus dem EEPROM auf dem LCD anzuzeigen
1
write_text:
2
      push LCD_data
3
      ldi LCD_data,0x1 ; LCD löschen
4
      rcall cmdLCD
5
      read_text:
6
      sbic EECR,EEWE ; prüfen, ob EEPROM bereit ist
7
      rjmp write_text
8
      out EEAR,ZL
9
      sbi EECR,EERE ; lesen
10
      in LCD_data,EEDR
11
      tst LCD_data ; prüfen, ob Stringende erreicht wurde
12
      breq end_text
13
      rcall dataLCD ; Zeichen auf Display ausgeben
14
      inc ZL
15
      rjmp read_text
16
      end_text:
17
      pop LCD_data
18
      ret
Subroutine, um Befehle an das Display zu senden
1
cmdLCD:
2
      out PORTB,LCD_data
3
      ldi temp,(0<<RS)|(0<<RW)|PullUps ; Befehlsmodus, Schreibmodus
4
      out PORTD,temp
5
      sbi PORTD,E ; E-Pin am LCD aktivieren
6
      rcall delay_20ms
7
      cbi PORTD,E ; E-Pin am LCD deaktivieren
8
      rcall delay_20ms
9
      ret
Subroutine, um Daten an das LCD zu senden
1
dataLCD:
2
      out PORTB,LCD_data
3
      ldi temp,(1<<RS)|(0<<RW)|PullUps ; Datenmodus, Schreibmodus
4
      out PORTD,temp
5
      sbi PORTD,E ; E-Pin am LCD aktivieren
6
      rcall delay_50us
7
      cbi PORTD,E ; E-Pin am LCD deaktivieren
8
      rcall delay_50us
9
      ret
Subroutine, um Zahlen in 2 oder 3 ASCII-Zeichen umzuwandeln
1
numberLCD: ; gibt eine Zahl auf dem LCD aus
2
      push LCD_data
3
      push r31
4
      mov r31,LCD_data
5
      ldi LCD_data,'0'-1
6
      numberLCD_1:
7
      inc LCD_data
8
      subi r31,100
9
      brcc numberLCD_1
10
      subi r31,-100
11
      cpi LCD_data,'0' ; wenn die Hunderterstelle 0 ist, Ziffer nicht ausgeben
12
      breq numberNext
13
      rcall dataLCD
14
      numberNext:
15
      ldi LCD_data,'0'-1
16
      numberLCD_2:
17
      inc LCD_data
18
      subi r31,10
19
      brcc numberLCD_2
20
      subi r31,-10
21
      rcall dataLCD
22
      ldi LCD_data,'0'
23
      add LCD_data,r31
24
      rcall dataLCD
25
      pop r31
26
      pop LCD_data
27
      ret
Die letzte Subroutine habe ich hier vom AVR-Tutorial. Hat diese etwa 
einen Fehler (was ich eigentlich nicht glaube...)?

Wenn ich das Display bzw. Programm starte, steht auf dem Display:
1
Zeit einstellen:
2
00:10
Und die 10 ist hier doch meiner Meinung nach falsch!?

Drücke ich dann den Sekunden-Taster einmal, so wird aus dem Text 
folgendes:
1
00:20
Warum zählt er jetzt 10 hoch!? Bei den Minuten zählt er genauso hoch.
Ab 100 bzw. 200 zählt er die 10er-Stellen als auch die 1er-Stellen 
überhaupt nicht mehr, bis er von vorne (diesmal komischerweise 00) 
beginnt.

Liegts an der Subroutine oder an den Unterprogrammaufrufen?

Wäre dankbar nochmal für jede Hilfe!

Mit freundlichen Grüßen
PHBU

von Philipp B. (phbu)


Lesenswert?

Hallo nochmal,

peinlich, peinlich...die Register minutes und seconds (r18 und r19) 
müssen natürlich noch genullt werden, damit diese keine willkürlichen 
Werte annehmen (einfach mit dem Befehl clr).

Trotzdem zählt der Zähler (hier Minuten) immer nur 10 hinzu (statt 1) 
und bei 100 zählt er nur noch im Hintergrund weiter, ohne dass sich 
etwas am Display ändert. Das Gleiche geschieht mit 200, bis er wieder 
mit 0 anfängt.

Warum zählt er immer 10 hoch?

Danke im Voraus!

Mit freundlichen Grüßen PHBU

von Philipp B. (phbu)


Lesenswert?

Hallo nochmal,

irgendwie scheint diese Routine (Dezimal->ASCII) aus dem Forum nicht zu 
funktionieren...

Hier nochmal die zwei wichtigsten Routinen in meinem Programm:

dataLCD (sendet ein Zeichen, gespeichert im Register LCD_data, an das 
LCD):
1
dataLCD:
2
      out PORTB,LCD_data
3
      ldi temp,(1<<RS)|(0<<RW)|PullUps ; Datenmodus, Schreibmodus
4
      out PORTD,temp
5
      sbi PORTD,E ; E-Pin am LCD aktivieren
6
      rcall delay_50us
7
      cbi PORTD,E ; E-Pin am LCD deaktivieren
8
      rcall delay_50us
9
      ret

numberLCD (wandelt eine Zahl aus dem Register LCD_data in ASCII-Zeichen 
und sendet diese per dataLCD-Routine an das LCD):
1
numberLCD: ; gibt eine Zahl auf dem LCD aus
2
      push LCD_data
3
      push r31
4
      mov r31,LCD_data
5
      ldi LCD_data,'0'-1
6
      numberLCD_0:
7
      inc LCD_data
8
      subi r31,100
9
      brcc numberLCD_0
10
      subi r31,-100
11
      cpi LCD_data,'0' ; wenn die Hunderterstelle 0 ist, Ziffer nicht ausgeben
12
      breq numberNext
13
      rcall dataLCD
14
      numberNext:
15
      ldi LCD_data,'0'-1
16
      numberLCD_1:
17
      inc LCD_data
18
      subi r31,10
19
      brcc numberLCD_1
20
      subi r31,-10
21
      rcall dataLCD
22
      ldi LCD_data,'0'
23
      add LCD_data,r31
24
      rcall dataLCD
25
      pop r31
26
      pop LCD_data
27
      ret

Folgendes Mini-Testprogramm
1
ldi LCD_data,147
2
rcall numberLCD

schreibt die Zahl '100' auf das LCD.
Ist die Routine etwa flasch? Ich seh da irgendwie keine Fehler...

Wäre nett, wenn sich das jemand nochmal anschauen würde.

Danke für jede Hilfe!

Mit freundlichen Grüßen
PHBU

von Karl H. (kbuchegg)


Lesenswert?

Philipp B. schrieb:

> schreibt die Zahl '100' auf das LCD.
> Ist die Routine etwa flasch? Ich seh da irgendwie keine Fehler...

Sieht für mich gut aus.
Bist du schon mal im Single-Step (in der Simulation) durch die Routine 
gegangen?

von S. Landolt (Gast)


Lesenswert?

Die Routine ist in Ordnung, setzt sauber 0x00..0xFF nach 00..255 um.

Aber im §settingTime laufen die 'inc' m.E. zu schnell durch.

von Karl H. (kbuchegg)


Lesenswert?

> Folgendes Mini-Testprogramm
>
1
> ldi LCD_data,147
2
> rcall numberLCD
3
>

das ist sicherlich nicht die komplette relevante Hauptschleife. Bitte 
poste die.
Es könnte auch sein, dass schon "147" auf dem LCD steht, du aber dann 
den Cursor zurückpositionierst und "00" über die "47" drüber schreibst. 
Kontrollieren kann das hier aber keiner, weil keiner sieht, was genau du 
in deinem Mini-Testprogramm sonst noch so alles machst (woran du jetzt 
gar nicht denkst, dass es damit in Zusammenhang stehen könnte)

von S. Landolt (Gast)


Lesenswert?

Vorschlag: auch noch einmal die Verdrahtung des LCD kontrollieren.

von Philipp B. (phbu)


Angehängte Dateien:

Lesenswert?

Hallo,

danke für Eure Antworten!

Okay, nochmal zum Verständnis: aktuell soll das Display NUR die Zahl 
147 anzeigen.

Hier nun die einzelnen Codeabschnitte:

Die Makros (Variablen):
1
.equ F_CPU=1000000
2
.equ T_Min=PD0
3
.equ T_Sek=PD1
4
.equ T_Start_Stop=PD2
5
.equ PullUps=(1<<T_Min)|(1<<T_Sek)|(1<<T_Start_Stop)
6
.equ RS=PD3
7
.equ RW=PD4
8
.equ E=PD5
9
.def temp=r16
10
.def LCD_data=r17
11
.def minutes=r18
12
.def seconds=r19
Die Initialisierung des Controllers:
1
RESET:
2
    ; Watchdog deaktivieren
3
    in temp,MCUSR
4
    andi temp,(0xFF&(0<<WDRF))
5
    out MCUSR,temp
6
    in temp,WDTCSR
7
    ori temp,(1<<WDCE)|(1<<WDE)
8
    out WDTCSR,temp
9
    ldi temp,(0<<WDE)
10
    out WDTCSR,temp
11
    ; AD-Wandler ausschalten
12
    ldi temp,(1<<ACD)
13
    out ACSR,temp
14
    ; Stackpointer initialisieren
15
    ldi temp,RAMEND
16
    out SPL,temp
17
    ; Eingänge und Ausgänge definieren
18
    ldi temp,0xFF ; Datenrichtungsregister B definieren
19
    out DDRB,temp
20
    ldi temp,(1<<RS)|(1<<RW)|(1<<E)|(1<<PD6) ; Datenrichtungsregister D definieren
21
    out DDRD,temp
22
    ldi temp,PullUps ; Pull-Ups aktivieren
23
    out PORTD,temp
Die Initialisierung des LCDs:
1
; warten, bis LCD initialisiert wurde
2
    rcall delay_20ms
3
    ; LCD initialisieren
4
    ldi LCD_data,0x30
5
    rcall cmdLCD
6
    rcall cmdLCD
7
    rcall cmdLCD
8
    ; LCD konfigurieren
9
    ldi LCD_data,0x38 ; 8 Bit-Interface, 2-zeilig, 5x7 Pixel
10
    rcall cmdLCD ; LCD-Befehl übertragen
11
    ; LCD konfigurieren - On/Off control
12
    ldi LCD_data,0xC ; Display ein, Cursor aus, Cursorblinken aus
13
    rcall cmdLCD ; LCD-Befehl übertragen
Das primitive Hauptprogramm:
1
    clr minutes
2
    clr seconds
3
    ldi LCD_data,147 ; die Zahl, die auf das LCD ausgegeben werden soll
4
    rcall numberLCD
5
    end:
6
    rjmp end
Subroutine numberLCD, die eine Zahl aus dem Register LCD_data in 2 oder 
3 (z.B. die Zahlen 00, 05, 12, 50, 100 oder 255) ASCII-Zeichen (bzw. in 
ASCII Zahl) umwandeln soll:
1
numberLCD: ; gibt eine Zahl auf dem LCD aus
2
      push LCD_data
3
      push r31
4
      mov r31,LCD_data
5
      ldi LCD_data,'0'-1
6
      numberLCD_0:
7
      inc LCD_data
8
      subi r31,100
9
      brcc numberLCD_0
10
      subi r31,-100
11
      cpi LCD_data,'0' ; wenn die Hunderterstelle 0 ist, Ziffer nicht ausgeben
12
      breq numberNext
13
      rcall dataLCD
14
      numberNext:
15
      ldi LCD_data,'0'-1
16
      numberLCD_1:
17
      inc LCD_data
18
      subi r31,10
19
      brcc numberLCD_1
20
      subi r31,-10
21
      rcall dataLCD
22
      ldi LCD_data,'0'
23
      add LCD_data,r31
24
      rcall dataLCD
25
      pop r31
26
      pop LCD_data
27
      ret

Sollten Euch die anderen Subroutinen auch noch interessieren, so könnt 
Ihr diese im mitgelieferten Code nachlesen/überprüfen.

Verdrahtung habe ich übrigens wie anfangs beschrieben schon geändert und 
überprüft.

Danke nochmal für Eure Hilfe!

Mit freundlichen Grüßen
PHBU

von S. Landolt (Gast)


Lesenswert?

Was ist auf dem LCD zu sehen, wenn Sie unmittelbar vor §end ergänzen:

[avrasm]
  rcall newLine
  ldi   LCD_data,99
  rcall numberLCD
  ldi   LCD_data,' '
  rcall dataLCD
  ldi   LCD_data,100
  rcall numberLCD
  ldi   LCD_data,' '
  rcall dataLCD
  ldi   LCD_data,'4'
  rcall dataLCD
end:
[/avrasm}

von spess53 (Gast)


Lesenswert?

Hi

Schmeiss mal

>      cpi LCD_data,'0' ; wenn die Hunderterstelle 0 ist, Ziffer nicht >ausgeben
>      breq numberNext


diese Zeilen raus

Damit bleibt deine Anzeige dreistellig. Wenn nämlich in deiner Anzeige 
000 steht und du überschreibst das mit 01 steht dann 010 auf dem 
Display.

MfG spess

von Philipp B. (phbu)


Angehängte Dateien:

Lesenswert?

S. Landolt schrieb:
>Was ist auf dem LCD zu sehen, wenn Sie unmittelbar vor §end ergänzen:
>
>[avrasm]
>  rcall newLine
>  ldi   LCD_data,99
>  rcall numberLCD
>  ldi   LCD_data,' '
>  rcall dataLCD
>  ldi   LCD_data,100
>  rcall numberLCD
>  ldi   LCD_data,' '
>  rcall dataLCD
>  ldi   LCD_data,'4'
>  rcall dataLCD
>end:
>[/avrasm}

S. Bild.

spess53 schrieb:
>Schmeiss mal diese Zeilen raus

Moment, mach ich gleich...

von Philipp B. (phbu)


Angehängte Dateien:

Lesenswert?

Hallo spess53,

hier dein Vorschlag mit dem "Zusatzcode" von S. Landolt (s. Bild).

von S. Landolt (Gast)


Lesenswert?

r31 wird numberLCD zum Umrechnen verwendet, aber auch in den 
Delayroutinen.

von S. Landolt (Gast)


Lesenswert?

Da die genauen Zeiten ohnehin keine Rolle spielen, erstmal:
1
delay_50us:
2
      push r31           ; !
3
      ldi r31,0x0E
4
      WGLOOP0:
5
      dec r31
6
      brne WGLOOP0
7
      nop
8
      pop  r31           ; !
9
      ret
10
delay_20ms:
11
      push r31           ; !
12
      ldi r30,0x1C
13
      WGLOOP1:
14
      ldi r31,0xED
15
      WGLOOP2:
16
      dec r31
17
      brne WGLOOP2
18
      dec r30
19
      brne WGLOOP1
20
      nop
21
      pop  r31           ; !
22
      ret

von Philipp B. (phbu)


Lesenswert?

Hallo,

es ist schon erstaunlich, dass die meisten Fehler so eine verdammte 
Einfachheit haben. Wie bescheuert... :-O

Gut, ich kann jetzt schonmal alles einstellen, allerdings ist die 
Verzögerung beim Einstellen zu kurz, d.h. die Zahlen ändern sich noch zu 
schnell. Aber da bau ich einfach noch eine delay-Routine ein.

push und pop, ihr seid meine besten Freunde X-D

Danke nochmal für Eure Hilfe!

von S. Landolt (Gast)


Lesenswert?

Ihn dünkt', er sähe eine Null
  wo eine Neun sollt' sein.
Er guckt' noch mal und merkt', es lag
  an dem Delay allein.
"Wenn das schon alles ist", sprach er,
  "dann kommt push/pop hinein."

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.