-         
Ergebnis 1 bis 7 von 7

Thema: Atmega rechnet falsch...

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    25.05.2008
    Ort
    Korntal-Münchingen
    Alter
    40
    Beiträge
    5

    Atmega rechnet falsch...

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo zusammen,

    ich ein sehr dubioses Problem und zwar rechnet eine Funktion falsch..

    Hier ist erstmal die Funktion:

    Code:
    #define SENSOR_SHUNT 61.9
    
    int16_t calculate_pump_current (uint16_t Ua, uint16_t Ua_cal)
    {
        float diff;
        diff = Ua - Ua_cal;
    
        
        return (int16_t)(diff / (SENSOR_SHUNT * 8.0) * 1000);
    }
    Ua und Ua_cal sind Spannungen, in Millivolt zwischen 0 und 5000 (also 0V und 5V)

    Nun zum Problem:

    Wenn diff negativ ist, rechnet er einen Blödsinn zusammen.

    Beispiel für falsche Berechnung:
    Ua = 750
    Ua_cal = 1500
    Berechneter Wert ist: -222
    Erwarteter Wert: -1515

    Beispiel für korrekte Berechnung:
    Ua = 3000
    Ua_cal = 1500
    Berechneter Wert ist: 3029
    Erwarteter Wert: 3029

    Ich habe es mit Excel gegengerechnet.

    Hat jemand eine Idee, was da schief läuft?

    Danke Euch!

    EDIT:
    MCU: Atmega2560
    IDE: Mcrochip Studio 7.0.2542

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.12.2018
    Beiträge
    456
    Bist du sicher, dass du beim Return einen Datentyp angeben kannst oder musst? Der ist doch schon oben in der Funktionsdefinition angegeben.

    int16_t calculate_pump_current (uint16_t Ua, uint16_t Ua_cal)

    Was passiert, wenn du den bei der Return-Anweisung weglässt?

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    833
    Da...

    diff = (int16_t)Ua - (int16_t)Ua_cal;

    ...musst Du casten.
    Ansonsten subtrahierst Du zwei UINTs, was genauso schief geht, wie ein Addieren mit Überlauf.

    BTW: Hast Du noch den Simulator im Microchip Studio? Damit lässt sich sowas debuggen.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    25.05.2008
    Ort
    Korntal-Münchingen
    Alter
    40
    Beiträge
    5
    @Gnom67:

    Habe den cast gerade rausgenommen, beeindruckt hat es ihn aber nicht.

    Sieht jetzt so aus:

    Code:
    int16_t calculate_pump_current (uint16_t Ua, uint16_t Ua_cal)
    {
        float diff;
        diff = Ua - Ua_cal;
        
        return ((Ua - Ua_cal) / (SENSOR_SHUNT * 8.0) * 1000);
    }

    Zitat Zitat von Holomino Beitrag anzeigen
    Da...

    diff = (int16_t)Ua - (int16_t)Ua_cal;

    ...musst Du casten.
    Ansonsten subtrahierst Du zwei UINTs, was genauso schief geht, wie ein Addieren mit Überlauf.

    BTW: Hast Du noch den Simulator im Microchip Studio? Damit lässt sich sowas debuggen.
    Nein, da muss ich nichts casten und es geht auch nichts schief, der diff wird immer richtig gerechnet, ob positiv oder negativ. Die Variable diff ist ein float...

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    833
    Probier es bitte erst aus, bevor Du meckerst.
    750U-1500U= 64xxxU
    Danach erst wird implizit in float gewandelt.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    25.05.2008
    Ort
    Korntal-Münchingen
    Alter
    40
    Beiträge
    5
    WTF.... Du hast Recht.

    Er tut jetzt so wie es sein soll.

    Ich verstehe es trotzdem nicht, warum die Variable diff, ohne cast, richtig ausgegeben wird.

    Hier der vollständige code:

    Code:
    int16_t calculate_pump_current (uint16_t Ua, uint16_t Ua_cal)
    {
        float diff;
        diff = (int16_t)Ua - (int16_t)Ua_cal;
        
        liveData[26] = low(diff);
        liveData[27] = high(diff);
        
        return ((diff) / (SENSOR_SHUNT * 8.0) * 1000);
    }
    Die Variable liveData[...] ist als uint8_t liveData[30] definiert, die dann per usart rausgeschoben wird. Der Empfänger sieht den diff-Wert aber korrekt...

    Hab jetzt den ganzen Mist rausgeworfen und nun sieht es so aus:

    Code:
    int16_t calculate_pump_current (uint16_t Ua, uint16_t Ua_cal)
    {    
        return (((int16_t)Ua - (int16_t)Ua_cal) / (SENSOR_SHUNT * 8.0) * 1000);
    }
    und rechnet auch richtig.

    Danke schön!

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    833
    Ich denke mal, dass der Unterschied in den VIER Bytes des floats nicht in deinen beiden ausgegebenen Testbytes liegt.

Ähnliche Themen

  1. Rechnet der Arduino Falsch?
    Von RoboterSindCool im Forum Arduino -Plattform
    Antworten: 6
    Letzter Beitrag: 30.12.2016, 14:40
  2. Antworten: 16
    Letzter Beitrag: 10.05.2015, 12:06
  3. schon mal festgestellt? A. Due rechnet falsch - Mega ok!
    Von HaWe im Forum Arduino -Plattform
    Antworten: 47
    Letzter Beitrag: 21.11.2014, 21:27
  4. Comparator @ ATMEGA 8 Was ist falsch in der Programmierung?
    Von EISMAN im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 22.10.2006, 17:04
  5. Rechnet der AVR falsch oder bin in ich nur zu dumm ?
    Von NumberFive im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 11.02.2005, 13:35

Berechtigungen

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