www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Port speichern


Autor: Christoph Mauchle (fakulatus)
Datum:

Bewertung
0 lesenswert
nicht 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:
 if(channel==1) //irgend eine if-Verzweigung
 {
   myPort = PORTD; 
 }
 else
 { 
   myPort = PORTB;
 }

 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?

Autor: Heiko_S (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile uint8_t * myPort;

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

*myPort |= 0x20; //Diese zuweisung befindet sich natürlich irgendwo

Autor: Christoph Mauchle (fakulatus)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: NurEinGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal

volatile uint8_t* myPort;

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

*myPort |= 0x20;

Autor: NurEinGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry.

myPort = &PORTD;   anstatt   myPort = PORTD;

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ NurEinGast:

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

Autor: Christoph Mauchle (fakulatus)
Datum:

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

Autor: Lutz (Gast)
Datum:

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

Autor: NurEinGast (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ NurEinGast:

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

Autor: Lutz (Gast)
Datum:

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

Autor: Christoph Mauchle (fakulatus)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar, jetzt hab ich´s. Danke.

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.