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
Wenn du dir das asmdemo von avr-libc anguckst, dort habe ich genau sowas mal gemacht.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.