Hallo zusammen Vielleicht könnte sich jemand den Programmauszug im Anhang mal ansehen. Warum es so nicht funktioniert ist mittlerweile klar. Der Compiler ändert nur die Werte der Variablen, gibt aber nichts auf dem Port aus. Soweit logisch. Nun zur gedachten Funktion. Im hintergrund läuft ein Timer mit 1ms Interrupt, der nichts anderes macht, als servo_index zu erhöhen. Wie man aus den Bezeichnungen erahnen kann soll das ganze ein Modellbauservo-Controller auf Mega8 Basis werden (min 12 Servos). Der nächste gelistete Portpin soll halt schon 1ms an sein, während der aktuelle Puls bearbeitet wird. Hmm wirr ausgedrückt, aber wenn man in den Code schaut wird es hoffentlich klar. :-) Danke schonmal Cpt
Ok vorerst habe ich es mit defines (z.B. _d_PORTB 1) und zusätzlichem switch case Gedöns gelöst. Aber wenn jemand was besseres kennt ... immer her damit :-)
Ein Array mit Port/Pin-Strukturen? typedef struct { uint8_t * port; uint8_t pin; } servopin_t; servopin_t servo[] = { { PORTB, PB0 }, /* Servo 1 */ { PORTB, PB0 }, /* Servo 2 */ { PORTB, PB6 }, /* Servo 3 */ ... { PORTx, PBx }, /* Servo 12 (letztes) */ { PORTB, PB0 } /* Servo 1 (Kopie/Wrap) */ }; for (int i=0; i<12; i++) { act_servo_port = servo[i].port; act_servo_pin = servo[i].pin; next_servo_port = servo[i+1].port; next_servo_pin = servo[i+1].pin; }
Achso, und dann eben: *next_servo_port |= (1<<next_servo_pin); Man beachte das '*' am Anfang... Achso, und noch was. Das muss natürlich so geschrieben werden: { &PORTB, PB0 }, /* Servo 1 */ { &PORTB, PB0 }, /* Servo 2 */ { &PORTB, PB6 }, /* Servo 3 */ Man beachte das '&' am Anfang. Müsste eigentlich so gehen (ungetestet).
Danke Unbekannter! Ich bin gerade dabei es so auszutesten. Allerdings gibt der Compiler zu bedenken: warning: initialization discards qualifiers from pointer target type Da drängt sich mir der Verdacht auf, daß diese Art der Initalisierung eventuell nicht die Portadressen in die entsprechenden Variablen lädt. Kann das jemand bestätigen oder einen Weg aufzeigen der erfolgreich ist. Danke Cpt
So trotz der Warnung funktioniert das Programm wie angedacht. Danke! Würde mich trotzdem interessieren was es mit der Warnung auf sich hat. Cpt
Port hat "volatile", Pointer nicht, ergo Warnung. Kann subtile Konsequenzen haben, wenn der Compiler das fehlende "volatile" zum Anlass von Optimierungen nimmt, die dem Charakter des Ports entgegenstehen.
Deshalb sollte es heißen: typedef struct { volatile uint8_t * port; uint8_t pin; } servopin_t;
Ja das macht Sinn. Danke an alle, jetzt läuft es wie gewünscht und ohne Warnungen. Cpt
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.