Forum: Compiler & IDEs I/O Port Problem


von Cpt (Gast)


Angehängte Dateien:

Lesenswert?

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

von Cpt (Gast)


Lesenswert?

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

von Unbekannter (Gast)


Lesenswert?

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

von Unbekannter (Gast)


Lesenswert?

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

von Cpt (Gast)


Lesenswert?

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

von Cpt (Gast)


Lesenswert?

So trotz der Warnung funktioniert das Programm wie angedacht.
Danke!

Würde mich trotzdem interessieren was es mit der Warnung auf sich hat.

Cpt

von A.K. (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

Deshalb sollte es heißen:

typedef struct
{
  volatile uint8_t * port;
  uint8_t pin;
} servopin_t;

von Cpt (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.