Nochmal Frage zum Assemblerporgramm ATmega16

Gast #655677
Lesenswert?

Hallo,
ich habe nocheinmal eine Frage zu meinem Programm. Denn es funktioniert 
nicht richtig.
1
;***************************************
2
.include "m16def.inc"
3
;***************************************
4

5
.def temp = r16
6
.def schieb = r17
7
.def aus = r18
8
.def an = r19
9
.org 0x0000
10
        rjmp    init                  ; Reset Handler
11
.org OVF0addr
12
.cseg
13

14
init:  ldi     temp, LOW (RAMEND)    ; Stackpointer initialisieren
15
        out     SPL, temp
16
        ldi     temp, HIGH (RAMEND)
17
        out     SPH, temp
18
    LDI    R22, 0b11111111     ;initialisieren
19
    OUT    DDRA, r22
20
    OUT    DDRB, r22
21
    OUT    DDRC, r22
22
    OUT    DDRD, r22
23
    LDI    aus, 0b00000000
24
    LDI    an, 0b11111111
25
main:  LDI    schieb, 0b00000000  ;aufbau in rot
26
main1:  ROL    schieb
27
    out    PORTA, schieb
28
    call warten
29
    CPI    schieb, 0b11111111
30
    BRNE  main1
31
main2:  LDI    schieb, 0b00000000
32
main3:  ROL    schieb
33
    out    PORTB, schieb
34
    call warten
35
    CPI    schieb, 0b11111111
36
    BRNE  main3
37
    call warten2
38
    out    PORTA, aus    ;alles aus
39
    out    PORTB, aus
40
main4:  LDI    schieb, 0b00000000  ;aufbau in grün
41
main5:  ROL    schieb
42
    out    PORTC, schieb
43
    call warten
44
    CPI    schieb, 0b11111111
45
    BRNE  main5
46
main6:  LDI    schieb, 0b00000000
47
main7:  ROL    schieb
48
    out    PORTD, schieb
49
    call warten
50
    CPI    schieb, 0b11111111
51
    BRNE  main7
52
    call warten2
53
    out    PORTC, aus    ;alles aus
54
    out    PORTD, aus
55
main8:  LDI    schieb, 0b00000000  ;aufbau in orange
56
main9:  ROL    schieb
57
    out    PORTA, schieb
58
    out    PORTC, schieb
59
    call warten
60
    CPI    schieb, 0b11111111
61
    BRNE  main9
62
main10:  LDI    schieb, 0b00000000
63
main11:  ROL    schieb
64
    out    PORTB, schieb
65
    out    PORTD, schieb
66
    call warten
67
    CPI    schieb, 0b11111111
68
    BRNE  main11
69
    call warten2
70
    out    PORTA, aus    ;alles aus
71
    out    PORTB, aus
72
    out    PORTC, aus
73
    out    PORTD, aus
74
    nop
75
    call warten
76
    out    PORTA, an    ;schrift rot  
77
    out    PORTB, an
78
    nop
79
    call warten2
80
    out    PORTA, aus    ;alles aus
81
    out    PORTB, aus
82
    out    PORTC, an    ;alles grün
83
    out    PORTD, an
84
    nop
85
    call warten2
86
    out    PORTC, aus    ;alles aus
87
    out    PORTD, aus
88
    out    PORTA, an    ;alles orange
89
    out    PORTB, an
90
    out    PORTC, an
91
    out    PORTD, an
92
    nop
93
    call warten2
94
    out    PORTA, aus    ;alles aus
95
    out    PORTB, aus
96
    out    PORTC, aus
97
    out    PORTD, aus
98
    call warten2  
99
    rjmp  main
100

101

102
; warte 1999998 Zyklen:
103
warten: ldi  R23, $12
104
WGLOOP0:ldi  R24, $BC
105
WGLOOP1:ldi  R25, $C4
106
WGLOOP2:dec  R25
107
        brne WGLOOP2
108
        dec  R24
109
        brne WGLOOP1
110
        dec  R23
