www.mikrocontroller.net

Forum: Compiler & IDEs Denkfehler mit Servo über Timer0?


Autor: Dirk W. (bastelator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

irgendwo habe ich bei der Ansteuerung eines Servos via Timer0 einen 
Denkfehler drin. Kann mir jemand einen Hinweis geben?

Das ganze schien mir sooo schön einfach :(

Gruß,
Dirk



[...]
int main (void) {
OSCCAL = eeprom_read_byte(0x00);

DDRB|=(1<<PB0);
PORTB&=~(1<<PB0);

TCCR0B = (1<<CS01); //Teiler 8 --> 1.000.000 Hz
TIMSK = (1<<TOIE0); //Overflow-Interrupt
TCNT0 = 0x00-100;   //10.000 Hz bei 100Bit Overflow
sei();

  for (;;) {

  delay_ms_(1000);
  servowert = 10;
  delay_ms_(1000);
  servowert = 20;

  }

}



SIGNAL(SIG_OVERFLOW0)
{
TCNT0 = 0x00-100;    //10.000 Aufrufe/sec  --> alle 0,1msec
timer0temp++;      //--> 200 Aufrufe für 20 msec

  if (timer0temp <= servowert){  //servowert zwischen 10 (1ms) und 20 
(2ms)
      PORTB|=(1<<PB0); //ein
  }else{
      PORTB&=~(1<<PB0); //aus
  }

  if (timer0temp == 200)  timer0temp = 0;

}

Autor: Björn R. (sushi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hab gerade keine Zeit mir deins ganz durchzulesen, aber schau 
doch mal auf meiner Homepage, da gibts den Quellcode für nen 
Servotester. In C und auch mit dem Timer gemacht. Sieht mir genau aus 
wie das was du vor hast. Einfach mal angucken, vielleicht hilfts dir ja. 
Der link zum Artikel: 
http://modellbau.bug-soft.net/index.php?cat=et&art...
Ich guck morgen nochmal hier rein, wenn ich Zeit hab, und guck obs 
geklappt hat. Wenn nicht stehe ich zur Verfügung, weil ich das mit dem 
Servo schon fertiggebracht habe und dann vielleicht auch mal helfen kann 
g
Aber davon jetzt nicht abschrecken lassen es nochmal selbst zu 
versuchen!
LG, Björn

Autor: Dirk W. (bastelator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Björn,

danke für den Link, ich wollte das ganze aber nur mit dem 
Overflow-Interrupt lösen (mal schauen, ob das geht). Per Hardware-PWM 
habe ich das auf einem Mega32 auch schon einmal hinbekommen, ist aber 
eine Weile her.

Ein bisschen weiter bin ich schon: Der Servo funktioniert mit dem o.g. 
Programm, alle Änderungen der relevanten Variablen werden aber 
ignoriert. Er stellt sich immer auf den Initialwert ein. Vermutlich ist 
die Interrupt-Schleife zu lange, auch wenn ich mir das nicht so richtig 
vorstellen kann. Evtl. zieht der Servo den AVR auch ständig in den Reset 
wg. Strombedarf. Werde morgen mal den Oszi anwerfen. Die einfache 
Timer0-Overflowschleife funktioniert aber im Prinzip -- und man kann sie 
noch für andere Timingzwecke missbrauchen.

Beste Grüße und gute Nacht,
Dirk

Autor: Björn R. (sushi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du auch das volatile bei der deklaration von servowert nicht 
vergessen?!?

Autor: Dirk W. (bastelator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AAAAAHHH! Björn, Du bist mein Held des Tages! Das wird's sein, jetzt 
setze ich mich noch einmal kurz dran.

Das kommt davon, wenn man einen Germanisten auf µCs loslässt ;)

[... 1min später...]

Ja, das wars.

Tausend Dank und beste Grüße,

Dirk

p.s.: Für's Forenarchiv: Codefragment im Anhang (gewiss optimierbar, 
aber läuft jetzt)

Autor: Dirk W. (bastelator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
s. Anhang (ging nicht mit Editierfunktion)

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.