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
Hi,
folgendes Problem...
Ich möchte mein 24C128 EEPROM auslesen, und zu dem zweck muss ich logischerweise eine FOR-Schleife 16000 mal durchlaufen.
Da die Funktion nie funktionierte hab ich mir mal erlaubt, den funktionellen Code auszukommentieren, und mir nur die generierten Adressen anzusehen.Code: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); }
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
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
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
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)...
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Dir ist schon klar, dass "11111111<<8" 2844444416 sind? Was Du willst ist "0b11111111<<8" glaub ich. \/Zitat von tombic
Übrigens kann man das auch so machen:
Ist besonders bei größeren Datentypen wie 'long' übersichtlicher. Erzeugt bei mir übrigens sogar kürzeren Code.Code:data[0] ((char*)(&address))[0]; data[1] ((char*)(&address))[1];
MfG Mark
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...
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Lesezeichen