- Labornetzteil AliExpress         
Ergebnis 1 bis 5 von 5

Thema: 16Bit laufen nach 10Bit über

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    34
    Beiträge
    1.461

    16Bit laufen nach 10Bit über

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi,

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

    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);
    
    }
    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
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.01.2007
    Beiträge
    134
    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

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    34
    Beiträge
    1.461
    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

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    Zitat Zitat von tombic
    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. \/

    Übrigens kann man das auch so machen:
    Code:
    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

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    34
    Beiträge
    1.461
    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

Berechtigungen

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

12V Akku bauen