Hallo Experten, habe hier für einen 8515 folgendes c-prog (siehe anhang). folgendes soll geschehen (ähnlich einem rs-flip-flop, mit alternierendem ausgang...) : - anlegen der spannung; --> eine led an -- funktioniert schon :-) - PORTB0 mittels Taster an Masse; --> rythmisches blinken aller leds -- funktioniert schon :-) - PORTB1 mittels Taster an Masse; --> alle leds aus -- das funktioniert nur, bei der einen led, die leuchtet, sobald die betriebsspannung anliegt. wenn sich die leds im blinkrythmus befinden, kann ich diesen nicht unterbrechen :-((( aber warum??? Gruß, Carsten (anfänger...)
Interrupts muss man i.A. zurücksetzen, damit man sie ein zweites Mal aufrufen kann. Hab aber vom 8515 keine Ahnung ;) der Flo
Hi Flo, danke fürs lesen und antworten... also ich bin wirklich anfänger und muß deswegen nochmal nachfragen. wie meinst du das mit den interrupts??? wenn ich richtig davor bin, verwende ich die ja nur um den blinkrythmus zu generieren. und das funktioniert. gruß, carsten
Achso, hab nicht richtig geguckt, ich dachte du überprüfst Tastendrücke per interrupts. Guck mal, in der Blinkschleife hast du ein for (;;) {} stehen, ist doch klar, dass du da nicht rauskommst oder? der Flo
wenn ich das auskommentiere, dann funktioniert die blinkfunktion leider nicht mehr... *ich.komme.damit.echt.gar.nicht.mehr.weiter :-(((
muss zugeben: beim kurzen ueberfliegen des codes nicht ganz durchgestiegen, also keine ahnung ob es hilft: solange der timer-interrupt-handler "laeuft" und man den couter nicht im code aendert blinkt's. scheinbar passiert so was, denn wenn die hauptschleife mittels der leeren for-anweisung "stillgelegt" wird, laeuft nur noch der overflow-ISR. es blinkt also und "sonst nix". wenn es nicht mehr blinkt liegt das daran, dass der timer wohl immer wieder auf 0 zurueckgesetzt wird in (timer()), also nie ein overflow auftreten kann. wuerde timer-init und counter zuruecksetzen trennen und die bedingungen der "ifs" nochmal pruefen.
Also 2 Endlosschleifen ist eindutig eine zuviel. Zudem ist ((start == 1) | (lauf == 1)) wohl nicht ganz richtig, eher ((start == 1) || (lauf == 1)). Logisches oder und bitweises oder sind 2 verschiedene Dinge. Die for Schleife muß in jedem Fall raus. Gruß Matthias
Hallo mthomas, hallo NMR, super, dass ihr euch das angeschaut habt... ich glaube so langsam wird mir klar, warum ich nicht aus der schleife komme. habt ihr einen ansatz, wie ich es anders machen kann??? im grunde wollte ich ein rs-flip-flop proggen, dass, wenn es gesetzt ist am ausgang """blinkt""" *ratlos...
ungetestet, "grob" und mglw. sogar einfach falsch, aber als idee vielleicht hilfreich: #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #define ALLON 0x00 #define ALLOFF 0xff volatile uint8_t gStatus SIGNAL (SIG_OVERFLOW1) { if ( TCNT1 & 0x01) PORTA=gStatus; else PORTA=ALLOFF; } void timer_init (void) { TCNT1 = 0; TCCR1B = _BV(CS11) | _BV(CS10); TIMSK = _BV(TOIE1); } int main (void) { gStatus = ALLON; DDRA = 0xff; PORTA = gStatus;// A led AL, start val DDRB = 0x00; PORTB = 0xff; // B but AL, PU ena timer_init(); sei(); while (1) { if ( !(PINB & (1<<PINB0)) ) gStatus = ALLOFF; if ( !(PINB & (1<<PINB1)) ) gStatus = ALLON; } }
sorry, in meinem beitrag "eins drueber" ist zumindest ein grober fehler. ISR sollte so aussehen (immer noch "ungetestet"): volatile uint8_t gStatus; SIGNAL (SIG_OVERFLOW1) { if ( PORTA == ALLON ) PORTA = ALLOFF; else PORTA = gStatus; } HTH, Martin
Am Einfachsten ist es meiner Meinung nach, grad wenn man noch Startschwierigkeiten hat, erstmal den Algorithmus durchzudenken, und dann erst mit dem Programmieren anzufangen. Also in deinem Fall etwa so: Erst Initialisierung. Danach: Endlosschleife: wenn Taster A --> Variable Blinker an wenn Taster B --> Variable Blinker aus Wenn "Blinker" an --> Springe in die Blinkerroutine, starte den Timer o.ä. Wenn "Blinker" aus --> Schalte alle LEDs aus. Ende Endlosschleife Blinkerroutine: globale Zählervariable++ wenn Zählervariable = Grenzwert, --> Zählervariable = 0 und gewünschte LEDs umschalten (Bits umkehren geht ja ganz einfach mit a ^= 0xff; oder eben ^= Umzukehrende_Bits) Ende Blinkerroutine Das dann in C umzumodeln ist dann nur noch Handwerk. :) der Flo
Hallo Jungs, vielen Dank für die Beträge... war die letzten Tage ein bißchen entmutig, werde mich jetzt aber wieder dransetzen. Gruß, Carsten
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.