Forum: Mikrocontroller und Digitale Elektronik Sabertooth atmega32 avr-gcc


von Christoph (Gast)


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

von Christoph (Gast)


Lesenswert?

..der Mikrocontroller läuft auf int Osc 8MHz. Hatte ich vergessen

von Hc Z. (mizch)


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.

von Christoph (Gast)


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...

von Flo (Gast)


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 ;-)

von Christoph (Gast)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.