111
        brne WGLOOP0  
112
    ret
113

114
; lange warten
115
warten2:  ldi  R27, $48
116
WGLOOP3:  ldi  R28, $BC
117
WGLOOP4:  ldi  R29, $C4
118
WGLOOP5:  dec  R29
119
          brne WGLOOP5
120
          dec  R28
121
          brne WGLOOP4
122
          dec  R27
123
          brne WGLOOP3
124
ret

Es geht auch richtig los. zuerts leuchten die roten LED.
Es wird aber Port B2, B1, B5 ausgelassen. Keine Ahnung warum. Dann 
warter er eine Weile und fängt wieder bei von vorn an.
Was ist da los???

Warum geht er nicht im Programm wieter und warum werden die LEDs 
ausgelassen.
Die LEDs sidn aber nicht defekt.
Bitte um Hilfe

Heiner
#655685
Lesenswert?

Heiner H. wrote:
> Es geht auch richtig los. zuerts leuchten die roten LED.
> Es wird aber Port B2, B1, B5 ausgelassen. Keine Ahnung warum. Dann
> warter er eine Weile und fängt wieder bei von vorn an.
> Was ist da los???

Er warte eine Weile. Was ist eine Weile? 64ms?
Dann klingt das nach Watchdog-Auslösung. Ist Watchdog auf immer aktiv 
geschaltet?
#655692
Lesenswert?

Heiner H. wrote:

> Es geht auch richtig los. zuerts leuchten die roten LED.
> Es wird aber Port B2, B1, B5 ausgelassen. Keine Ahnung warum. Dann
> warter er eine Weile und fängt wieder bei von vorn an.
> Was ist da los???

Sagte ich schon mal, dass du dich mit deinem Debugger beschäftigen
sollst?

Du brauchst das Ding!
Also beschäftige dich damit, wie man das Teil bedient!
Damit kannst du dein Programm in Einzelschritten durchgehen
und nachsehen, welche Register sich wie verändern.
Du kannst einen Breakpoint setzen und das Programm
simulieren lassen, bis die Programmausführung einen
bestimmten Befehl erreicht. Dort kannst du dann wieder
nachsehen, welche Register welchen Wert haben etc.

Beschäftige dich damit! Du brauchst den Simulator.
#655708
Lesenswert?

Heiner H. wrote:
> ja im Simulator habe ich schon alles ausprobiert. DAs ist ja das
> komische. Dort funktioniert alles.

Wenn auch nur zufällig. Aber du hast recht, es funktioniert.

> Wie ist das mit der Watchdog? Ist die von allein angeschaltet?

Nein. Hast du an den Fusebits rumgespielt?

> Und as passiert dann?

dann macht der µC einen Reset und fängt wieder von vorne an.
Gast #655746
Lesenswert?

Hallo Heiner,
schau Dir mal den Befehl ROL in der AVR-Dokumentation an.
Vielleicht klärt sich dann, wie aus
LDI schieb, 0b00000000
über
ROL schieb
eine Abfrage
CPI schieb, 0b11111111
sinnig oder unsinnig wird.
Stichwort carry-bit...
#655752
Lesenswert?

Gast wrote:
> Hallo Heiner,
> schau Dir mal den Befehl ROL in der AVR-Dokumentation an.
> Vielleicht klärt sich dann, wie aus
> LDI schieb, 0b00000000
> über
> ROL schieb
> eine Abfrage
> CPI schieb, 0b11111111
> sinnig oder unsinnig wird.
> Stichwort carry-bit...

Drum sagte ich auch, dass es Zufall ist, dass sein Programm
funktioniert. Die 'warten' Subroutines setzen das
Carry Flag.

Ich brenn das ganze jetzt mal in einen Mega16.

Eine Frage noch: Wie sind die LED angeschlossen?
Direkt ueber einen Widerstand oder ist da noch was
dazwischen?
Gast #655754
Lesenswert?

Hallo Karl Heinz,

>Drum sagte ich auch, dass es Zufall ist, dass sein Programm
>funktioniert. Die 'warten' Subroutines setzen das
>Carry Flag.

