Unerwünshcter Reset im Programm Mega 16

Gast #741944
Lesenswert?

Hallo,
ich habe einen Ausschnitt aus meinem Programm:
1
;***************************************
2
.include "m16def.inc"
3
;***************************************
4
.cseg
5
.def zaehlen = r21
6
.def temp = r16
7
.def schieb = r17
8
.def schieb2 = r20
9
.def aus = r18
10
.def an = r19
11
.org 0x0000
12
        rjmp    init                  ; Reset Handler
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:  SEC
27
    ROL    schieb
28
    out    PORTA, schieb
29
    nop
30
    call warten
31
    CPI    schieb, 0b11111111
32
    BRNE  main1
33
main2:  LDI    schieb, 0b00000000
34
main3:  SEC
35
    rol    schieb
36
    out    PORTB, schieb
37
    nop
38
    call warten
39
    CPI    schieb, 0b11111111
40
    BRNE  main3
41
    call warten2
42
    out    PORTA, aus    ;alles aus
43
    out    PORTB, aus

Dann geht es im Programm mit Laden einer Konstante in ein Register 
weiter, also ähnlich wie es hier shcon alles war, nur auf andere Ports. 
Jedoch geht das Programm immer nur bis hier hin, was ich reinkopiert 
hab. Dann geht es wieder von vorne Los. Ich nehme an, das der µc ein 
Reset durchführt, aber woher kommt der?

Kann jemand helfen?

mfg
Gast #741964
Lesenswert?

ja, Endlosschleife habe ich, aber bis dort kommt er ja gar nicht. Er 
kommt ja vermutlich nur bis hier hin, wo ich das Programm hier 
hereinkopeirt habe, weil dann fangen die LEDs wieder von ovrn an zu 
leuchten.
Das mit dem Label und Befehl stimmt eigentlich, ändert aj aber auch 
nichts an der Funktion, würde ich jedenfalls meinen.
Gast #741976
Lesenswert?

Moin..

Initialisierst du denn den Rest der Hardware ?

Stellst du sicher, das kein Interrupt ausgelöst wird,
der dir dann irgendwo ins Hauptprogramm springt, das ja
mitten in der "Zeropage" liegt ?

(@init dürfte ja 0x0001 sein, wenn ich das richtig sehe)

Gruss,
Timmey
Gast #742079
Lesenswert?

Also ok, hier dfas ganze Proggramm:
1
;***************************************
2
.include "m16def.inc"
3
;***************************************
4
.cseg
5
.def zaehlen = r21
6
.def temp = r16
7
.def schieb = r17
8
.def schieb2 = r20
9
.def aus = r18
10
.def an = r19
11
.org 0x0000
12

13
    rjmp  init
14

15
init:  ldi     temp, LOW (RAMEND)    ; Stackpointer initialisieren
16
        out     SPL, temp
17
        ldi     temp, HIGH (RAMEND)
18
        out     SPH, temp
19
    LDI    R22, 0b11111111     ;initialisieren
20
    OUT    DDRA, r22
21
    OUT    DDRB, r22
22
    OUT    DDRC, r22
23
    OUT    DDRD, r22
24
    LDI    aus, 0b00000000
25
    LDI    an, 0b11111111
26
main:  LDI    schieb, 0b00000000  ;aufbau in rot
27
main1:  SEC
28
    ROL    schieb
29
    out    PORTA, schieb
30
    nop
31
    call warten
32
    CPI    schieb, 0b11111111
33
    BRNE  main1
34
main2:  LDI    schieb, 0b00000000
35
main3:  SEC
36
    rol    schieb
37
    out    PORTB, schieb
38
    nop
39
    call warten
40
    CPI    schieb, 0b11111111
41
    BRNE  main3
42
    call warten2
43
    out    PORTA, aus    ;alles aus
44
    out    PORTB, aus
45
main4:  LDI    schieb, 0b00000000  ;aufbau in grün
46
main5:  SEC
47
    ROR    schieb
48
    out    PORTC, schieb
49
    nop
50
    call warten
51
    CPI    schieb, 0b11111111
52
    BRNE  main5
53
main6:  LDI    schieb, 0b00000000
54
main7:  ROL    schieb
55
    out    PORTD, schieb
