- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: uint16_t größte Variable?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523

    uint16_t größte Variable?

    Anzeige

    Powerstation Test
    Hallo,
    heute war ich wieder fleißig am proggen, leider hab ich etwa 2h durch einen wirklich dummen Fehler verloren

    Ich habe den Wert vom Timer1 eines Mega8 ausgelesen. Timer1 = 16bit. Gespeichert habe ich den Wert in uint32_t.
    Warum jetzt 32bit? Ganz einfach, ich wollte noch einen festen Wert dazumultiplizieren und ein uint32_t sollte ja theoretisch über 4Mrd speichern können.

    NOOOOP!!! Das Ding läuft genauso wie ein uint16_t bei 65535 über!!!

    WAS SOLL DAS???

    mfg

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Wsk8 Beitrag anzeigen
    NOOOOP!!! Das Ding läuft genauso wie ein uint16_t bei 65535 über!!!

    WAS SOLL DAS???
    Wenn das wirklich so ist, arbeitet dein Compiler nicht standardkonform oder er hat einen kapitalen Bug. Um das erste auszuschließen, kannst du ja mal in die stdint.h schauen. Da muß so etwas drin stehen wie:

    Code:
    /* Maximum of unsigned integral types.  */
    # define UINT8_MAX		(255)
    # define UINT16_MAX		(65535)
    # define UINT32_MAX		(4294967295U)
    Wenn du das findest, sollte sich der Compiler an den C Standard halten und du hast einen Compiler-Bug gefunden.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Zitat Zitat von Wsk8 Beitrag anzeigen
    ich wollte noch einen festen Wert dazumultiplizieren und ein uint32_t sollte ja theoretisch über 4Mrd speichern können.
    Ich habe die Regeln zur Typumwandlung nicht präsent, vermute aber folgendes: "Fester Wert" ist eine Konstante, damit int und 16-Bit breit. TCNT1 ist ebenfalls 16-Bit breit. Also bekommst du eine 16-Bit-Multiplikation, die läuft über und das Ergebnis landet in deiner 32-Bit-Variablen.

    Grüße,
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Ich arbeite mit dem Atmel Studio 6.1.2674 - SP1

    In der stdint.h
    Code:
    #define INT32_MAX 0x7fffffffLL
    #define INT32_MIN (-INT32_MAX - 1LL)
    #define UINT32_MAX (__CONCAT(INT32_MAX, U) * 2ULL + 1ULL)
    
    #else /* !__USING_MINT8 */
    #define INT32_MIN (-INT32_MAX - 1L)

    Ich habe die Regeln zur Typumwandlung nicht präsent, vermute aber folgendes: "Fester Wert" ist eine Konstante, damit int und 16-Bit breit. TCNT1 ist ebenfalls 16-Bit breit. Also bekommst du eine 16-Bit-Multiplikation, die läuft über und das Ergebnis landet in deiner 32-Bit-Variablen.
    Ich habe die 32bit Variable extra mit 65500 initialisiert und dann hochgezählt und musste feststellen, dass diese bei 65535 überläuft. Also nur 16bit.

    mfg

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Zitat Zitat von Wsk8 Beitrag anzeigen
    Ich habe die 32bit Variable extra mit 65500 initialisiert und dann hochgezählt und musste feststellen, dass diese bei 65535 überläuft. Also nur 16bit.
    Quelltext bitte. Ich bin fast geneigt zu wetten, dass dein Debugging-Code einen Fehler hat. In der Größenordnung printInt(uint16_t) oder so

    Grüße,
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Da ich es schon anders gelöst habe, habe ich den genauen nicht mehr, aber das Prinzip war genau so:
    Code:
    uint32_t myVar = 65500;
    char tmp[12] = {0};
    
    
    while(1) {
        sprintf(tmp, "%u", myVar);
        lcd_string(tmp);
        
        myVar++;
    }
    EDIT: Ich verwende einen Mega8, falls das einen Unterschied macht.

    mfg

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Zitat Zitat von Wsk8 Beitrag anzeigen
    sprintf(tmp, "%u", myVar);
    %u ist 16 Bit breit, nimm Mal %uu ...

    Grüße,
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Die Ausgabe funktioniert jetzt, aber die anfängliche Berechnung ist immer noch falsch

    Die sieht so aus:
    Code:
    #define TICK 32
    
    
    uint32_t myVar = 0;
    
    
    ISR(...) {
    	myVar = TCNT1;
    	TCNT1 = 0;
    	
    	myVar *= TICK;
    	
    	...
    }
    mfg

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    219
    hi,
    evtl.: myVar*=(uint32_t)TICK;
    mfg
    Achim

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Zitat Zitat von Wsk8 Beitrag anzeigen
    Die Ausgabe funktioniert jetzt, aber die anfängliche Berechnung ist immer noch falsch
    Was passiert? Das myVar 32-Bit breit ist, muss die Multiplikation auch mit 32-Bit erfolgen. Das sollte so eigentlich stimmen ...
    Du könntest Mal probieren, "#define TICK 32UL" zu schreiben (das hat die gleiche Wirkung wie der Vorschlag von Achim), ggf. bekommst du Probleme wegen unsigned*signed, aber ich bezweifle das.

    Grüße,
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Car2Go - Größte Elektro-Autoflotte rollt in Stuttgart
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 29.11.2012, 13:50
  2. NIBO2 - IR-Sendefkt nicht korrekt - "copro_TransmitRC5(uint16_t code)"
    Von Hero_123 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 5
    Letzter Beitrag: 12.03.2012, 08:24
  3. Bitweiser Zugriff uint16_t
    Von shedepe im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 20.07.2011, 12:58
  4. Warum uint16_t statt unsigned int?
    Von ricola im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 05.07.2007, 17:38
  5. if Variable > 1 then Variable + 1
    Von klaus1973 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 26.11.2005, 14:31

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad