I/O Port Problem

Gast #283732
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
Angehängte Dateien:
Gast #283734
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;
}
Gast #283735
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).
Gast #283736
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
Gast #283738
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.