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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren