Forum: Mikrocontroller und Digitale Elektronik Port speichern


von Christoph M. (fakulatus)


Lesenswert?

Hallo Leute,

eigentlich habe ich das Gefühl, es ist eine einfache Frage, doch da ich 
im Forum nichts gefunden habe, bin ich mir da nicht mehr so ganz sicher.

Ich arbeite mit einem ATmega8 Prozessor und möchte gerne einen Port in 
einer Variable speichern.

Im Sinn von:
1
 if(channel==1) //irgend eine if-Verzweigung
2
 {
3
   myPort = PORTD; 
4
 }
5
 else
6
 { 
7
   myPort = PORTB;
8
 }
9
10
 myPort |= 0x20; //Diese zuweisung befindet sich natürlich irgendwo

Der Sinn dabei besteht jetzt darin, diese if(channel)-Abfrage nicht 
jedes mal durchführen zu müssen.

Frage: Was für ein Typ muss myPort sein?

Ich habe mit Pointern gespielt und Adressen gespeichert aber irgendwie 
funktioniert das nicht so ganz. Im Grunde ist "PORTD" ja nichts anderes 
als eine bestimmte Adresse im uC, also müsste ich die neue Variable 
genau gleich benutzen können.

Hat jemand eine Idee?

von Heiko_S (Gast)


Lesenswert?

Hi Christian,

mit PORT(X) kannst Du nur Ausgaben machen (PORTD = 0xFF;), mit PIN(X) 
kannst Du Status Informationen vom PORT holen.
Der Typ sollte uint8_t (8-Bit) breit sein.

von Stefan E. (sternst)


Lesenswert?

1
volatile uint8_t * myPort;
2
3
if(channel==1) //irgend eine if-Verzweigung
4
 {
5
   myPort = &PORTD; 
6
 }
7
 else
8
 { 
9
   myPort = &PORTB;
10
 }
11
12
*myPort |= 0x20; //Diese zuweisung befindet sich natürlich irgendwo

von Christoph M. (fakulatus)


Lesenswert?

Hallo Stefan,

danke für die Antwort, das habe ich auch schon ausprobiert, doch leider 
klappt dies nicht so ganz. Der Compiler bringt zwar keine Fehlermeldung, 
doch die gewünschte Aktion wird nicht erreicht...

von Stefan E. (sternst)


Lesenswert?

Dann erklär mal, was genau du erreichen willst, denn "Port in
einer Variable speichern" ist ziemlich schwammig.

von NurEinGast (Gast)


Lesenswert?

Probier mal

volatile uint8_t* myPort;

if(channel==1) //irgend eine if-Verzweigung
 {
   myPort = PORTD;
 }
 else
 {
   myPort = PORTB;
 }

*myPort |= 0x20;

von NurEinGast (Gast)


Lesenswert?

Sorry.

myPort = &PORTD;   anstatt   myPort = PORTD;

von Stefan E. (sternst)


Lesenswert?

@ NurEinGast:

Toll. Der Unterschied zu meinem Code ist dann genau welcher?

von Christoph M. (fakulatus)


Lesenswert?

Stefan, du hast doch recht, so funktioniert es!

Das Problem liegt in diesem Fall an einem anderen Ort. Als ich deinen 
Code noch einmal im "main()" ausprobiert habe, hat es funktioniert.

Das Problem liegt wohl im c++, im Kontruktor fülle ich myPort und in 
einer Member-Funktion führe ich sie aus.

Meld mich nach dem Mittag :)

von Lutz (Gast)


Lesenswert?

Auch wenn es erledigt ist eine kurze Verständnisfrage:
Du willst also wirklich den Inhalt des PORTx-Registers lesen (den Du ja 
selbst irgendwann mal irgendwie aktiv gesetzt haben mußt) und nicht den 
aktuellen Pegelstand am Eingang (PINx)? Aber jetzt nicht sagen, daß das 
ja das Gleiche ist, denn das muß es nicht!

von NurEinGast (Gast)


Lesenswert?

@Stefan Ernst
> Toll. Der Unterschied zu meinem Code ist dann genau welcher?

Der Unterschied ist :
Dein Code wurde ein paar Minuten vorher gepostet. Ich habe 
zwischenzeitig die Antwort hingeschrieben und vor'm absenden nicht in 
nem anderen Browser Fenster nachgeschaut ob Du schon jemand geantwortet 
hat.

Jetzt muss ich entweder schneller nachdenken und schreiben - oder 
einfach in Zukunft nicht mehr antworten um solch eine Fopas zu 
vermeiden.

von Stefan E. (sternst)


Lesenswert?

Lutz wrote:
> Auch wenn es erledigt ist eine kurze Verständnisfrage:
> Du willst also wirklich den Inhalt des PORTx-Registers lesen (den Du ja
> selbst irgendwann mal irgendwie aktiv gesetzt haben mußt) und nicht den
> aktuellen Pegelstand am Eingang (PINx)? Aber jetzt nicht sagen, daß das
> ja das Gleiche ist, denn das muß es nicht!

Schau dir den funktionierenden Code an, dann weißt du auch, was er 
wirklich will.

von Stefan E. (sternst)


Lesenswert?

@ NurEinGast:

Mach dir keinen Kopf, der Kommentar von mir war eh reichlich 
überflüssig.

von Lutz (Gast)


Lesenswert?

Stefan Ernst :
>Schau dir den funktionierenden Code an, dann weißt du auch, was er
>wirklich will.

Nein, habe ich nicht verstanden. Bitte erklär es mir kurz.

von Christoph M. (fakulatus)


Lesenswert?

Ok, das Ding läuft.
Danke für die Antwort. Die Lösung hatte ich eigentlich vor dem Post 
schon, nur lief es nur nicht :?
Habe den Port nicht als Ausgang gsesetzt gehabt kopfklatsch Sorry!

Na egal
@Diskusion: Was ich wirklich will ist nicht so entscheidend, es läuft 
genau so wie ich es möchte :)

von Stefan E. (sternst)


Lesenswert?

Lutz wrote:

> Nein, habe ich nicht verstanden. Bitte erklär es mir kurz.

Er will in einer Variablen speichern, welcher Port für die Ausgabe zu 
nutzen ist.

von Lutz (Gast)


Lesenswert?

Alles klar, jetzt hab ich´s. Danke.

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.