Nicht angemeldet. · Kennwort vergessen · Registrieren

hanzn
Mitglied seit 01/2011
6 Beiträge
Betreff: Beispielklausur 2006
Hey,
ich habe mich mal an der Aufgabe 2 versucht. Vor allem bei der Umsetzung von portX bin ich mir unsicher.. funktioniert das mit der Deklaration zu Beginn, dem Kopieren des PORT-Zeigers und was passt sonst nicht?

  1. #define PORT0 (*(volatile uint8_t*) (0x40))
  2. #define PORT1 (*(volatile uint8_t*) (0x48))
  3. #define PORT2 (*(volatile uint8_t*) (0x50))
  4. #define PORT3 (*(volatile uint8_t*) (0x58))
  5.  
  6. void setport (int port, char pins[]){
  7.     (volatile uint8_t) *portX;
  8.     if (port == 0){
  9.         portX=PORT0;
  10.     } else if (port == 1){
  11.         portX=PORT1;
  12.     } else if (port == 2){
  13.         portX=PORT2;
  14.     } else if (port == 3){
  15.         portX=PORT3;
  16.     }
  17.     for (int8_t i = 0; i<8; i++){
  18.         if(pins[7-i]== '0' ){
  19.             portX &= ~(1<<i);
  20.         }else if(pins[7-i]== '1'){
  21.             portX |= (1<<i);
  22.         }
  23.     }
  24.    
  25. }
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
portX sieht gut aus. Die Zuweisung noch nicht so ganz. Lös doch PORT{0...3} auf und vergleich den Typ.
hanzn
Mitglied seit 01/2011
6 Beiträge
Ok, ich hab mir nochmal die Folien angeschaut und die Zuweisung verändert. Beim Setzen der Pins hat auch das Pointer-Zeichen gefehlt, oder? Hier der korrigierte code:

  1. #define PORT0 (*(volatile uint8_t*) (0x40))
  2. #define PORT1 (*(volatile uint8_t*) (0x48))
  3. #define PORT2 (*(volatile uint8_t*) (0x50))
  4. #define PORT3 (*(volatile uint8_t*) (0x58))
  5.  
  6. void setport (int port, char pins[]){
  7.     (volatile uint8_t) *portX;
  8.     if (port == 0){
  9.         *portX=&PORT0;
  10.     } else if (port == 1){
  11.         *portX=&PORT1;
  12.     } else if (port == 2){
  13.         *portX=&PORT2;
  14.     } else if (port == 3){
  15.         *portX=&PORT3;
  16.     }
  17.     for (int8_t i = 0; i<8; i++){
  18.         if(pins[7-i]== '0' ){
  19.             *portX &= ~(1<<i);
  20.         }else if(pins[7-i]== '1'){
  21.             *portX |= (1<<i);
  22.         }
  23.     }
  24.    
  25. }
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Zitat von hanzn:
Ok, ich hab mir nochmal die Folien angeschaut und die Zuweisung verändert. Beim Setzen der Pins hat auch das Pointer-Zeichen gefehlt, oder? Hier der korrigierte code:

Jep, das sieht schon besser aus. Die Aufgabenstellung habe ich jetzt nicht nochmal nachgelesen, aber der Code macht zumindest Sinn. ;)
hanzn
Mitglied seit 01/2011
6 Beiträge
alles klar, danke für die hilfe!
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Ach ja, es gibt keine Klammern in der Variablendeklaration......
danik
Mechatronik
Mitglied seit 05/2011
6 Beiträge
außerdem speicherst du eine Adresse als ein int:
*portX=&PORT0;
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Zitat von danik:
außerdem speicherst du eine Adresse als ein int:
*portX=&PORT0;

..uint8_t  - beim ersten mal war es noch richtiger *blind*
hanzn
Mitglied seit 01/2011
6 Beiträge
ehm, bin jetzt etwas verwirrt.. stimmt nur die deklaration nicht, oder noch etwas?
ohne das makro also:
  1. void setport (int port, char pins[]){
  2.     volatile uint8_t *portX;
  3.     if (port == 0){
  4.         *portX=&(*(volatile uint8_t*) (0x40));
  5.     } else if (port == 1){
  6.         *portX=&(*(volatile uint8_t*) (0x48));
  7.     } else if (port == 2){
  8.         *portX=&(*(volatile uint8_t*) (0x50));
  9.     } else if (port == 3){
  10.         *portX=&(*(volatile uint8_t*) (0x58));
  11.     }
  12.     for (int8_t i = 0; i<8; i++){
  13.         if(pins[7-i]== '0' ){
  14.             *portX &= ~(1<<i);
  15.         }else if(pins[7-i]== '1'){
  16.             *portX |= (1<<i);
  17.         }
  18.     }
  19. }
danik
Mechatronik
Mitglied seit 05/2011
6 Beiträge
die makros waren ok. was der stern vor dem portX bedeutet, da musst du nochmals drüber nachdenke und mit dem vergleichen was du eigentlich machen willst.
Max.
LRT, FabLab, ehem. FSI EEI
(Administrator)
Mitglied seit 02/2011
240 Beiträge
Ich löse das mal etwas auf, da die Klausur naht :) Die Erklärung ist vielleicht nicht 150% korrekt formuliert, sondern soll nur dem Verständnis dienen.

portX ist ein Pointer. Ein Pointer ist "ein Speicherplatz für eine Adresse". Wenn du die Adresse verändern willst, auf die portX zeigt, musst du einfach portX = 0x123; schreiben. Damit der Compiler nicht meckert, dass 0x123 ja eine Zahl ist, und keine Adresse, musst du ihm noch mit dem Type-Cast
(volatile uint8_t*) 0x123
sagen, dass das kein int ist, sondern eine Adresse, unter der ein volatile uint8_t zu finden ist.

Wenn du *portX schreibst, wird der Pointer dereferenziert, also "aufgelöst". *portX kannst du verwenden, als sei es eine uint8_t Variable, die genau an der Stelle liegt, auf die portX zeigt.
*portX = 7; setzt den Port auf 7. Wenn du das schreibst, schaut das Programm zuerst nach, welche Adresse in portX steht, und speichert den Wert 7 genau auf diese Speicherstelle.
Wenn du uint8_t x = *portX schreibst, liest das Programm aus genau der Adresse, die in portX steht, den Wert und speichert ihn nach x.

Ich hoffe das hilft etwas weiter. Gruß, Max
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen