Simulation funktioniert, µC aber nicht!

Gast #716288
Lesenswert?

Hallo,

ich befasse mich erst seit kurzem mit Mikrocontrollern, und habe bis 
jetzt nur das tutorial durgearbeitet. Jetzt hab ich mein erstes Programm 
geschrieben.

An Port B sind 8 LEDs, die durchlaufen (Stichwort Knight Rider). 
Allerdings werden noch die zwei letzten leds mit software-pwm gedimmt, 
um ein "Nachglühen" zu simulieren. Zusätzlich wird ein Poti mit dem ADC 
eingelesen, um die Geschwindigkeit der LEDs zu verändern.

ADC ist beschaltet wie im tutorial beschrieben mit interner 
referenzspannung und kondensator.
die 8 LEDs sind an Port B mit gem. Masse, d.h. eine 1 am Ausgang lässt 
die LED leuchten.

Das Programm läuft in der Simulation so wie es soll, aber auf dem µC 
sieht der Schritt 7 so

oooo----

anstatt

-ooo----

aus. Das ist in der Simulation nicht so!
Ist da ein Programmierfehler oder ist es etwas anderes??

Danke im voraus für eure Bemühungen und Antworten!

MFG
Mixer

P.S. Wenn ich in der Endlosschleife kein "sei" steht, hat ein interrupt 
bei einem timer overflow keine wirkung!!
Angehängte Dateien:
Gast #716293
Lesenswert?

>P.S. Wenn ich in der Endlosschleife kein "sei" steht, hat ein interrupt
>bei einem timer overflow keine wirkung!!

Interrupthandler verläßt man ja normalerweise auch mit "reti" statt 
"ret", damit eben das I-Bit im SREG wieder gesetzt wird.
Persönliche Seite #717702
Lesenswert?

AVRFan wrote:
> Was pasiert,
> wenn Du alle 14 Schritte durch Modifikation der Sprungtabelle auf
> Schritt 7 lenkst?

Hallo,

genau das, was im bild ist. Die simulation zeigt jedoch das, was 
passieren sollte:

-ooo----

Allerdings kann ich im Schritt 7 nichts finden, dass da noch ein anderer 
Schritt aktiviert wird. Hab ich da was übersehen?

MFG Mixer
Angehängte Dateien:
#719742
Lesenswert?

Um ehrlich zu sein, ist mir dein Programm zu konfus mit all den
vielen Jumps um das jetzt in Gedanken durchzugehen und zu überlegen,
was das Problem sein könnte.

Ich würde: alles wegschmeissen und noch mal neu anfangen.
Allerdings nicht alles in einem Zug implementieren sondern
Schritt für Schritt immer mehr Features hinzufügen. Ganz
wichtig: zwischendurch immer wieder testen.

Wenn du Pech hast, taucht derselbe Effekt wieder auf. Aber
dann weist du, durch welche Änderung der Effekt hineingekommen
ist und kannst gezielt überlegen, was das Problem mit dieser
einen, kleinen, Änderung ist.
Gast #719745
Lesenswert?

Ganz einfach: Das Problem ist bei
1
LED7:
2
    ldi temp, 0b01110000
3
    cp PWMCount, PWM0
4
    brlt LED71
5
    andi temp, 0b01100000
6
LED71:
7
    cp PWMCount, PWM1
8
    brlt out7
9
    andi temp, 0b01000000
10
out7:
11
    out PORTB, temp
12
    reti

und dabei schaltet er die led 8, die hier ob"0"1110000 sein sollte auch 
ein. Aber hald nur auf dem Mega8 und in der Simulation nicht!!
#719753
Lesenswert?

Mixer S. wrote:
> Aber hald nur auf dem Mega8 und in der Simulation nicht!!
Wie jetzt, ich dachte, es läuft in der Simulation, aber nicht auf dem 
µC? Jetzt plötzlich umgekehrt?

Du weißt auch, dass PB7 als Anschluss für einen externen Quarz dient, 
wenn die CKSEL-Fuses entsprechend gesetzt sind, und dass dieser Pin dann 
nicht als Ausgang zur Verfügung steht?
Gast #719761
Lesenswert?

Der PB7 schaltet auf dem Mega8 und in der Simulation nicht. Schalten 
soll er aber nicht. Erst im nächsten Schritt. Und der läuft richtig!

Hab einen internen Takt von 4 MHz in den fuses eingestellt!!

MFG Mixer
#720406
Lesenswert?

Die Simulation ergibt Folgendes
1
cycle       time   port mask
2
 307 -  76,75 µs - 01110000
3
 377 -  84,25 µs - 01110000
4
 569 - 142,25 µs - 01110000
