-         

Ergebnis 1 bis 7 von 7

Thema: 2 verschiedene Variablen greifen auf das selbe Register zu

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2007
    Ort
    53° 4' 37" N, 8° 48' 32" O
    Alter
    30
    Beiträge
    10

    2 verschiedene Variablen greifen auf das selbe Register zu

    Anzeige

    Hi!
    ich schreibe gerade an einer C-Ansteuerung für das Pollin-Display ALPS LSU7S1011A. Auf völlig unerklärliche Weise scheinen jedoch zwei Variablen, die eigentlich völlig unabhängig voneinander sind, auf das selbe Register zuzugreifen. Dadurch wird natürlich eine der Variablen überschrieben...

    Hier der Quellcode:
    Code:
    #include <avr/io.h>
    
    // PINBELEGUNG
    #define cRES 3
    #define cNCS 2
    #define cCS 1
    #define cA0 4
    #define cSCL 5
    #define cSI 0
    
    
    int main(void)
    {
    	DDRA = 0xff;
    	
    	initialisierung();
    	SendLCDByte(0xB0,0); // page setzen (1)
    	SendLCDByte(0x11,0); // column setzen (18)
    	SendLCDByte(0x02,0);
    	
    	SendLCDByte(0xAA,1); // 10101010 in spalte schreiben
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    	SendLCDByte(0xAA,1);
    
    	while (1) 
    	{
    	
    	}
    }
    
    void SendLCDByte(unsigned char data, unsigned char control) 
    {
    
    	unsigned char zaehler;
    	unsigned char belegung;
    	belegung |= (1 << cRES);
    	if (control>0) 
    	{
    		belegung |= (1 << cA0);
    	}
    	for (zaehler=0x00; zaehler<0x08; zaehler++) 
    	{
    		if ((data & (1 << 7))!=0) //bit 7 ist gesetzt 
    		{
    			belegung |= (1 << cSI);
    		} else
    		{
    			belegung &= (1 << cSI);
    		}
    		PORTA = belegung;
    		PORTA |= (1 << cSCL);
    		PORTA &= (1 << cSCL);
    		data<<=1;
    	}
    	belegung &= (1 << cCS);
    	belegung |= (1 << cNCS);
    	PORTA = belegung;
    
    }
    
    void initialisierung()
    {
    	PORTA = 0x00; // Reset
    	PORTA |= (1 << cRES);
    	SendLCDByte(0x40,0); // Start Display Line = 0
    	SendLCDByte(0xA1,0); // ADC = invers (gespiegelte Anzeigerichtung)
    	SendLCDByte(0xA3,0); // LCD-Bias = 1/6
    	SendLCDByte(0xC0,0); // OutputStatus =0
    	SendLCDByte(0x2F,0); // LCD-Spannungserzeugung/Regelung ein
    	SendLCDByte(0x8F,0); // Kontrast = mittel
    	SendLCDByte(0xA4,0); // Displaytest aus
    	SendLCDByte(0xAF,0); // Display ein
    	SendLCDByte(0xA6,0); // Display normal (nicht invertiert)
    }
    die betreffenden Variablen sind "zaehler" und "belegung", sie greifen scheinbar beide auf Register 24 zu.

    Da ich dieses Verhalten wirklich gar nicht nachvollziehen kann, bin ich für jeden Hinweis sehr dankbar!
    Gruß,
    Hepta
    Jeder dumme Junge kann einen Käfer zertreten. Aber alle Professoren der Welt können keinen herstellen. Albert Einstein

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Hallo,
    es wäre nicht schlecht, wenn Du mal die entsprechende Kompilerausgabe mal postest, damit wir kein Copy/Paste machen, und das ganze übersetzen müssen.
    Bitte aber nur diese Funktion und nicht das ganze Programm

    Gruß Sebastian

    P.S.

    Außerdem sehe ich hier ein paar Denkfehler
    Code:
    unsigned char belegung;
    Lokale Variablen haben undefinierten Wert, meine ich, also steht irgendwas drin.

    und weiter kommt das:
    Code:
    belegung |= (1 << cA0);
    Also veroderst du irgendwas mit cA0
    und das
    Code:
    belegung &= (1 << cSI);
    Ergibt immer 0, war das so gewollt ?
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2007
    Ort
    53° 4' 37" N, 8° 48' 32" O
    Alter
    30
    Beiträge
    10
    Hallo izaseba,
    Mit Kompilerausgabe meinst Du die Meldungen, die der Compiler beim Compilieren ausgibt?
    Wenn ja, er zeigt nur, dass der Code mit 0 Warnungen und ohne Fehler Compiliert werden kann
    Jeder dumme Junge kann einen Käfer zertreten. Aber alle Professoren der Welt können keinen herstellen. Albert Einstein

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Mit Kompilerausgabe meinst Du die Meldungen, die der Compiler beim Compilieren ausgibt?
    Nein ich meine den Inhalt der Datei *.lss oder *.lst (da wo die Assemblerausgabe steht)

    Außerdem habe ich oben ein P.S. gemacht, vieleicht hilft das schon ?
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2007
    Ort
    53° 4' 37" N, 8° 48' 32" O
    Alter
    30
    Beiträge
    10
    Hi izaseba,
    Vielen Dank für Deine Hilfe, ich hab den Fehler gefunden:
    Code:
     belegung &= (1 << cSI);
    muss in Wirklichkeit
    Code:
     belegung &= ~(1 << cSI);
    heißen.
    Was so eine Tilde doch alles verändern kann...
    Beim Übertragen von http://www.mikrocontroller.net/artic...eiben_von_Bits hab ich das wohl übersehen...
    Im AVR-Studio-Simulator sieht jetzt alles sehr gut aus, nur auf dem Display geht es noch nicht...
    naja, trotzdem danke erstmal, Dein Tipp hat mir sehr weitergeholfen!
    Gruß,
    Hepta
    Jeder dumme Junge kann einen Käfer zertreten. Aber alle Professoren der Welt können keinen herstellen. Albert Einstein

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Was so eine Tilde doch alles verändern kann...
    Hab ich mir schon gedacht...
    Eh, und was ist mit der anderen Sache ?
    Ich habe jetzt keine Lust mein C Buch rauszuholen um 100% sicher zu sein, aber ich meine belegung hat beim betretten der Funktion einen undefinierten Wert.
    Wenn Deine Absicht war, daß belegung am Anfang (1 << cA0) ist dann lass diesen ODER Operator bei
    Code:
    belegung |= (1 << cA0);
    weg.
    Oder noch schöner dei der Deklaration
    Code:
    unsigned char belegung=(1<<cA0);
    Spart eine Zeile und bewirkt das gleiche...

    Vielleicht läuft das Moped damit schon

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2007
    Ort
    53° 4' 37" N, 8° 48' 32" O
    Alter
    30
    Beiträge
    10
    Vielen Dank für die Antworten, es funktioniert jetzt einwandfrei, ich hatte nur vergessen, die sehr unscheinbare CS-Leitung rechtzeitig auf high zu setzen...
    Jeder dumme Junge kann einen Käfer zertreten. Aber alle Professoren der Welt können keinen herstellen. Albert Einstein

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •