PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 verschiedene Variablen greifen auf das selbe Register zu



Hepta
09.09.2007, 00:06
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:


#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

izaseba
09.09.2007, 00:20
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 :-k


unsigned char belegung;

Lokale Variablen haben undefinierten Wert, meine ich, also steht irgendwas drin.

und weiter kommt das:


belegung |= (1 << cA0);

Also veroderst du irgendwas mit cA0
und das

belegung &= (1 << cSI);
Ergibt immer 0, war das so gewollt ?

Hepta
09.09.2007, 00:31
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

izaseba
09.09.2007, 00:38
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 ?

Hepta
09.09.2007, 00:59
Hi izaseba,
Vielen Dank für Deine Hilfe, ich hab den Fehler gefunden:

belegung &= (1 << cSI);
muss in Wirklichkeit

belegung &= ~(1 << cSI);
heißen.
Was so eine Tilde doch alles verändern kann...
Beim Übertragen von http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Schreiben_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

izaseba
09.09.2007, 01:10
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
belegung |= (1 << cA0); weg.
Oder noch schöner dei der Deklaration


unsigned char belegung=(1<<cA0);

Spart eine Zeile und bewirkt das gleiche...

Vielleicht läuft das Moped damit schon ;-)

Gruß Sebastian

Hepta
10.09.2007, 15:39
Vielen Dank für die Antworten, es funktioniert jetzt einwandfrei, ich hatte nur vergessen, die sehr unscheinbare CS-Leitung rechtzeitig auf high zu setzen... ](*,) ](*,) ](*,)