Hey Leute,
bin grad dabei mir C programmierung bei zu bringen mit einem Arduino
Uno. Ich hab ein code geschrieben mit dem man mit einem Taster druck in
eine lauflicht schleife geht und mit dem gleichen taster druck diese
schleife wieder unterbricht aber ich bekomms nicht hin diese schleife zu
unterbrechen. Der bleibt in der schleife hängen und ich habs bisher
nicht hin bekommen diese zu unterbrechen. Vielleicht kann mir einer von
euch helfen :). Hier der code:
char lauflicht(void)
{
while(1)
{
PORTB = 0x01;
_delay_ms(100);
PORTB = 0x02;
_delay_ms(100);
PORTB = 0x04;
_delay_ms(100);
PORTB = 0x08;
_delay_ms(100);
PORTB = 0x10;
_delay_ms(100);
PORTB = 0x20;
_delay_ms(100);
PORTB = 0x40;
_delay_ms(100);
PORTB = 0x80;
_delay_ms(100);
}
}
int main(void)
{
DDRB = 0xFF;
DDRD = 0xFF;
while(1)
{
if(PIND & (1<<PD2))
{
lauflicht();
} else
{
PORTB = 0x01;
}
}
}
Wie man sieht steht da nichts was auf eine unterbrechung hinweißt, das
liegt daran das ich den code raus genommen hab, weil nichts
funktioniert. Ich hoffe einer kann mir helfen :)
char lauflicht(void)
{
while(1)
{
lauflicht() wird nie wieder verlassen. Deshalb geht das mit
deinem Taster nicht.
Dennis schrieb: > DDRD = 0xFF; Damit definierst du alle Pins an PortD auf Ausgang - vermutlich willst du das nicht. Dennis schrieb: > lauflicht(); Siehe vorheriges Posting von holger. Die Abfrages des Knöpfchens checkt auch im Moment auf Taster gegen Plus. Bitte poste mal deine Verdrahtung. Ebenso sollte es auch noch eine Fehlermeldung geben, weil lauflicht() einen return Wert vom Typ char hat. Sollte sowas wie 'Control reaches end of non-void function' bringen.
Ich weiss das er momentan die while schleife nicht verlassen kann. Aber mit if und break könnte man doch vlt daraus kommen oder nicht ?! Hab meine verdrahtung als anhang, ich hoffe man kann alles erkennen.
>Ich weiss das er momentan die while schleife nicht verlassen kann.
Bau lauflicht() um:
1 | void lauflicht(void) |
2 | {
|
3 | static uint8_t state = 0; |
4 | |
5 | state++; |
6 | switch(state) |
7 | {
|
8 | case 1: PORTB = 0x01; break; |
9 | case 2: PORTB = 0x02; break; |
10 | case 3: PORTB = 0x04; break; |
11 | case 4: PORTB = 0x08; break; |
12 | case 5: PORTB = 0x10; break; |
13 | case 6: PORTB = 0x20; break; |
14 | case 7: PORTB = 0x40; break; |
15 | case 8: PORTB = 0x80; state = 0; break; |
16 | default: state = 0; break; |
17 | }
|
18 | _delay_ms(100); |
19 | }
|
@ Dennis (Gast) >Ich weiss das er momentan die while schleife nicht verlassen kann. Aber >mit if und break könnte man doch vlt daraus kommen oder nicht ?! Hab >meine verdrahtung als anhang, ich hoffe man kann alles erkennen. Naja, ein paar LEDs kann man sich gerade noch so ohne Bild vorstellen. Dein Problem liegt im mangelnden Grundlagenwissen. Das sieht sieht man schon bei Mitternacht an deinen vielen _delay_ms() ;-) Lies den Artikel Multitasking, dann wirst du dein Problem lösen können.
@ holger (Gast) >>Ich weiss das er momentan die while schleife nicht verlassen kann. >Bau lauflicht() um: Vorsagen war schon in der Schule Mist. Der OP sollte sich selber mal ne Kopf machen, wenn man ihn die richtigen Stichworte gibt. Nur selber denken macht geistig fett (tm).
>Vorsagen war schon in der Schule Mist. Der OP sollte sich selber mal ne >Kopf machen, wenn man ihn die richtigen Stichworte gibt. Er wird schon merken dass das auch noch nicht optimal ist. Darüber kann er dann immer noch nachdenken;)
Um mal ein weiteres Stichwort zu liefern: Ich würde das ganze mit einer For-Schleife machen. Und innerhalb der For-Schleife das Aktualisieren der LEDs machen und direkt anschließend abfragen, ob ein Taster gedrückt wurde. So als Idee für einen offensichtlichen Anfänger. Jeder fängt eben mal klein an ;)
Stefan S. schrieb: > For-Schleife Das ist auch nur eine verkappte While-Schleife.
1 | for(int i=0; i<10; i++) {} |
1 | {
|
2 | int i=0; |
3 | while(i<10) { |
4 | |
5 | i++; |
6 | }
|
7 | }
|
Dennis schrieb: > meine verdrahtung als anhang, ich hoffe man kann alles erkennen. nö, ist + irgendwie beschaltet? ich sehe den Taster nach + aber an + sehe ich nichts Shifttaste defekt?
Hi Joachim B. schrieb: > ich sehe den Taster nach + aber an + sehe ich nichts Rechts kann man auf der oberen Versorgungsbahn eine Anschluß-Platine erahnen. Brille nicht geputzt? :) MfG
AVRs sind mit Tastern gegen Plus etwas anspruchsvoller, da muss dann nämlich noch ein extra Pulldown mit ein paar kOhm vom Portpin gegen Masse. Die meisten anderen von uns verdrahten ihre Taster gegen Masse, aktivieren den internen Pullup des AVR und fragen dann auf 0 statt auf 1 ab. Übrigens ein wenig obacht. Wenn der Taster gegen +5V schaltet, der MC aber nur mit 3,3V gespeist wird, geht das nicht gut aus.
Patrick J. schrieb: > Rechts kann man auf der oberen Versorgungsbahn eine Anschluß-Platine > erahnen. > Brille nicht geputzt? doch, erahnen kann man vieles, aber hier sinnlos rumraten ist oft wenig hilfreich. Es gibt genug faule Threads die niemanden helfen weil alle Hilfswilligen ihr eigenes Schaltbild DENKEN :P
Das ist einfach mit einer Statemachine zu realisieren. Dann kann man auch noch ein bisschen mit verschiedenen Arten von Lauflichtern das ganze probieren.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
