mikrocontroller.net

Forum: Compiler & IDEs I/O Port Problem


Autor: Cpt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Cpt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Cpt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Cpt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deshalb sollte es heißen:

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

Autor: Cpt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das macht Sinn.
Danke an alle, jetzt läuft es wie gewünscht und ohne Warnungen.

Cpt

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.