www.mikrocontroller.net

Forum: Compiler & IDEs Bedingung wird manchmal nicht wahr


Autor: ichmalwieder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, ich hoffe ihr könnt mir helfen.. :-)

ein tiny 13 mit 9.6 MHz steuert einen Schrittmotor an, dieser soll 
zwischen zwei positionen hin- und herfahren. das klappt soweit, 
allerdings: den richtungswechsel macht er 3 mal, das vierte mal erkennt 
er nicht und läuft immer weiter. warum?

volatile uint8_t dir=0, speed = 128;
volatile uint16_t position = 32000, stop_l=31000, stop_r=33000;


ISR(TIM0_COMPA_vect)
{
  const uint8_t steps[4] = {STEP_PATTERN};
  static uint8_t step;                                
  OCR0A = TCNT0 + speed;                              
  
  if(dir)
  {
    if (step < 3)
      step++;
    else 
      step=0;
      
    position++;
  }
  else
  {
    if (step > 0)
      step--;
    else 
      step = 3;
      
    position--;
  }

  STEPPER_PORT = (STEPPER_PORT & ~STEP_MASK) | steps[step];  
  
}


es gibt ausserdem den overflow interrupt, in dem aber nichts mit diesen 
variablen geschieht. der timer läuft mit prescaler 256

in der main ist folgendes:
while(1)
  { 
    sleep_mode();
    
    if(switch_closed(1<<KEY))
    {
      dir = !dir;
    }
    
    cli();
    if(position == stop_l || position == stop_r)
    {
      dir = !dir;
    }
    sei(); 
    
    
    
  }

es macht keinen unterschied, ob hier die interrupts ausgeschaltet 
werden.
manuelle richtungswechsel werden immer erkannt.

mit stop_r=32999 erkennt er schon den zweiten wechsel nicht.

ich verstehe nicht, wieso diese überprüfung fehlschlägt :-(

Autor: ichmalwieder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich die bedingung auf

if(position <= stop_l || position >= stop_r)

ändere, funktioniert es natürlich. das heisst, der moment, in dem die 
bedingung war erkannt würde kommt nicht, weil die prüfung davor und 
danach stattfindet.

ahh, vielleicht in dem fall, dass der overflow-interrupt den sleep-mode 
beendet, die überprüfung stattfindet, und der schrittmotor-interrupt 
dann zweimal hintereinander auftritt. schon wird der entscheidende punkt 
überschritten.

das ist ja fies!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich überschaue jetzt grad auf die Schnelle nicht, was da alles 
schieflaufen kann, aber die Abfrage für den Drehrichtungswechsel würde 
ich allein aus Sicherheitsgründen eher so schreiben:
if(position <= stop_l || position >= stop_r)
    {
      dir = !dir;
    }
Abfragen auf exakte Gleichheit sind meist etwas riskant...

Was ist das mit dem "switch_closed"?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Och, kuck mal da...

Autor: ichmalwieder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Johannes,

danke für deinen Beitrag. Allerdings sollte es schon schrittgenau sein.. 
muss dann eben mit in die ISR.

Das switch_closed() ist aus den Entprellroutinen von P. Dannegger

Autor: Daniel Held (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahrscheinlich funkt ein Interrupt dazwischen.
Bei dem Entprellen der Tasten werden außerdem die Interrupts 
deaktiviert.. und wenns dann mal zusammentrifft is Schluß.

Autor: ichmalwieder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Daniel, die Ursache für das Problem habe ich schon gefunden, steht 
weiter oben.. Trotzdem danke für Deinen Hinweis!

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.