Hallo zusammen,
ich würde gerne erreichen das bei jedem dritten Interrupt PD5 ein high
Signal ausgibt solange der Interrupt pin high ist. Leider scheint es so
das die Variable a immer auf 0 zurückgesetzt wird und der uC immer a=1
im Interrupt erkennt. An was liegt das ?
Gruß und Danke
Peter schrieb:> Leider scheint es so> das die Variable a immer auf 0 zurückgesetzt wird und der uC immer a=1> im Interrupt erkennt. An was liegt das ?
vermutlich ist der µC nur so schnell das du es nicht siehst. Hast du
einen Taster dran, wenn ja wird der interrupt wegen dem prellen mehrfach
aufgerufen.
- a muss nicht volatile wenn sie nur im interupt verwendet wird, so
sollte am besten static in der funktion liegen
- sei() in der ISR führt höchstes zu fehlern, macht aber bestimmt nicht
das was du dir erfoffst.
- warten in der ISR ist eine sehr schlechte idee.
danke für die Hinweise, dass meiste ist einfach nur aus Verzweiflung
enstanden. Wenn ich den code so ändere:
if(a == 1)
{
PORTD |= (1<<PD5);
loop_until_bit_is_clear(PIND, PD3);
a=0;
}
seh ich das Signal mit dem oszi bei jedem Interrupt nur wenn die zahl
höher wie eins ist springt er nicht mehr in die if schleife. Auch wenn
ich a=0 lösche
Peter schrieb:> nur wenn die zahl> höher wie eins ist springt er nicht mehr in die if schleife.
if(a == 1)
warum sollte er das auch machen, wenn du auf 1 abfragst?
Peter II schrieb:>> nur wenn die zahl>> höher wie eins ist springt er nicht mehr in die if schleife.>> if(a == 1)>> warum sollte er das auch machen, wenn du auf 1 abfragst?
Ich mein wenn ich eine andere Zahl dort einsetze.
Und mach mal in deine main was rein, damit du dauernde Resets erkennen
kannst.
z.B. einen 1-Sekunden Wait am Anfang, währenddessen eine LED leuchtet.
Und du hast vermutlich dem GCC nicht mitgeteilt, welchen µC du
verwendest, sonst wären deine INT1_ defines überflüssig.
Schalte die Warnings vom GCC ein, reparier alles bis der nix mehr zu
meckern findet.
Siehe erster Post :). Dort steht if(a == 3) und nichts funktioniert, bei
if(a == 1) funktioniert es. Und das verstehte ich nicht weil, jede 50 ms
ein Interrupt ausgelöst wird. Und a eigentlich von 0 bis 3 zählt und
PD3 high wird und a wieder auf 0 zurückgesetzt. Aber es scheint so wie
das in jedem sprung in den Interrupt a=0 ist, was ich nicht verstehe.
Wie gesagt, reparier erstmal deinen Code. das "sei()" in der ISR ist
z.B. sehr unschön, kann zu stack-overflows führen, und hat keinerlei
nutzen.
Dann zeig einen Kompilierbaren Code, verrate uns, welcher µC.
> PORTD |= (1<<PD5);
wie gibst du denn auf einem Portpin etwas aus, der auf Eingang gestellt
ist?
Und was hängt an deinem Eingangspin PD3? Liegt da ein sauberes Signal
mit sauberen Flanken an oder muss da mit Prellen gerechnet werden?
> int32_t a;
es gäbe da auch noch int64_t!
Hat ja sonst nichts zu tun, der kleine µC. Um bis 3 zu zählen muss man
schon ordentlich Bits spendieren.
Karl Heinz Buchegger schrieb:>> PORTD |= (1<<PD5);>> wie gibst du denn auf einem Portpin etwas aus, der auf Eingang gestellt> ist?>>>>> int32_t a;>> es gäbe da auch noch int64_t!> Hat ja sonst nichts zu tun, der kleine µC. Um bis 3 zu zählen muss man> schon ordentlich Bits spendieren.
Ganz ruhig, ich sag doch ich bin verzweifelt :).
> Und was hängt an deinem Eingangspin PD3? Liegt da ein sauberes Signal> mit sauberen Flanken an oder muss da mit Prellen gerechnet werden?
Ein schmitt trigger, saubere Steile 5V flanken.
-.-
code update
Der GCC hat noch ein paar Anmerkungen:
avr/include/util/delay.h:89:3: Warnung: #warning "F_CPU not defined for
<util/delay.h>"
avr/include/avr/signal.h:36:2: Warnung: #warning "This header file is
obsolete. Use <avr/interrupt.h>."
Warnung: »F_CPU« redefiniert
In Funktion »interrupt«:
Warnung: control reaches end of non-void function
Peter schrieb:> Leider keine Veränderung. Kann der Uc reseten ohne das man an den> Augangspins bemerkt?
kommt auf das Progamm an, das "reseten" geht ja in ein paar µC in der
Zeit sind die Ausgänge halt Eingänge das kann man aber schlecht von
aussen feststellen.
Noch mal die Frage, warum startest du nicht einfach mal den simulator?