www.mikrocontroller.net

Forum: Compiler & IDEs komme nicht aus der Schleife herraus :-(


Autor: Carsten R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...)

Autor: Carsten R. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
sorry, haben den quellcode vergessen...

Autor: Florian - der Flo - Scharf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interrupts muss man i.A. zurücksetzen, damit man sie ein zweites Mal
aufrufen kann. Hab aber vom 8515 keine Ahnung ;)

der Flo

Autor: Carsten R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Florian - der Flo - Scharf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Carsten R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich das auskommentiere, dann funktioniert die blinkfunktion leider
nicht mehr... *ich.komme.damit.echt.gar.nicht.mehr.weiter :-(((

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: MNR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Carsten R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;
 }
}

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Florian - der Flo - Scharf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Carsten R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.