Forum: Compiler & IDEs PPM Signal einlesen


von Christoph (Gast)


Lesenswert?

Hallo,
ich will von meinem Modellbauentpfänger mit meinem Mega32 auswerten. 
Dazu hab ich jetzt schon das Summensignal nach außen geführt und per OP 
auf 5V Pegel verstärkt. Dieses Signal habe ich an den ICP-Pin des AVRs 
gehängt.
Jetzt häng ich grad dran, wie ich das jetzt am besten auslese. Habt ihr 
da vielleicht ein paar Tips für mich? Ich brauch keinen Code, nur ein 
paar Denkanstöße, wie ich da jetzt am besten vorgehe!
Danke,
Christoph

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du dir das asmdemo von avr-libc anguckst, dort habe ich genau
sowas mal gemacht.

von Christoph (Gast)


Lesenswert?

Bei dem Besipiel liest du aber nur einen servo kanal ein und nicht alle 
zusammengefasst als Summensignal, oder?
Mein Problem ist, wie ich die acht aufeinander folgenden Pulse mit Hilfe 
des Reset-signals den einzelnen Servor zuordne und zum Beispiel über 
einen Port am µC ausgebe.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du wolltest doch aber auch noch was selbst tun dabei, oder? ;-)

Du musst dazu lediglich die ,,große'' Lücke entdecken, mit der die
Kanalblöcke voneinander getrennt werden.  Wenn du die zum ersten Mal
hast kannst du beginnen, die eingelesenen Werte auf N Kanäle
(typischerweise in einem Array, dessen Index hochgezählt wird)
abzuspeichern.

Für den ATmega32 kannst du natürlich auf den ganzen Assemblerkram
dabei verzichten und dir die reine C-Lösung, die als Beispiel für
den ATtiny45 drin ist, als Ausgangspunkt nehmen.

Meine Variante ist übrigens P*W*M, nicht P*P*M.  Das musst du also
ggf. anpassen.

von Mule (Gast)


Lesenswert?

Also ich hab da jetzt nen bissl rumprobiert und wollt jetzt mal fragen, 
ob das so in der Richtung richtig ist (eigentlich das erste mal, dass 
ich was mit timern und interrupts mache)...

#include <avr/io.h>
#include <avr/inttypes.h>
#include <avr/delay2.h>
#include <avr/i2cmaster.h>
#include <avr/interrupt.h>

int puls=0, i=0, z=0;
int PPM[8]={0,0,0,0,0,0,0};

ISR(TIMER0_OVF_vect){
z++;
}


ISR(TIMER1_CAPT_vect) {
  puls = ICR1;
  if (puls>=8000) {          //Resetsignal
    i=0;
    TCNT1=0;
    }

  else {
    PPM[i]=puls;
    TCNT1=0;
    i++;
    }
}

int main(void)
{
  DDRA = 0xff;             //Motoren ausgang
  PORTA |= (1<<DDA4);          //enablen
  PORTA |= (1<<DDA5);          //enablen
  sei();               //interrupt ein
  uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU));
  TCCR1B = (1<<ICES1)|(1<<CS11);     //steigende Flanke; Prescaler 8 -> 
2000000Hz -> 8 Zähler entspricht 1 Prozent Servoweg (4µs)
  TIMSK = (1<<TICIE1)|(1<<TOIE0);   //capture event interrupt; Timer 
Overflow Interrupt
  TCCR0 = (1<<CS00)|(1<<CS02);     //Timer0; Prescaler 1024

...

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.