PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 16Bit laufen nach 10Bit über



tobimc
28.04.2007, 17:23
Hi,

folgendes Problem...
Ich möchte mein 24C128 EEPROM auslesen, und zu dem zweck muss ich logischerweise eine FOR-Schleife 16000 mal durchlaufen.


void read_eeprom(void){
volatile uint16_t address = 0;
uint8_t data[3];
uint8_t zero = 10;
//uint8_t wait = 0;

//zero = 0;


for(address = 0 ; address < 16000 ; address++){



data[0] = (address & (11111111 << 8)) >> 8;
data[1] = (address & 0xFF);
data[2] = 0;

uartsendchar(data[0]);
uartsendchar(data[1]);

zero = 10;

/*Kommentare*/

}

uartsendchar(68);
uartsendchar(111);
uartsendchar(110);
uartsendchar(101);
uartsendchar(33);

}

Da die Funktion nie funktionierte hab ich mir mal erlaubt, den funktionellen Code auszukommentieren, und mir nur die generierten Adressen anzusehen.

Die 16-Bit Variable address wird in 2 Bytes aufgespalten (high [data[0]], low [data[1]]). Diese werden dann via uartsendchar(); über UART ausgegeben.

Das funktioniert ganz klasse ... bis address = 2047 (7 , 255) dann springt meine generierte Addresse an 0 (0, 0). Das lustige ist aber, dass die Schleife exakt 16000 mal durchlaufen wird.
Frage: Woran liegts?

(Ich verwende -Os)

Ich danke euch für die Hilfe, ich hab nämlich z.Zt. schlicht keinen Plan mehr, an was es liegen könnte.

VLG Tobi

geronet
28.04.2007, 17:44
Was soll denn bitte (11111111 << 8) sein?!
Ich würde das so machen:

data[0] = (uint8_t)(address >> 8);
data[1] = (uint8_t) address;
data[2] = 0;

Casten heisst das Zauberwort ;)

Grüsse, Stefan

tobimc
28.04.2007, 19:15
Hi,

Das ist eine Maske, mit der nur die oberen 8 Bits selektiert werden. Ich weis, eigentlich völlig sinnlos...

Hm. Geht.

Aber eigentlich sollte da kein Cast nötig sein. Die oberen 8 Bit dürfen ja ruhig überlaufen -> sollte also auch so funzen...
Aber ich hab ja schon längst aufgehört, mich über den AVRGCC zu wundern... ;D

Danke.

VLG Tobi

PS/Edit: ...zumindest theoretisch. Aber dass der GCC da nicht meckert ist nicht nett. Naja, mal wieder sowas, auf das man hätte auch selber kommen können (solche Probleme regen mich immer besonders auf)...

p_mork
28.04.2007, 20:52
Das ist eine Maske, mit der nur die oberen 8 Bits selektiert werden. Ich weis, eigentlich völlig sinnlos..

Dir ist schon klar, dass "11111111<<8" 2844444416 sind? Was Du willst ist "0b11111111<<8" glaub ich. \:D/

Übrigens kann man das auch so machen:

data[0] ((char*)(&address))[0];
data[1] ((char*)(&address))[1];

Ist besonders bei größeren Datentypen wie 'long' übersichtlicher. Erzeugt bei mir übrigens sogar kürzeren Code.

MfG Mark

tobimc
29.04.2007, 15:25
Hi

Ist mir auch grad aufgefallen. Ich frag mich grad, wie behämmert man eigentlich sein kann...

Aber ich glaube den betreffenden code hab ich nachts um ... geschreiben insofern...
Aua tut das weh.
](*,) ](*,) ](*,) ](*,) ](*,) ](*,) ](*,)

Wie blöd kann man eigentlich sein?!

VLG...