Hallo liebes Forum!
Ich bin ein wenig am verzweifeln, hab schon den halben Tag gesucht und
nix gefunden: An meinem Attiny13 hängt ein Schieberegister. Mein
Programm funktioniert wie es soll. Nun habe ich das Problem, dass nach
(zufälliger?) Zeit die Pins beim SIPO kurz anschalten.
Was ich schon versucht habe:
-im Programm nur Sipo angesteuert: funktioniert, deswegen muss auch SIPO
funktionieren
-Widerstand an Strobe von SIPO gehalten: funktioniert nicht, AVR-Pins
gehen also nicht in tristate.
-Bei rcall AUSGABE die Ausgabe ans SIPO auf einen bestimmten Wert
gezwungen: funktioniert nicht: der Fehler kann nicht bei meinem
Unterprogramm rcall AUSGABE liegen.
-Es werden aber sonst keine Portpins geschalten!?!?
-Es tritt auch kein Reset auf.
Ich würde mich freuen wenn noch jemand eine Idee hat!!!
Was ich noch weiß:
Attiny ist im sleep. Er wird durch WD-Timer geweckt (ca. 0,5s). Bei
wecken (WD-interrupt) wird was mit adc gemessen... Danach wird Flag für
Anzeigemodus gesetzt. Danach reti. Jetzt springt er ins Hauptprogramm
Main. Dort wird Flag ausgewertet und er springt wieder zum Anzeigemodus.
Diese falsche SIPO-Ausgabe muss zwischen dem Flag setzen und dem
Anzeigemodus passieren.
Ich hab noch was rausgefunden: Es muss mit den Interrupts
zusammenhängen: wenn ich in meinem Unterprogramm Interrupts verbiete
(cli und zum schluss sei), so hab ich diese Probleme nicht.
Wo liegt die Ursache? ich hab doch alle register schön gesichert?!?!
Helmut H. schrieb:> Was passiert wenn der ADC Conversion Complete Interrupt auftritt?> würde das auskommentierte mal durch ein RETI ersetzen.
dieser Interrupt ist disabled. Und ich hab auch schon mal das ganze
adc-Zeugs auskommentiert: hilft leider nichts.
GLeich vorweg.
Dein Code ist zu umfangreich, als das ich ihn hier im Kopf auf alle
Eventualitäten abklopfen könnte.
Aber hier ist mir, im Zusammenhang mit deinem letzten Posting, etwas
aufgefallen
Du rufst
1
TESTMODUS:
2
push rTemp1 ;SREG und rTemp sichern
3
in rTemp1, SREG
4
push rTemp1
5
6
ldi rSIPO, 0b00101111 ;SV und LEDs ein
7
rcall AUSGABE
8
TES_LOOP:
9
wdr
10
sbis PINB, 3 ;Taster noch gedrückt?
11
rjmp TES_LOOP
12
13
pop rTemp1 ;SREG und rTemp wiederherstellen
14
out SREG, rTemp1
15
pop rTemp1
16
reti
die Funktion AUSGABE aus dem Interrupt heraus auf.
Was, wenn die Funktion Ausgabe gerade läuft, die ersten Bits
rausgetaktet hat, dann kommt der Interrupt und leiert seinerseits wieder
die Ausgabe an.
Dann kommt alles durcheinander.
Stell sicher, dass du für Shared Resources (also alles was es nur ein
einziges mal gibt, so wie das Schieberegister) immer einen einzigen
gesicherten Pfad hast, der einzig und ausschliesslich benutzt wird.
Nicht so wie hier, dass eine Ausgabe durch einen Interrupt unterbrochen
werden kann, der dann selbst wieder eine Ausgabe macht. Das ist ein
Garant für Ärger.
Tus nicht. Du öffnest die Büchse der Pandora.
Es gibt nur eine Stelle, an der Aufrufe an AUSGABE gemacht werden
dürfen. Und das ist die Hauptschleife. Oder alternativ: es gibt nur und
ausschliesslich Aufrufe dieser Funktion in ISR-Routinen.
Aber auf keinen Fall in beidem: Hauptschleife und ISR.
Karl Heinz schrieb:> die Funktion AUSGABE aus dem Interrupt heraus auf.> Was, wenn die Funktion Ausgabe gerade läuft, die ersten Bits> rausgetaktet hat, dann kommt der Interrupt und leiert seinerseits wieder> die Ausgabe an.
Ja klaaar! Ich bin ja ein Depp! Der halbe Tag fürn A... :-D Das passiert
mir mit sicherheit nicht nochmal!
Karl Heinz schrieb:> Tus nicht. Du öffnest die Büchse der Pandora.> Es gibt nur eine Stelle, an der Aufrufe an AUSGABE gemacht werden> dürfen. Und das ist die Hauptschleife. Oder alternativ: es gibt nur und> ausschliesslich Aufrufe dieser Funktion in ISR-Routinen.> Aber auf keinen Fall in beidem: Hauptschleife und ISR.
Ok, du hast absolut recht. Ich denke ich machs hier mal quick and dirty
und disable die Interrupts am Anfang der Ausgabe und enable sie am ende
wieder.
Ein herzliches Dankeschön!