www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sabertooth atmega32 avr-gcc


Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe mir eine Sabertooth Platine bestellt und versuche mich gerade bei 
der Ansteuerung. Die Platine kann zwei Motoren via PWM ansteuern. Diese 
Platine wollte ich per R/C Code (Modelbau) ansteuern.
Signal Länge 20ms
Vorwärte PinX 2ms High
Stopp PinX 1,5ms High
Rückwärts PinX 0,9ms High

Die PWM funktion in diesem AVR kann ich nicht nutzen da diese zu schnell 
ist, also habe ichs anderes Versucht.

Folgender Code der nicht funktioniert ...
ISR (TIMER2_COMP_vect)
{
  us+=10;
  if(us==20000){ us=0; }


      if(us==0){
      PORTD |= (1<<PD4);
    }
    if(us==900){
      PORTD |= (0<<PD4);
    }
}

int main(void){
  us=0;

// Initialisierung:
  TCCR2 = (1<<CS20) | (1<<WGM21);  // Prescaler von 1 | CTC-Modus
  OCR2  = 79;            // Vergleichswert
  TIMSK |= (1<<OCIE2);      // Interrupt aktivieren
  sei();
  
  DDRD |= (1<<PD4) | (1<< PD5);

  while(1)
  {

  }
}

Vielen Dank für die Hilfe

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..der Mikrocontroller läuft auf int Osc 8MHz. Hatte ich vergessen

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph schrieb:
> PORTD |= (0<<PD4);

Das tut genau gar nichts.  Mach' Dich mal kundig, wie man ein Bit 
zurücksetzt (Tipp &= und ~).  Ich möchte die Lösung nicht komplett 
präsentieren, weil ein Verständnis der logischen Grundoperatoren für 
dieses Geschäft unerlässlich ist.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Hc Zimmerer habs bisher immer so gelöst wie unten, daher war mir die 
obrige Variante nicht geläufig! Aber wenn man am Fehler suchen ist 
Versucht man bekanntlich so alles und baut sich wieder welche ein...
ISR (TIMER2_COMP_vect)
{
  us+=10;
  if(us==20000){ us=0; }

  if(us==0){
    PORTD = PORTD | 0x03;
  }

  if(us==Motor1){
   PORTD = PORTD & 0xFE;
  }
    
  if(us==Motor2){
    PORTD = PORTD & 0xFD;
  }
}

..so klappt es jetzt
wenn man nun Motor 1 = 1500 setzt dann stopt er andern falls kann man 
den jeweiligen Motor vorwärts bzw. rückwärts laufen.
Hab nun das nächste Problem ... der Prozessor ist durch den 10us 
Interrupt wohl zu beschäftig, sodass für div. andere Funktionen kein 
Platz mehr ist bzw. diese ständig unterbrochen werden. Wie kann man es 
besser lösen? Wie gesagt die PWM Funktion fällt so viel ich weiß 
flach...

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einzige Möglichkeit Rechenzeit wiederzubekommen ist die Auflösung 
runterzudrehen.
Lass den Timerinterrupt nur alle 100us laufen, dann haste wieder mehr 
zeit für andere Dinge, die Auflösung wird halt gezehntelt ;-)

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke ist eine Möglichkeit,
aber gibt es nicht noch eine Andere?

Für PWM zu langsam und für die CPU zu schnell?

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.