| |
 |
Verfasst am: 08.02.2010, 10:21 |
|
|
| Viper |
|
|
 |
| Anmeldungsdatum: 29.03.2009 |
| Beiträge: 8 |
|
|
|
 |
 |
 |
|
Hi
bin gerade dabei mithilfe von Codevision paar Übungsaufgaben abzuarbeiten.
Aufgabe ist ein Lauflicht zu Programmieren.
Habe 4 LEDs die am portc liegen. Ich wollte eine do while- Schleife Programmieren um mir die Schreib Arbeit zusparen.
Int i=0,*Pointer; //Zeiger um auf den Port zu zeigen
pointer=PORTC; // hier sollte ja eigentlich der Zeiger die Adresse 0x15 annehmen
pointer[i]=0; //LED einschalten
Fehler beim compilieren
à Value of Typ u Char cant Be assigned to anebtity of Typ int *
auch wenn ich die Adresse direkt als Hex eingebe kommt dieser Fehler.
Muss ich erst eine Typen Umwandlung machen? |
|
|
|
|
 |  | | Re: Pointer Zeiger Problem |
|  |
Verfasst am: 08.02.2010, 12:16 |
|
|
| Viper |
|
|
 |
| Anmeldungsdatum: 29.03.2009 |
| Beiträge: 8 |
|
|
|
 |
 |
 |
|
Kann es sein, dass eine explizite Konvertierung dafür notwendig ist?
Z.B.
Pointer=(int *)portc; |
|
|
|
|
Verfasst am: 08.02.2010, 17:18 |
|
|
| sharandac |
|
|
 |
| Anmeldungsdatum: 08.10.2009 |
| Beiträge: 34 |
| Wohnort: Berlin |
|
|
 |
 |
 |
|
Salut ...
versuch es mal anders. Zuerst musst du überlegen von was für einen Typ PortC ist. PortC ist vom Typ unsigned char. Also sollte die deklaration so aussehen.
| Code: |
int i = 0;
unsigned char * Pointer;
|
Danach kannst du dem Pointer die Adresse von Portc zuweisen.
Wenn das passiert ist hast du Pointer die Adresse von PortC mitgegeben. Um jetzt auf den Inhalt der Adresse zuzugreifen die in Pointer hinterlegt ist brauchst du eigentlich nur
zu machen. Wichtig ist der Unterschied ob die auf den Pointer zugreifen willst oder auf den Inhalt auf den der Pointer zeigt. Deshalb das * davor, denn du willst ja auf den Inhalt zugreifen. |
|
|
|
|
 | |  |
Verfasst am: 08.02.2010, 18:20 |
|
|
| Viper |
|
|
 |
| Anmeldungsdatum: 29.03.2009 |
| Beiträge: 8 |
|
|
|
 |
 |
 |
|
Hierbei tritt das Problem auf das der mir jetzt sagt u Char geht nicht in u Char *
also übergebe ich theoretisch nen Char 1 oder 0 zum ausgang setzten
also nicht die Zahl 1 und 0. |
|
|
|
|
 | |  |
Verfasst am: 08.02.2010, 19:23 |
|
|
| sharandac |
|
|
 |
| Anmeldungsdatum: 08.10.2009 |
| Beiträge: 34 |
| Wohnort: Berlin |
|
|
 |
 |
 |
|
| Viper hat Folgendes geschrieben: | Hierbei tritt das Problem auf das der mir jetzt sagt u Char geht nicht in u Char *
also übergebe ich theoretisch nen Char 1 oder 0 zum ausgang setzten
also nicht die Zahl 1 und 0. |
Hm ... ich überlege gerade, es kann gut möglich sein das du PortC gar nicht so benutzten kannst wie du willst, da es eigentlich keine Adresse im sinne von Pointern darstellt sondern für den Out-Befehl gedacht ist, und der will andere Adressen haben. Deshalb vielleicht die Probleme.
Ein blick in die Sourcen verrät mir auch gerade das die Adressen für die Ports und so weiter als 8-Bit Adressen abgelegt sind die im Special-Function-Register Bereich liegen, siehe Datenblatt zum benutzten Controller. Ich denke mal das was du vor hast könnte etwas schwer werden. |
|
|
|
|
Verfasst am: 09.02.2010, 4:12 |
|
|
| sharandac |
|
|
 |
| Anmeldungsdatum: 08.10.2009 |
| Beiträge: 34 |
| Wohnort: Berlin |
|
|
 |
 |
 |
|
|
|
|
|
Verfasst am: 09.02.2010, 7:32 |
|
|
| Viper |
|
|
 |
| Anmeldungsdatum: 29.03.2009 |
| Beiträge: 8 |
|
|
|
 |
 |
 |
|
habe mir das gerade angesehen.
Da wird das ähnlich gemacht unsigned Char wird da verwendet.
Aber was mich verwirrt ist, dass dort ein dereferenzierungs operator verwendet wird.
Eigentlich repräsentiert pinc nur eine Speicher Adresse. Normalerweise muss das & wegbleiben. Beim compelieren wird das als Error gemeldet. Wenn ich es weglasse compeliert er ohne Fehler. Werde das nachher mal testen |
|
|
|
|
 | |  |
Verfasst am: 10.02.2010, 20:15 |
|
|
| Berecke |
|
 |
 |
| Anmeldungsdatum: 13.11.2008 |
| Beiträge: 170 |
| Wohnort: Berlin |
|
|
 |
 |
 |
|
Das ist bestimmte ein ähnliches Problem, so als wenn man einen geflashten String als Parameter einer Routine zur Weiterverarbeitung übergeben will. Das geht auch nur mit dem Konstrukt "progmem". C versteht das nicht, dass es mehrere Speicherbereiche (SRAM, FLASH, EEPROM, IO,...) gibt. C kennt nur einen Speicherraum.
PORTC zum Beispiel ist definiert als
| Code: | | #define PORTC _SFR_IO8(0x15) |
und _SFR_IO8 als
| Code: | | #define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET) |
Wie man jetzt aber den Compiler überzeugt, einen Pointer aus dem IO-Bereich dem SRAM zu zuweisen und dabei keinen Fehler auszugeben, weis ich leider auch nicht. Vielleicht lässt sich die Typüberwachung temporär ausschalten?
P.S. Habe noch etwas herumprobiert; läuft im AVRstudio ohne Fehler, aber ob das die Lösung ist ...???
| Code: | /* für mega8 und Definition für PORT C
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)
#define PORTC _SFR_IO8 (0x08)
PORTC entspricht (*(volatile uint8_t *)(0x08))
*/
#include <avr/io.h>
volatile uint8_t * Pointer;
int main()
{
*(volatile uint8_t*)(0x08) = 0xAA;
*Pointer = *( volatile uint8_t*)(0x08);
*Pointer = PORTC;
*Pointer = 0;
} |
|
|
_________________ Gruß Berecke |
|
|
|
 | |  |
| myAVR.de Foren-Übersicht » Allgemein |
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1
|
|
|
|
|
|