5
...
6
...
7
1337 - 334,25 µs - 01100000
8
1593 - 398,25 µs - 01100000
9
...
10
...
11
...
12
...
13
...
14
...
15
...
16
...
17
...
18
...
19
4409 - 1102,25 µs - 01000000
20
... laaaaaaaaaange Pause und dann zurück nach oben

Ich habe den Code gerade mal bis 1 s Realzeit durchsimuliert und bekomme 
nur die Patterns:
01110000
01100000
01000000
welche alle in Zeile 213 gesetzt werden. Alle anderen Out-Befehle werden 
wegen deiner Modifikation nicht ausgeführt, das oberste Bit (PB7) wird 
nie gesetzt. Also Bestätigung von meiner Seite.

Hast du mal versucht die LEDs einzeln anzusteuern? Also einmal alle aus, 
nur PB7, nur PB6, etc... ?
1
ldi r16, 0b00000000
2
out PORTB
3
loop: rjmp loop
1
ldi r16, 0b10000000
2
out PORTB
3
loop: rjmp loop
1
ldi r16, 0b01000000
2
out PORTB
3
loop: rjmp loop
etc.

- Ist Stufe 7 die einzige oder nur die erste die nicht funktioniert?
- Was passiert, wenn du die Masken in Stufe 7 alle auf 0 setzt?
- reduzier mal den Code so lange, bis das Problem verschwindet - gerade 
jetzt wo nur Stufe 7 angesprungen wird kannst du die anderen mal 
rausnehmen.
- Ist das richtig, dass Stufe 2 nicht wie die anderen Stufen formuliert 
ist?
- Lass mal testhalber den ADC raus.
- habe var gessen, was ich gerade wollte... ach ja: die linke LED wirkt 
auf dem Foto dunkler als einige anderen. Hast du die mal mit 'nem Oszi 
durchgemessen, was da für ein Signal im Vergleich zu den anderen 
anliegt? Alternativ nach Möglichkeit die Timer so langsam machen, dass 
man die LEDs beim Schalten beobachten kann.
- Wenn der Vergleich in Zeile 15 fehlschlägt, bricht der zu "rjmp LED1" 
durch. Bitte dokumentieren, dass das nicht passieren darf. Besser wäre 
hier eine Fehlerbehandlung oder ein unbedingter Sprung -> potenzielle 
Fehlerquelle.

und wo ich eh gerade an deinem Code am rumnörgeln bin: Assembler ist 
eigentlich eine wunderschöne Sprache - bitte bring etwas Ordunng in 
deinen Code, insbesondere, wenn er nicht rund läuft. Wie Mister 
Buchegger schon erwähnt hat steigt dadurch auch die Lust, dir zu helfen, 
und es zeigt, dass du dir Mühe gegeben hast. 
Geschwindigkeitsoptimierungen zu Lasten der Lesbarkeit kann man immer 
noch später einbauen, wenn notwendig. Nutze die Makro-Fähigkeiten des 
Assemblers - ist besser zu dokumentieren. du hattest ja geschrieben, 
dass du Neuling bist - nimm's also als Verbesserungsvorschlag auf.

Einige deiner Code-Snippets sind etwas merkwürdig:
1
in ADCin, ADCL
2
clr ADCin
3
in ADCin, ADCH
warum clearst zu den Register, wenn du ihn direkt danach mit einem neuen 
Wert überschreibst? Warum wird ADCL überhaupt ausgelesen, wenn es eh 
nicht verwendet wird?
"If the result is left adjusted and no more than 8-bit precision is 
required, it is sufficient to read ADCH." - Seite 198 im Datenblatt
Du kannst ADCH ganz normal auslesen.

Ich empfehle immer alle Interrupt-Vektoren zu definieren und die 
ungenutzen auf ein iret oder eine Fehlerbehandlung umzuleiten. Wenn 
versehentlich Interrupts ausgelöst werden, die du nicht möchtest, 
verursacht das keine sporadischen Resets oder andere schwer 
diagnostizierbare Verhalten. Beispielcode findest du auf Seite 47.

Schöne Grüße

Kai
Persönliche Seite #722909
Lesenswert?

Hallo,

Habe jetzt das Programm ohne die Software-PWM ausprobiert und einen 
ähnlichen Fehler festgestellt! Dann hab ich mir mal meine 
Streifenraster-Platine von unten angeschaut, und festgestellt, dass da 
eine Leiterbahn-Unterbrechung nicht ganz in Ordnung ist. Habe diese mit 
m Skalpell ein bisschen nachbearbeitet und schon funktioniert alles ohne 
Probleme!!

Danke nochmal für eure Bemühungen!!

MFG Mixer

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