Forum: Mikrocontroller und Digitale Elektronik Nochmal Frage zum Assemblerporgramm ATmega16


von Heiner H. (Gast)


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

von Georg C. (citkid)


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?

von Karl H. (kbuchegg)


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.

von Heiner H. (Gast)


Lesenswert?

ja im Simulator habe ich schon alles ausprobiert. DAs ist ja das 
komische. Dort funktioniert alles.
Wie ist das mit der Watchdog? Ist die von allein angeschaltet?
Und as passiert dann?

von Karl H. (kbuchegg)


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.

von Heiner H. (Gast)


Lesenswert?

Ich habe an den Fusebits das JTAGEN ausgestellt. Weil sonst der PORTc 
nicht funktioniert.

von Karl H. (kbuchegg)


Lesenswert?

Mein Fehler.
Der Mega16 hat gar keine Watchdog Fuse.

von Gast (Gast)


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...

von Karl H. (kbuchegg)


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?

von Gast (Gast)


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.

von Gast (Gast)


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.

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

von Gast (Gast)


Lesenswert?

Genau ;-)
Das ist ein ziemlich tückischer Fehler.
Ich empfehle, mit
SEC
ROL schiebe
für klare Verhältnisse zu sorgen.

von Karl H. (kbuchegg)


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.

von Georg C. (citkid)


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.

von Georg C. (citkid)


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.

von Gast (Gast)


Lesenswert?

PB1, PB2 und PB5?
Verdrahtung prüfen.
LEDs prüfen.
Die betreffenden LEDs sind richtig gepolt?

von Georg C. (citkid)


Lesenswert?

Gast wrote:
> Die betreffenden LEDs sind richtig gepolt?
Und wie ist das mit Kurzschlüssen zwischen den Pins?

von Gast (Gast)


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.

von Michael W. (wiebel42)


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

von Gast (Gast)


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. :-)

von Heiner H. (Gast)


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

von Otto (Gast)


Lesenswert?

> Das komische ist ja aber auch, das das Programm
> dann einfach von vorne anfängt.

stellt sich die Frage nach der Spannungsversorgung - wie sieht die denn 
aus ?

Gruss Otto

von Heiner H. (Gast)


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

von Otto (Gast)


Lesenswert?

wie sieht die Spannungsversorgung aus ?

von Heiner H. (Gast)


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.

von Otto (Gast)


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

von Heiner H. (Gast)


Lesenswert?

ich meine wenn ich es in den Computer stecken will.
extra zu den anderen komponenten

von Otto (Gast)


Lesenswert?

Naja - funktionieren wird es, Du solltest nur den Strompfad zu Deiner 
Schaltung seperat absichern (z.B. mit 2A), denn ein Computernetzteil hat 
"richtig" Power.....

Otto

von Heiner H. (Gast)


Lesenswert?

Wieso, diese schaltung zeiht doch nur so viel wie sie brauch.
oder ist gerdae das das problem?
eigentlich doch nicht.

von Otto (Gast)


Lesenswert?

Aber wenn es einen "Kurzen" gibt, liefert so manches SN 30A auf der 5V 
Schiene und das kokelt ganz nett.....

Otto

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.