Nein, tun sie nicht.
DEC beeinflusst kein Carry-Bit.
Dafür gibt es SUBI.
Gast #655755
Lesenswert?

Nachtrag zu oben...
Nicht, dass ich SUBI in den Warte-Unterprogrammen
empfehlen würde. ;-)
So war das nicht gemeint.
Es wäre extrem schlechter Programmierstil, ein gesetztes
Carry-Bit aus einer Warteschleife heraus zu nutzen.
Wenn es denn so sein soll, bitte die Anweisung
SEC
vor dem
ROL
einfügen.
Kostet nichts und schafft klare Verhältnisse.
#655758
Lesenswert?

Karl heinz Buchegger wrote:

> Ich brenn das ganze jetzt mal in einen Mega16.

Gesagt, getan.
Sieht eigentlich gut aus. Das Programm setzt eine LED
nach der anderen, so wie es programmiert ist.

Wenn es das bei dir nicht tut, dann liegt die Ursache
irgendwo anders in einem Bereich, den wir nicht einsehen
können.
#655763
Lesenswert?

Gast wrote:
> Hallo Karl Heinz,
>
>>Drum sagte ich auch, dass es Zufall ist, dass sein Programm
>>funktioniert. Die 'warten' Subroutines setzen das
>>Carry Flag.
>
> Nein, tun sie nicht.
> DEC beeinflusst kein Carry-Bit.
> Dafür gibt es SUBI.

OK.
Dann ist es der CPI der das Carry setzt.
(Ist auch logisch, x - FF setzt immer das Carry
es sein denn x sei gleich FF, dann endet aber die
Schleife sowieso. Ich denke trotzdem immer noch nicht,
dass das so beabsichtigt war :-)

Wie auch immer, beim 2.ten und folgendem Durchlauf durch die
Schleife wird definitiv eine 1 aus dem Carry hereinrotiert.
#655771
Lesenswert?

Gast wrote:
> Genau ;-)
> Das ist ein ziemlich tückischer Fehler.

Yep.
Ich hab mich auch gewundert als im ersten Schleifendurchlauf
(klarerweise nichts passierte), aber im nächsten Durchlauf
tauchte dann plötzlich die 1 auf. Hab nicht weiter nachgedacht
wo die herkommt und habs mal fälschlicherweise auf die warten
geschoben.

> Ich empfehle, mit
> SEC
> ROL schiebe
> für klare Verhältnisse zu sorgen.

Das ist sicher ein guter Rat. Dadurch ist alles klar.

Aber das erklärt noch nicht, warum bei ihm PB1, PB2 und PB5
nicht mitspielen. An PB5 hängt noch MOSI, d.h. da ist die
ISP Schnittstelle dran. Das liefert aber keine Erklärung für
PB1 und PB2.

Und für die restlichen beiden Ports sowieso nicht.

Was ich mir vorstellen könnte:
Alle 32 LED sind auf ca. 20 mA eingestellt. Dadurch wird
die maximale Stromabgabe überschritten oder das Netzteil
geht soweit in die Knie, dass die Versorgungsspannung
zusammenbricht. Irgendsowas in der Art.
#655772
Lesenswert?

Software ist i.O..
Ist deine Energieversorgung auch i.O.?
Wenn du viele LEDs an hast wird auch viel Strom gezogen. Schafft das 
deine Stromversorgung? Mit Oszi überprüfen ob Einbrüche vorhanden. Würde 
Resetverhalten erklähren.
Einzelne Bits werden ausgelassen -> Hardware überprüfen. Schiebe doch 
einfach mal nur ein Bit durch. Dann wird nur eine LED je Port 
ausgegeben. Kurzschlüsse zwischen den Pins lassen sich so leicht finden. 
Auch braucht nur eine LED viel weniger Strom.
Gast #655786
Lesenswert?

>Karl heinz Buchegger wrote:
>>> Ich empfehle, mit
>>> SEC
>>> ROL schiebe
>>> für klare Verhältnisse zu sorgen.
>Der Vergleich sorgt für Carry. SEC ist nicht nötig.
>warten erzeugt kein Carry sondern Zero.

Karl kann nichts dafür - der Vorschlag wuchs auf meinem
Mist.
Der erste Rotiervorgang bei mainX wird mit Carry = 0
ausgeführt. Erst die weiteren nach dem Vergleich (CPI)
dann mit Carry = 1.
Ich kann mir nicht vorstellen, dass das bewusst so
vorgesehen war. Wenn doch, dann war es extrem pfiffig
ausgedacht. Dazu passt aber der ganze Programmierstil
nicht so recht. :-)

Wie auch immer - schön (in den Augen eines AVR-Assembler-
Anwenders) ist es nicht.
Auch wenn es vermeintlich überflüssig scheint, das
eingefügte SEC trägt zur Transparenz bei.

Es sind genau solche Optimierungen, die einem bei
komplexeren Projekten dann eine Menge Zeit für
Debugging stehlen.
#655855
Lesenswert?

1
.org 0x0000
2
        rjmp    init                  ; Reset Handler
3
.org OVF0addr
4
.cseg
Ich bin ja auch blutiger Anfänger in AVRasm, aber was erhoffst du dir 
von dem Timer0 Overflow Interrupt? Oder hab ich was übersehen?
Gut, mal abgesehen davon das du gar keinen timer verwendest sondern 
knallhart die Zyklen abwartest. Ich hab mir mal sagen lassen das es NIE 
ein Fehler ist die Interruptvektoren vollständig einzubauen.
Das kann hier zwar nicht zu einem Fehler füren, weil der Interrupt ja 
nie kommt, aber schön ist das nicht.  -wiebel
Gast #655863
Lesenswert?

Hallo Michael,
das ".org OVF0addr" ist in der Tat entbehrlich.
Es schadet nicht und es nützt nicht.
Im schlimmsten Falle kann es verwirren.

Allerdings würde ich ".cseg" noch vor ".org 0x0000"
setzen. Der Ordnung halber.

Das sind typische Anfängerfehler. Mit ein wenig
mehr Routine wird das schon. :-)
Gast #656524
Lesenswert?

Also ich habe jetzt erstmal noch alle LEDs getestet. Defekt ist 
ausgeschlossen.
Alles richtig gepolt und angeschlossen. Ich habe alle LEDs über ein 
Transisor Array angeschlossen (UDN2981A).
Das komische ist ja aber auch, das das Programm dann einfach von vorne 
anfängt. Vielleicht hat ja noch jemand irgendwelche Tips, bitte...
mfg
Gast #656631
Lesenswert?

Also habe es jetzt auch mit dem SEC probiert, ändert auch nichts.
Bei den Pins hatte ich mich verschrieben. denn es sind die Pin B0,1,2 
und 5.
Wie gesagt, LEDs gehen auf jeden Fall alle.
Das komische ist aber auch, das ieder von vorne angefangen wirde, wenn 
er mit dem roten fertig ist.
Was ist da blos los???
Kann jemand helfen?
mfg
Heiner
Gast #656633
Lesenswert?

achso, hatte ich ganz vergessen. Ihr habt recht, die stößt an ihre 
Grenzen. das NT geht bis 1A, die LEDs ziehen alleine schon 980mA. Aber 
warum fängt er dann immer wieder von vorne an, bei rot,wenn er mit dem 
roten Aufbau fertig ist.
Wie ist das bei einem ComputerNT, kann ich das da ranhängen? Wie viel 
Strom kann man da pro Molex ziehen? und komisch ist ja auch, das ein 
paar ausgelassen werden.
Gast #656635
Lesenswert?

Die Spannung bricht ein, "Brown out" spricht an, Reset und von vorne.

NEIN - nimm kein Computernetzteil - das braucht eine Mindestlast und 
wenn die (kurz) nicht mehr da ist, bekommst Du wieder einen "Reset"

Gruss Otto

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren