Forum: Mikrocontroller und Digitale Elektronik Simulation funktioniert, µC aber nicht!


von Mixer (Gast)


Angehängte Dateien:

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

von AVRFan (Gast)


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.

von Mixer (Gast)


Lesenswert?

Hallo,

Danke, hab ich wohl übersehen. Auf jeden Fall funktioniert s jetzt. Den 
Fehler werd ich wohl das nächste mal nicht mehr machen.

MFG Mixer

von Kai G. (runtimeterror)


Lesenswert?

hmm... hast du rausgefunden, warum die Simulation trotzdem ging? Denke 
mal du benutzt AVRStudio, oder?

von Mixer (Gast)


Lesenswert?

Hallo,

Ja genau, AVR Studio 4.13. und dazu noch n hapsim von der 
Linksammlung
Nein, hab noch nichts herausgefunden. Aber bei der Simulation läuft das 
ohne Probleme, und es gibt ja auch keinen Schritt, wo die 4 Ausgänge 1 
haben.

MFG Mixer

von AVRFan (Gast)


Lesenswert?

Ich würde einfach den Schritt (1 bis 14) rauszufinden versuchen, der für 
die falsche Ausgabe verantwortlich ist, und dann die Instruktionen dort 
genau durchchecken.

von AVRFan (Gast)


Lesenswert?

Ah, sorry, Du hast ja geschrieben, dass es Schritt 7 ist.  Was pasiert, 
wenn Du alle 14 Schritte durch Modifikation der Sprungtabelle auf 
Schritt 7 lenkst?

von Christoph S. (mixer) Benutzerseite


Angehängte Dateien:

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

von Christoph S. (mixer) Benutzerseite


Lesenswert?

Hallo,

weis niemand, woran das liegen kann? Ist der µC defekt, oder läuft die 
Simulation im AVR-Studio falsch?

Danke im Vorraus für eure Antworten

MFG Mixer

von Mixer S. (Gast)


Lesenswert?

Hallo,

funktioniert immer noch nicht, weiss denn niemand einen Rat?

MFG Mixer

von Karl H. (kbuchegg)


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.

von Mixer S. (Gast)


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

von Johannes M. (johnny-m)


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?

von Mixer S. (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

Interruptroutinen, wie  'timer_overflow' müssen mit 'reti' nicht mit 
'ret' beendet werden.

von Karl H. (kbuchegg)


Lesenswert?

spess53 wrote:
> Hi
>
> Interruptroutinen, wie  'timer_overflow' müssen mit 'reti' nicht mit
> 'ret' beendet werden.

:-)
Den hab ich auch gesehen. Und er wahrscheinlich selber
auch.
Aber schau mal in die main Schleife


loop:   sei
        rjmp loop

:-)

von Christoph S. (mixer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,

das habe ich bereits verbessert, siehe oben!!
Allerdings für die falsche Ausgabe der LEDs hab ich noch keine 
vernünftige Antwort bekommen!!

MFG Mixer

von Kai G. (runtimeterror)


Lesenswert?

Bist du sicher, dass du für die Simulation genau den Controller 
eingestellt hast, den du auch in der Praxis mit dem Code fütterst?

Ich teste den Code jetzt mal mit ATMega8

von Christoph S. (mixer) Benutzerseite


Lesenswert?

Ja, hab einen ATmega8 im AVR Simulator eingestellt!!

von Kai G. (runtimeterror)


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

von AVRFan (Gast)


Lesenswert?

@Mixer:

Den Vorschlägen von Kai ist nix hinzuzufügen.  Bleib dran, ich bin mir 
sicher, dass Du den Fehler früher oder später gefunden hast.

von ka-long (Gast)


Lesenswert?

Blöde Frage:

Da ich jetzt nicht mitgekommen bin, was jetzt in der Simu passiert und 
was am realoen Mega...

Ist vielleicht nur die LED kaputt, kalte Lötstelle ?

Gruß ka-long

von Christoph S. (mixer) Benutzerseite


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

von Paul Baumann (Gast)


Lesenswert?

Am Sonntag vor dem Mittagessen
kann man gut den Kurzschluß messen.
Dagegen: Bei Fehlersuche nachts um Eins
macht oftmals sich zum Heinz!

(alte Volksweisheit)

;-))

Paul

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.