56
    nop
57
    call warten
58
    CPI    schieb, 0b11111111
59
    BRNE  main7
60
    call warten2
61
    out    PORTC, aus    ;alles aus
62
    out    PORTD, aus
63
main8:  LDI    schieb, 0b00000000
64
    LDI    schieb, 0b00000000  ;aufbau in orange
65
main9:  SEC
66
    ROL    schieb
67
    ROR    schieb2
68
    out    PORTA, schieb
69
    out    PORTC, schieb2
70
    call warten
71
    CPI    schieb, 0b11111111
72
    BRNE  main9
73
main10:  LDI    schieb, 0b00000000
74
main11:  SEC
75
    ROL    schieb
76
    out    PORTB, schieb
77
    out    PORTD, schieb
78
    call warten
79
    CPI    schieb, 0b11111111
80
    BRNE  main11
81
    call warten2
82
    out    PORTA, aus    ;alles aus
83
    out    PORTB, aus
84
    out    PORTC, aus
85
    out    PORTD, aus
86
    nop
87
    call warten
88
    out    PORTA, an    ;schrift rot  
89
    out    PORTB, an
90
    nop
91
    call warten2
92
    out    PORTA, aus    ;alles aus
93
    out    PORTB, aus
94
    out    PORTC, an    ;alles grün
95
    out    PORTD, an
96
    nop
97
    call warten2
98
    out    PORTC, aus    ;alles aus
99
    out    PORTD, aus
100
    out    PORTA, an    ;alles orange
101
    out    PORTB, an
102
    out    PORTC, an
103
    out    PORTD, an
104
    nop
105
    call warten2
106
    out    PORTA, aus    ;alles aus
107
    out    PORTB, aus
108
    out    PORTC, aus
109
    out    PORTD, aus
110
    ldi    zaehlen, 0b00000000
111
main12:  clz
112
    out    PORTA, an    ;schrift rot  
113
    out    PORTB, an
114
    nop
115
    call warten3
116
    out    PORTA, aus    ;alles aus
117
    out    PORTB, aus
118
    call warten3
119
    inc    zaehlen
120
    cpi    zaehlen, 0b01011111
121
    brne  main12
122
    ldi    zaehlen, 0b00000000
123
main13:  clz
124
    out    PORTC, an    ;alles grün
125
    out    PORTD, an
126
    nop
127
    call warten3
128
    out    PORTC, aus    ;alles aus
129
    out    PORTD, aus
130
    call warten3
131
    inc    zaehlen
132
    cpi    zaehlen, 0b01011111
133
    brne  main13
134
    ldi    zaehlen, 0b00000000
135
main14:  clz
136
    out    PORTA, an    ;alles orange
137
    out    PORTB, an
138
    out    PORTC, an
139
    out    PORTD, an
140
    nop
141
    call warten3
142
    out    PORTA, aus    ;alles aus
143
    out    PORTB, aus
144
    out    PORTC, aus
145
    out    PORTD, aus
146
    call warten3
147
    inc    zaehlen
148
    cpi    zaehlen, 0b01011111
149
    brne  main14
150
    rjmp  main
151

152

153
; warte 1999998 Zyklen:
154
warten:    ldi  R23, $04
155
WGLOOP0:   ldi  R24, $C5
156
WGLOOP1:   ldi  R25, $EA
157
WGLOOP2:   dec  R25
158
           brne WGLOOP2
159
           dec  R24
160
           brne WGLOOP1
161
           dec  R23
162
           brne WGLOOP0
163
           ldi  R23, $01
164
WGLOOP:    dec  R23
165
           brne WGLOOP
166
      ret
167

168
; lange warten
169
warten2:  ldi  R27, $48
170
WGLOOP3:  ldi  R28, $BC
171
WGLOOP4:  ldi  R29, $C4
172
WGLOOP5:  dec  R29
173
          brne WGLOOP5
174
          dec  R28
175
          brne WGLOOP4
176
          dec  R27
177
          brne WGLOOP3
178
      ret
179
; kurz warten    
180
warten3:  ldi  R27, $0A
181
WGLOOP6:  ldi  R28, $C6
182
WGLOOP7:  ldi  R29, $C9
183
WGLOOP8:  dec  R29
184
          brne WGLOOP2
185
          dec  R28
186
          brne WGLOOP8
187
          dec  R27
188
          brne WGLOOP6
#742416
Lesenswert?

>.org 0x0100
>vor dem label init damit du sicher aus den interruptvektoren raus bist.

Ist kein SEI drin - sollte keinen Unterschied machen.

Er kann in seinem Falle sogar problemlos das
1
rjmp  init
weglassen, wenn er explizit auf das Aktivieren der Interrupts verzichten 
will.

Der Watchdog kann eigentlich kein Problem sein, da er nicht 
eingeschaltet wird ;)

Ist das Problem im Simulator nachvollziehbar?

Kannst du den Code so weit reduzieren, dass das Problem nicht mehr 
auftritt?


Noch ein paar Tipps/Anregungen unabhängig vom Problem:

Deine Dokumentation ist nicht wirklich hifreich beim Lesen des 
Programms. Ein Kommentar wie "initialisieren" sagt irgendwie nichts aus.

Gönn dir ruhig ein paar Leerzeilen, wenn ein neuer Abschnitt mit einer 
neuen Aufgabe anfängt und spendier einen Kommentar, der die Aufgabe des 
Blocks beschreibt.

Wenn du Schleifen erstellst empfehle ich diese wie in einer Hochsprache 
einzurücken:
1
; warte 1999998 Zyklen:
2
warten:
3
    ldi  R23, $04
4
    WGLOOP0:
5
        ldi  R24, $C5
6
        WGLOOP1:
7
            ldi  R25, $EA
8
            WGLOOP2:
9
                dec  R25
10
            brne WGLOOP2
11
            dec  R24
12
        brne WGLOOP1
13
        dec  R23
14
     brne WGLOOP0
15

16
     ldi  R23, $01
17
     WGLOOP:
18
         dec  R23
19
     brne WGLOOP
20
ret

Noch ein paar Kleinigkeiten:
1
LDI    R22, 0b11111111     ;initialisieren
2
; besser:
3
SER R22
4

5
LDI    aus, 0b00000000
6
; besser:
7
CLR aus

Wenn du schon Aliase für die Register verwendest (was gut ist!), 
solltest du das konsequenter Weise auch für alle anderen Register 
machen. Das vermeidet, dass du reservierte Register versehentlich mit 
anderen Aufgaben belegst und erhöht die Lesbarkeit deutlich.

Gruß

Kai
Gast #742449
Lesenswert?

Ok, Vielen rießen Dank für eure super guten Hilfen. Ich muss mich aber 
bei euch entschuldigen, es lag am µc, der war irgendwie hin. Ich habe 
einen neuen verwendet, da ging es, ich weis zwar nicht warum der andere 
µc immer von vorn angefangen hat, das ist schon komisch. Also mit dem 
neuen funktioniert es, also noch einmal vielen Dank für die vielen Tips, 
denn die nützen mir auf jeden Fall von der Übersicht her zumindest auch 
was für die nächsten Programme was.

mfg
Persönliche Seite #742536
Lesenswert?

Bleibt die Frage, warum der AVR verreckt ist.

Stefan "stefb" B. wrote:
> Wie stabil ist die Spannungsversorgung? Kann es bei so vielen Ausgaben
> sein, dass du in einen Brownout Zustand kommst?

Welchen Strom zieht dein AVR bei den vielen OUTPUT-Aktionen insgesamt 
(zeitweise arbeiten 4 PORTs als Treiber) und an den einzelnen Ports?

Vielleicht überschreitest du die max. elektrischen Daten des AVRs und 
himmelst so nach einiger Zeit jeden AVR. Wird der AVR bei längerem 
Betrieb in dem Gerät warm?
Gast #742699
Lesenswert?

Also Fuses ist kein Unterschied. Warm wird der AVR (der neue) eigentlich 
auch nicht wo wirklich.
Insgesamt ziehen die LEDs maximal 2A, aber zwischen µc und den LEDs ist 
ja noch eine Darlingotn-Scghaltung, also dürfte da auch nicht unbedingt 
was passieren.

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