Home/Startseite
Shop
 Kauf auf Rechnung
 faire Versandkosten
 schnelle Lieferung
Kontakt / Service
 
login.php profile.php?mode=register index.php search.php faq.php
myAVR.de Foren-Übersicht » Allgemein » Pointer Zeiger Problem
Neues Thema eröffnen  Neue Antwort erstellen Vorheriges Thema anzeigen :: Nächstes Thema anzeigen 
Pointer Zeiger Problem
BeitragVerfasst am: 08.02.2010, 10:21 Antworten mit Zitat
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?
Benutzer-Profile anzeigen Private Nachricht senden
Re: Pointer Zeiger Problem
BeitragVerfasst am: 08.02.2010, 12:16 Antworten mit Zitat
Viper
Anmeldungsdatum: 29.03.2009
Beiträge: 8




Kann es sein, dass eine explizite Konvertierung dafür notwendig ist?
Z.B.
Pointer=(int *)portc;
Benutzer-Profile anzeigen Private Nachricht senden
BeitragVerfasst am: 08.02.2010, 17:18 Antworten mit Zitat
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.

Code:

Pointer = PortC;


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

Code:

* Pointer = 0;


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.
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen ICQ-Nummer
BeitragVerfasst am: 08.02.2010, 18:20 Antworten mit Zitat
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.
Benutzer-Profile anzeigen Private Nachricht senden
BeitragVerfasst am: 08.02.2010, 19:23 Antworten mit Zitat
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.
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen ICQ-Nummer
BeitragVerfasst am: 09.02.2010, 4:12 Antworten mit Zitat
sharandac
Anmeldungsdatum: 08.10.2009
Beiträge: 34
Wohnort: Berlin




Salut, ich nochmal ...

schau dir mal den folgenden Artikel an ...

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#IO-Register_als_Parameter_und_Variablen

CA sharandac
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen ICQ-Nummer
BeitragVerfasst am: 09.02.2010, 7:32 Antworten mit Zitat
Viper
Anmeldungsdatum: 29.03.2009
Beiträge: 8




sharandac hat Folgendes geschrieben:
Salut, ich nochmal ...

schau dir mal den folgenden Artikel an ...

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#IO-Register_als_Parameter_und_Variablen

CA sharandac


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
Benutzer-Profile anzeigen Private Nachricht senden
BeitragVerfasst am: 10.02.2010, 20:15 Antworten mit Zitat
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? Crying or Very sad

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
Benutzer-Profile anzeigen Private Nachricht senden ICQ-Nummer


Pointer Zeiger Problem
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  

  
  
 Neues Thema eröffnen  Neue Antwort erstellen  


Powered by phpBB © 2001-2004 phpBB Group
Designed for Trushkin.net | Themes Database
Deutsche Übersetzung von phpBB.de