Forum: Mikrocontroller und Digitale Elektronik Unerwünshcter Reset im Programm Mega 16


von Heinz (Gast)


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

von Martin (Gast)


Lesenswert?

hast du eine endlosschleife am ende? Wenn nicht, läuft der MC sonstwohin 
und kann neustarten.

von Kai G. (runtimeterror)


Lesenswert?

Also
1
stop:
2
    rjmp stop

(Label und Befehl in einer Zeile ist unhübsch)

von Martin (Gast)


Lesenswert?

hast du irgentwo ein push ohne pop? dann funktioniert der call nichtmehr 
und die rücksprungadresse kann futsch sein.

von Heinz (Gast)


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.

von Heinz (Gast)


Lesenswert?

Push habe ich eigentlich auch nirgendwo verwendet.
Kann das sein, das das irgendwie mit der Watchdog oder so zusammenhängt, 
ich wüsste da aber auch nicht weiter.

von Timmey (Gast)


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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Wie sieht denn das ganze Programm aus? So stochert man im Dunkeln.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> ich habe einen Ausschnitt aus meinem Programm:

In dem Ausschnitt ist kein Fehler, der zu einem Reset führt. Wenn es 
einen Reset gibt, kommt der aus einem anderen Programmteil.

von Heinz (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

Sieh dir mal 'Warten3' an. Provoziert zwar keinen Reset. Aber Trotzdem.

MfG Spess

von Timmey (Gast)


Lesenswert?

Naja, das RET von Warten3 wird hoffentlich nur verloren gegangen sein..

Und der jmp in die andere Warte-Routine .. naja ... ;)

von spess53 (Gast)


Lesenswert?

Hi

Das auch. Ich meinte das 'brne WGLOOP2'.

MfG Spess

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Zwischen main8 und main9 ist auch noch ein Fehler (Initialiserung von 
schieb2). Ist aber unerheblich bzgl. der vermuteten Reset-Problematik.

Wie stabil ist die Spannungsversorgung? Kann es bei so vielen Ausgaben 
sein, dass du in einen Brownout Zustand kommst?

von Franz (Gast)


Lesenswert?

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

.org 0x0000
rjmp init

.org 0x0100
init:

von Kai G. (runtimeterror)


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

von Heinz (Gast)


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

von Stefan B. (stefan) Benutzerseite


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?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Untersuche mal die Fuses auf dem vermeintlich verreckten Controller, ob 
die sich von denen des neuen in irgendeiner Weise unterscheiden. 
Vielleicht liegt da der Hund begraben.

von Heinz (Gast)


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.

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.