Forum: Compiler & IDEs PPM Signal mit AVR erzeugen


von Robert S. (razer6)


Lesenswert?

Hallo an alle

Ich hab da ein Problem. Also als Aufgabe habe ich ein PPM Signal zu
erstellen.

Für alle die das PPM Protokoll nicht kennen, hier ein Link wie das
Protokoll: http://www.aerodesign.de/peter/2000/PCM/frame_ppm.gif
Es gibt Pulse von 1 - 2ms, dann imer eine Pause von 0,3ms. Nach 8
Pulsen kommt ein längerer Startpuls. Die 1,024ms Bandbreite hab ich in
8 Bit geteilt. Damit hab 8 Bit Genauigkeit am Ausgangssignal. Die
Zeitwerte für die Potis sample ich met den Adc Kanälen. Da ich den MEga
168 im DIP Gehäuse benutze (Ich weiß der ist ein bisschen oversized,
aber ich hab grad keinen anderen rumliegen...) hab ich nur 6 ADC Kanäle
zu Verfügung. Den restlichen 2 Kanälen gebe ich einen Fixwert, da ich
sie eh nicht nutze....

So jetzt zum eigentlichen Problem:

Der ADC läuft jetzt im Free Running Modus. Und sobald eine Messung
fertig ist, wird in der ISR der Wert gesichert und auf den nächste
Kanal geschaltet.

Die ISR macht mir immer noch zu schaffen. Derzeit dauert die ISR im
Worst Case 84 Takte. (Minimal 54 Takte) Je nach dem was gerade in der
ISR zu machen ist.
1
ISR(TIMER0_COMPA_vect)  //4µsec
2
{
3
if(--time == 0 && GLOB_STAT == 0x00)
4
    {
5
  time = NACHLADEWERT;
6
  GLOB_STAT = 0x02;
7
    }
8
    else
9
    {
10
  if(time == 0)
11
  {
12
      PWM_PORT ^= (1 << PWM_PIN);  //Wenn Zeit abgelaufen toggle PWM Pin
13
14
      if(GLOB_STAT == 0x02)  //Wenn gerade eine High Phase (keine Pause)
15
war Pause  aktiv
16
      {  
17
    time = PAUSE;
18
    GLOB_STAT = 0x01;
19
      }
20
      else        //Sonst ird das aktuelle Servo in das time Register
21
geladen
22
      {      
23
    if(++servozaehler < 8)  //Wenn das 8. Servo erreicht ist, wieder auf 0
24
stellen
25
        time = servo[servozaehler];        
26
    else
27
    {
28
        servozaehler = 0;
29
        time = longpulse;
30
    }
31
    GLOB_STAT = 0x00;
32
      }
33
  }
34
    }
35
}

Wie kann ich das besser lösen??

Ich hoffe es kann mir helfen

Gruß Robert

von Karl H. (kbuchegg)


Lesenswert?

Die zweite Abfrage, ob time gleich 0 ist lässt sich
einsparen.

(Du solltest wirklich an deiner Formatierung arbeiten. So
wie sie jetzt ist, sieht man nicht viel aus deinem Code
1
ISR(TIMER0_COMPA_vect)  //4µsec
2
{
3
  if( --time == 0 ) {
4
5
    if( GLOB_STAT == 0x00 ) {
6
      time = NACHLADEWERT;
7
      GLOB_STAT = 0x02;
8
    }
9
    else {
10
      PWM_PORT ^= (1 << PWM_PIN);  //Wenn Zeit abgelaufen toggle
11
12
      if( GLOB_STAT == 0x02 ) {    // Wenn gerade eine High Phase
13
                                   // (keine Pause)war Pause aktiv
14
        time = PAUSE;
15
        GLOB_STAT = 0x01;
16
      }
17
18
                                   // Sonst wird das aktuelle
19
                                   // Servo in das time Register 
20
                                   // geladen 
21
      else if( ++servozaehler < 8 ) { // Wenn das 8. Servo erreicht
22
                                      // ist, wieder auf 0 stellen 
23
        time = servo[servozaehler];
24
      }
25
      else {
26
        servozaehler = 0;
27
        time = longpulse;
28
      }
29
30
      GLOB_STAT = 0x00;
31
    }
32
  }
33
}

von Karl H. (kbuchegg)


Lesenswert?

Ich seh grad, ich hab da eine sinnentstellende Transformation
gemacht.
1
      else if( ++servozaehler < 8 ) { // Wenn das 8. Servo erreicht
2
                                      // ist, wieder auf 0 stellen
3
        time = servo[servozaehler];
4
      }
5
      else {
6
        servozaehler = 0;
7
        time = longpulse;
8
      }
9
      GLOB_STAT = 0x00;

das geht so nicht. das GLOB_STAT = 0x00;
hängt in der falschen Schachtelebene:
1
      else {
2
        if( ++servozaehler < 8 ) { // Wenn das 8. Servo erreicht
3
                                   // ist, wieder auf 0 stellen
4
          time = servo[servozaehler];
5
        }
6
        else {
7
          servozaehler = 0;
8
          time = longpulse;
9
        }
10
        GLOB_STAT = 0x00;
11
      }

Sorry. Aber das war im Original nur durch Klammern zählen
zu sehen.

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.