mikrocontroller.net

Forum: Compiler & IDEs AVRGCC z.B. PORTD von welchem Typ?


Autor: Cyb3r (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen
Hallo ich schreibe mir gerade eine Schrittmotor Klasse.
So nun funktioniert alles soweit ganz gut.
Nur da ich pro Mikrokontroller 4 Schrittmotoren habe musste ich jetzt 
die #define von jeweils dem Port des Pins und dem Pins selber 
rausnehmen.
Diese stehen nun in der Klasse.
Ich dachte mir ok mit Integer müsste das doch funktionieren jedoch ist 
dem nicht so, also was für einen Typen muss ich nehmen?
  uint16_t  MOTOR_PORT_0;
  uint16_t  MOTOR_PORT_1;
  uint16_t  MOTOR_PORT_2;
  uint16_t  MOTOR_PORT_3;
  uint16_t  MOTOR_PIN_0;
  uint16_t  MOTOR_PIN_1;
  uint16_t  MOTOR_PIN_2;
  uint16_t  MOTOR_PIN_3;

// und damm im konstruktor z.B.:

  MOTOR_PORT_0 =  PORTD;
  MOTOR_PORT_1 =  PORTD;
  MOTOR_PORT_2 =  PORTD;
  MOTOR_PORT_3 =  PORTD;
  MOTOR_PIN_0   =  3;
  MOTOR_PIN_1   =  2;
  MOTOR_PIN_2   =  1;
  MOTOR_PIN_3   =  0;
FUNKTIONIERT NICHT !!!


Mit dem foglenden Code funktionierte es noch:
#define  MOTOR_PORT_0   PORTD;
#define  MOTOR_PORT_1   PORTD;
#define  MOTOR_PORT_2   PORTD;
#define  MOTOR_PORT_3   PORTD;
#define  MOTOR_PIN_0  3;
#define  MOTOR_PIN_1  2;
#define  MOTOR_PIN_2  1;
#define  MOTOR_PIN_3  0;

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Semikola am Ende von defines!

Autor: PORTD (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klar dass das mit den defines klappt, da steht nach dem Präprozessor ja 
auch PORTD = PORTD; 3 = 3 etc.

Schau doch einfach mal ins Datenblatt was PORTD überhaupt ist. Dann 
könntest du uns auch sagen um welchen µC es sich handelt und was du 
eigentlich vor hast? Pins auslesen? Wenn ja, dann schau hier im Forum 
einfach mal in Tutorial 
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial)

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cyb3r schrieb:
> Nur da ich pro Mikrokontroller 4 Schrittmotoren habe musste ich jetzt
> die #define von jeweils dem Port des Pins und dem Pins selber
> rausnehmen.

Wo rausnehmen?

> Diese stehen nun in der Klasse.

Was für eine Klasse?

> Ich dachte mir ok mit Integer müsste das doch funktionieren

Warum sollte es?

> jedoch ist dem nicht so, also was für einen Typen muss ich nehmen?

Es geht um C++? Dann:

volatile uint8_t&

In C geht es nicht ohne #define.

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau doch mal in die avr/io.h bzw. die zu deinem Controller, da steht 
das drin. Und nein, ich weiß das nicht aus dem Kopf.

MfG, Heiko

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Cyber

Mit 'MOTOR_PORT_0 = PORTD;' wird der aktuelle Wert von PORTD lediglich 
in der Variable MOTOR_PORT_0 gespeichert. Was Du brauchst ist ein Zeiger 
auf PORTD, die die Adresse des Ports enthält. Da die Ports alle nur 8 
Bit breit sind, reicht auch ein uint8_t * (genauso bei der Pin-Nummer).
    volatile uint8_t  *MOTOR_PORT_0;
    ...
    MOTOR_PORT_0 = &PORTD;
    ...
    *MOTOR_PORT_0 = (1<<MOTOR_PIN_0) | (1<<MOTOR_PIN_2);

MfG Mark

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cyb3r schrieb:
> uint16_t  MOTOR_PORT_0;

Seit wann hat der AVR 16Bit Ports ???


Peter

Autor: Cyb3r (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grrrr schrieb:
> Keine Semikola am Ende von defines!

Darum ging es nicht ( das war nur pseudo code hier im forum 
MOTOR_PORT_0 =  PORTD; eifnach #define davor gezogen und = zeichen weg 
hab das ; vergessen)

Rolf Magnus schrieb:
> Es geht um C++? Dann:

Jop C++

Rolf Magnus schrieb:
> volatile uint8_t&

Genau Danke

Heiko schrieb:
> Schau doch mal in die avr/io.h bzw. die zu deinem Controller, da steht
> das drin. Und nein, ich weiß das nicht aus dem Kopf.

Hättest du einmal in die avr/io.h geschaut wüsstest du das es dort nicht 
drin steht, wenn du nun in die I/O von dem entsprechenden 
Mikrocontroller reinschaust wirst du festellen dort steh es auch nicht 
drin (
_SFR_IO8(0x12)
).
und wenn du dann erkennst ... Ah es steht in der sfr_defs.h udn 
nachgcukst siehst du:
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
Tja wo io_addr steht habe ich nicht gefunden und somit dacht ich mir nur
What the f_uck ( naklar hätte ich es mir anhand dem ausrechnen können 
bin auch nicht dumm, aber ich will möglcisht wenig Flash für Code 
verbrauchen)

Mark .. schrieb:
> Mit 'MOTOR_PORT_0 = PORTD;' wird der aktuelle Wert von PORTD lediglich
> in der Variable MOTOR_PORT_0 gespeichert. Was Du brauchst ist ein Zeiger
> auf PORTD, die die Adresse des Ports enthält. Da die Ports alle nur 8
> Bit breit sind, reicht auch ein uint8_t * (genauso bei der Pin-Nummer).
>     volatile uint8_t  *MOTOR_PORT_0;
>     ...
>     MOTOR_PORT_0 = &PORTD;
>     ...
>     *MOTOR_PORT_0 = (1<<MOTOR_PIN_0) | (1<<MOTOR_PIN_2);

Ja genau Danke

Peter Dannegger schrieb:
> Cyb3r schrieb:
>> uint16_t  MOTOR_PORT_0;
>
> Seit wann hat der AVR 16Bit Ports ???

Das ist absolut Latte omg darum geht es nicht zu Testzwecken sollte man 
imemr mehr Speicher als eigl gebraucht benutzen und es dann Später 
optimeiren, wenn man nicht genau weiß wie groß die Variable ist.
... und wenn du jetzt geschrieben hättest:
Eine AVR hat z.B. 8Bit Ports und die Variable dafür hat dannn auch 8Bit
dann wäre dein Beitrag sogar sinnvoll gewesen!!!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cyb3r schrieb:
> Das ist absolut Latte omg darum geht es nicht zu Testzwecken sollte man
> imemr mehr Speicher als eigl gebraucht benutzen

???

Also wenn ich ne Schraube eindrehen will, dann nehme ich auch den 
passenden Schraubendreher dazu und vergurke nicht den Kopf mit nem zu 
großen.

Generell zu sagen: "viel hilft viel" ist generell gesehen falsch.
Man darf ruhig mal das Gehirn einschalten und denken.


Zum Thema:
Ich persönlich mag das Rumgegurke mit extra Adresse und Bitnummer für 
jeden Portpin nicht.

Ich definiere mir Bitnamen, dann wird der Quelltext deutlich einfacher 
lesbar.
Und der AVR-GCC macht dann daraus auch die effizienten SBI/CBI-Befehle 
(wenns geht).

Hier ein Beispiel:
Beitrag "Re: AVR Interface"


Peter

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Heiko schrieb:
>> Schau doch mal in die avr/io.h bzw. die zu deinem Controller, da steht
>> das drin. Und nein, ich weiß das nicht aus dem Kopf.
>
> Hättest du einmal in die avr/io.h geschaut wüsstest du das es dort nicht
> drin steht, wenn du nun in die I/O von dem entsprechenden
> Mikrocontroller reinschaust wirst du festellen dort steh es auch nicht
> drin (
_SFR_IO8(0x12)
).
> und wenn du dann erkennst ... Ah es steht in der sfr_defs.h udn
> nachgcukst siehst du:
>
> #define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
> 
> Tja wo io_addr steht habe ich nicht gefunden und somit dacht ich mir nur
> What the f_uck ( naklar hätte ich es mir anhand dem ausrechnen können
> bin auch nicht dumm, aber ich will möglcisht wenig Flash für Code
> verbrauchen)
>

Tja da hättest Du wohl genauer hinschauen müssen, dann sieht man wo 
io_addr steht. Übrigens __SFR_OFFSET dürfte 0 sein und somit ist 0x12 
deine Adresse (sollte dann auch so im Datenblatt sein).

Das was Du suchst steht in den FAQs von der avr-libc drinnen:
http://www.nongnu.org/avr-libc/user-manual/FAQ.htm...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mano Wee schrieb:
> Übrigens __SFR_OFFSET dürfte 0 sein und somit ist 0x12

Wenn es 0 wäre, dann wäre 0x12 das Register R18, weil bei 0 erstmal die 
General-Purpose-Register R0 bis R31 kommen, und erst danach die 
I/O-Register anfangen.

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.