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


von Cyb3r (Gast)


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?
1
  uint16_t  MOTOR_PORT_0;
2
  uint16_t  MOTOR_PORT_1;
3
  uint16_t  MOTOR_PORT_2;
4
  uint16_t  MOTOR_PORT_3;
5
  uint16_t  MOTOR_PIN_0;
6
  uint16_t  MOTOR_PIN_1;
7
  uint16_t  MOTOR_PIN_2;
8
  uint16_t  MOTOR_PIN_3;
9
10
// und damm im konstruktor z.B.:
11
12
  MOTOR_PORT_0 =  PORTD;
13
  MOTOR_PORT_1 =  PORTD;
14
  MOTOR_PORT_2 =  PORTD;
15
  MOTOR_PORT_3 =  PORTD;
16
  MOTOR_PIN_0   =  3;
17
  MOTOR_PIN_1   =  2;
18
  MOTOR_PIN_2   =  1;
19
  MOTOR_PIN_3   =  0;
FUNKTIONIERT NICHT !!!


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

von Grrrr (Gast)


Lesenswert?

Keine Semikola am Ende von defines!

von PORTD (Gast)


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)

von Rolf M. (rmagnus)


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.

von Heiko (Gast)


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

von Mark .. (mork)


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).
1
    volatile uint8_t  *MOTOR_PORT_0;
2
    ...
3
    MOTOR_PORT_0 = &PORTD;
4
    ...
5
    *MOTOR_PORT_0 = (1<<MOTOR_PIN_0) | (1<<MOTOR_PIN_2);

MfG Mark

von Peter D. (peda)


Lesenswert?

Cyb3r schrieb:
> uint16_t  MOTOR_PORT_0;

Seit wann hat der AVR 16Bit Ports ???


Peter

von Cyb3r (Gast)


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 (
1
_SFR_IO8(0x12)
).
und wenn du dann erkennst ... Ah es steht in der sfr_defs.h udn 
nachgcukst siehst du:
1
#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!!!

von Peter D. (peda)


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

von Mano W. (Firma: ---) (manow)


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 (
1
_SFR_IO8(0x12)
).
> und wenn du dann erkennst ... Ah es steht in der sfr_defs.h udn
> nachgcukst siehst du:
>
1
> #define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
2
>
> 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.html#faq_port_pass

von Rolf Magnus (Gast)


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.

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.