Sabertooth atmega32 avr-gcc

Gast #1667788
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 ...
1
ISR (TIMER2_COMP_vect)
2
{
3
  us+=10;
4
  if(us==20000){ us=0; }
5

6

7
      if(us==0){
8
      PORTD |= (1<<PD4);
9
    }
10
    if(us==900){
11
      PORTD |= (0<<PD4);
12
    }
13
}
14

15
int main(void){
16
  us=0;
17

18
// Initialisierung:
19
  TCCR2 = (1<<CS20) | (1<<WGM21);  // Prescaler von 1 | CTC-Modus
20
  OCR2  = 79;            // Vergleichswert
21
  TIMSK |= (1<<OCIE2);      // Interrupt aktivieren
22
  sei();
23
  
24
  DDRD |= (1<<PD4) | (1<< PD5);
25

26
  while(1)
27
  {
28

29
  }
30
}

Vielen Dank für die Hilfe
Gast #1667854
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...
1
ISR (TIMER2_COMP_vect)
2
{
3
  us+=10;
4
  if(us==20000){ us=0; }
5

6
  if(us==0){
7
    PORTD = PORTD | 0x03;
8
  }
9

10
  if(us==Motor1){
11
   PORTD = PORTD & 0xFE;
12
  }
13
    
14
  if(us==Motor2){
15
    PORTD = PORTD & 0xFD;
16
  }
17
}

..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...
Gast #1667857
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 ;-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.