- Labornetzteil AliExpress         
Ergebnis 1 bis 4 von 4

Thema: Vergleich zweier Werte stimmt nicht.

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.09.2008
    Beiträge
    19

    Vergleich zweier Werte stimmt nicht.

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi

    ich habe heute zwar schon in einem anderen Forum geschrieben aber keine Antwort bekommen. Die Anzahl der Leute die dieses Forum betrachten ist denke ich zu gering. Versuche ich es hier.

    Ich arbeite mit mikroC PRO und habe in meinem Programm einen Fehler den ich nicht finde.Der Mikrocontroller ist ein PIC16F873A.
    Projekt: Impulse zähle. Nach einer zuvor eingestellten Soll Zahl soll bei erreichen der Soll Zahl ein Impuls ausgegeben werden.Soll- und Ist-Zahl werden im EEprom gespeichert.

    Das Problem ist das die Werte im laufenden Betrieb nicht richtig verglichen werden. Sie werden nur einmal richtig verglichen, und das ist gleich nach dem Brennen des Pic mit mikroC PRO. Ich vermute den Fehler bei den Datentypen. Habe aber schon alles mögliche probiert.Bekomme es nicht hin.Die Stelle an der verglichen wird ist in main: if(((int)istwert1)==((int)sollwert1)).

    Hat jemand eine Idee?


    Code:
    // Lcd pinout settings
    sbit LCD_RS at RC0_bit;
    sbit LCD_EN at RC1_bit;
    sbit LCD_D4 at RC2_bit;
    sbit LCD_D5 at RC3_bit;
    sbit LCD_D6 at RC4_bit;
    sbit LCD_D7 at RC5_bit;
    
    // Pin direction
    sbit LCD_RS_Direction at TRISC0_bit;
    sbit LCD_EN_Direction at TRISC1_bit;
    sbit LCD_D4_Direction at TRISC2_bit;
    sbit LCD_D5_Direction at TRISC3_bit;
    sbit LCD_D6_Direction at TRISC4_bit;
    sbit LCD_D7_Direction at TRISC5_bit;
    
    
    //########################## globale Variablen #####################                                                     +
    char txt1[] = "Druckeransteu.";
    unsigned short menue = 0;
    unsigned int sollwert1,zaehler=0;
    
    //########################## Funktionsdekleration ##################
    unsigned short rotary();
    //unsigned short anzeige(unsigned int);
    unsigned int eprom_lesen(unsigned short);
    unsigned short eprom_schreiben(unsigned short,unsigned int);
    
    //##################  Funktionen  #########################
    void anzeige(unsigned int x)
    {
       unsigned short anzeige[10] ;
    
       IntToStr(x,anzeige);
       Lcd_Out(2,1,anzeige);
    
     //  LCD_Chr_CP(46);
    
      // ch = x % 10;
      // LCD_Chr(2,12,48+ch);
    }
    //--------------------------------------------------------
    unsigned short rotary_stell(unsigned short adresse)   //Sollwert einstellen
    {
       unsigned short wert1, wert2, e = 1, anzeige[10] ;
       unsigned int i ;
    
          if (adresse == 0x00 ) {i = eprom_lesen(adresse) ;}
      // if (adresse == 0x02 ) {i = eprom_lesen(adresse) ;}
       Lcd_Cmd(_LCD_CLEAR);
       Lcd_Out(1,2,"Sollstueckzahl");
       Lcd_Out(2,3,"+/-");
       IntToStr(i,anzeige);
       Lcd_Out(2,6,anzeige);
       while ( e == 1 )
          {
            wert1 =  (PORTB & 0x18);           //aktuelle stellung nach wert1
    
                if ((wert1 ^ wert2)  >= 1)     //wurde der Rotary bewegt oder wert1 = wert2
                   {
                     wert2 = (wert2 << 1 );    //verschieben des zweiten aufgenommenden wertes
    
                     if ((wert1 ^ wert2)  == 0x10) {i ++;}
    
                     if ((wert1 & wert2)  == 0x10) {i -- ;}
    
                     if (i > 200) {i = 1 ;}
    
                     if (i < 1)    {i = 200 ;}
    
                      wert2  = wert1 ;
    
                      IntToStr(i,anzeige);
                      Lcd_Out(2,6,anzeige);
                   }
               if (Button(&PORTB, 5, 20, 1) && e == 1)
               {
                while((PORTB & 0x20)==0x20);
                e =0;
    
                if (adresse == 0x00 ) {eprom_schreiben(adresse,i );}
     //           if (adresse == 0x02 ) {eprom_schreiben(adresse,i );}
    
                LCD_Cmd(_LCD_CLEAR);
                delay_ms(600);
                LCD_Out(2,6,anzeige);
                LCD_Out(2,8,"/");
               }
          }
    return e;
    }
    //----------------------------------------------------------
    unsigned int eprom_lesen(unsigned short adr)
    {
       int zahl;
       unsigned short temp;
    
       temp = Eeprom_Read(adr);
       zahl  = temp;
       zahl  = zahl <<8;
    
       temp = Eeprom_Read(adr+1);
       zahl = zahl + temp;
    return zahl;
    }
    
    unsigned short eprom_schreiben(unsigned short xxx,unsigned int xxxx )
    {
       unsigned int temp;
    
       temp = xxxx;
       Eeprom_Write ( xxx+1,temp );
       temp = (xxxx>>8);
       Eeprom_Write ( xxx,((short)temp) );
    return 0;
    }
    
    
    //#######################  main  #######################
    void main()
    {
    unsigned short enter=0 ;
    //unsigned long ;
    unsigned int istwert1;
    char sollwert2[7],istwert2[7];
    
      TRISA = 0x3F; //Eingang
      TRISB = 0x38; //Ausgang und Eingang 00111000
      TRISC = 0x00; //Ausgang
      
      PORTA = 0x00; //Alle auf 0
      PORTB = 0x00; //Alle auf 0
      PORTC = 0x00; //Alle auf 0
      INTCON = 0x00;
      OPTION_REG = 0x80 ;
      PIE1 = 0x00 ;
      PIR1 = 0x00 ;
      CCP1CON = 0x00 ;
      ADCON1 = 0x06;   //alle Digital
      
      Lcd_Init();                        // Initialize LCD
      delay_ms(200);
      Lcd_Cmd(_LCD_CLEAR);               // Clear display
      Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
      Lcd_Out(1,2,txt1);
      delay_ms (2000);
      Lcd_Cmd(_LCD_CLEAR);
      
      sollwert1=eprom_lesen(0x00);
      IntToStr(sollwert1,sollwert2);
      LCD_Out(1,5,"Aktuell");
      LCD_Out(2,6,sollwert2);
      LCD_Out(2,8,"/");
      
      istwert1 = eprom_lesen(0x03);
      IntToStr(istwert1,istwert2);
      LCD_Out(2,1,istwert2);
    
    
      do
        {
                if (Button(&PORTB, 5, 20, 1) )             // Menueauswahl
            {
             while((PORTB & 0x20)==0x20);
             enter=0;
             menue = rotary_stell(enter);              // Sollwert einstellen
    
             LCD_Out(1,5,"aktuell");
             anzeige(istwert1);
            }
            if ((PORTA & 0x02)==0x02)
            {
            istwert1=istwert1+1;
            eprom_schreiben(0x03,istwert1 );
            anzeige(istwert1);
            while((PORTA & 0x02)==0x02);
            }
            
            if (((int)istwert1)==((int)sollwert1))
            //res=strcmp(istwert2,sollwert2) ;
            //if(res==0)
            {
            PORTB=PORTB|0x80;
            }
            else
            {
            PORTB=PORTB|0x40;
            }
        }
        while(1);
    }

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Bei einem PC ist ein "int" üblicherweise 32-Bit lang, ein "short" 16
    Auf einem µC ist das aber nicht gesagt.
    zuständig ist meistens "types.h"
    Schau mal in das Compilerlisting, was denn nun Sache ist.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Vielleicht mal so versuchen:

    Code:
    //########################## globale Variablen #####################                                                     +
    char txt1[] = "Druckeransteu.";
    unsigned short menue = 0;
    unsigned int sollwert1, istwert1, zaehler=0;
    Oder:

    if( ( (int)istwert1 - (int)sollwert1 ) == 0)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    19.09.2008
    Beiträge
    19
    Danke PicNick und radbruch. Jetzt habe ich es.
    Man war das eine Geburt! Ich glaub es waren mehrere Fehler. Zum einen habe ich vergessen den geänderten Sollwert auch wirklich mit dem Ist Wert zu vergleichen. Habe ihn nur angezeigt aber nicht damit gearbeitet. Und den Rest werden die Datentypen gemacht haben. Da habe ich jetzt mehr unsigned char verwendet. Für meine Zwecke ausreichend.
    Sieht zwar noch ein bisschen wüst aus aber wer mal drauf schauen möchte........

    Ach so. Falls noch jemand Ideen hat, wie ich meine Programmierung besser machen kann. Nur zu

    Code:
    // Lcd pinout settings
    sbit LCD_RS at RC0_bit;
    sbit LCD_EN at RC1_bit;
    sbit LCD_D4 at RC2_bit;
    sbit LCD_D5 at RC3_bit;
    sbit LCD_D6 at RC4_bit;
    sbit LCD_D7 at RC5_bit;
    
    // Pin direction
    sbit LCD_RS_Direction at TRISC0_bit;
    sbit LCD_EN_Direction at TRISC1_bit;
    sbit LCD_D4_Direction at TRISC2_bit;
    sbit LCD_D5_Direction at TRISC3_bit;
    sbit LCD_D6_Direction at TRISC4_bit;
    sbit LCD_D7_Direction at TRISC5_bit;
    
    
    //########################## globale Variablen #####################                                                     +
    char txt1[] = "Druckeransteu.";
    unsigned short menue = 0;
    unsigned int sollwert1,zaehler=0;
    
    //########################## Funktionsdekleration ##################
    unsigned short rotary();
    //unsigned short anzeige(unsigned int);
    unsigned int eprom_lesen(unsigned short);
    unsigned short eprom_schreiben(unsigned short,unsigned int);
    
    //##################  Funktionen  #########################
    unsigned void anzeige(unsigned int x)
    {
       unsigned short anzeige[10] ;
    
       IntToStr(x,anzeige);
       Lcd_Out(2,1,anzeige);
    
     //  LCD_Chr_CP(46);
    
      // ch = x % 10;
      // LCD_Chr(2,12,48+ch);
    }
    //-------------------------------------------------------------
    /*
    unsigned short rotary(unsigned short enterf)
    {
        unsigned short wert1, wert2;
        short i = 1;
    
        LCD_Cmd(_LCD_CLEAR);
        LCD_Out(1,2,"Soll-Stueckzahl");
        while ( enterf == 1 )
           {
             wert1 =  (PORTB & 0x18);           //aktuelle stellung nach wert1
    
                if ((wert1 ^ wert2)  >= 1)      //wurde der Rotary bewegt oder wert1 = wert2
                   {
                     //LCD_Cmd(LCD_CLEAR);
                     wert2 = (wert2 << 1 );     //verschieben des zweiten aufgenommenden wertes
    
                     if ((wert1 ^ wert2)  == 0x02)
                        {i --;}
    
                     if ((wert1 & wert2)  == 0x02)
                        {i ++ ;}
    
                     if (i >= 1)
                        {i = 1 ;}
    
                     if (i <= 1)
                        {i = 1 ;}
    
                     wert2  = wert1 ;
    
            //         if(i == 1 ) { LCD_Out(1,2,"Differenzwert");}
    
                   }
               if (Button(&PORTB, 5, 20, 1) && enterf == 1)
               {
                while((PORTB & 0x10)==0x10);
                enterf =0;
               }
           }
    return i;
    }        */
    //--------------------------------------------------------
    unsigned short rotary_stell(unsigned short adresse)   //Sollwert einstellen
    {
       unsigned short wert1, wert2, e = 1, anzeige[10] ;
       unsigned int i ;
    
          if (adresse == 0x00 ) {i = eprom_lesen(adresse) ;}
      // if (adresse == 0x02 ) {i = eprom_lesen(adresse) ;}
       Lcd_Cmd(_LCD_CLEAR);
       Lcd_Out(1,2,"Sollstueckzahl");
       Lcd_Out(2,3,"+/-");
       IntToStr(i,anzeige);
       Lcd_Out(2,6,anzeige);
       while ( e == 1 )
          {
            wert1 =  (PORTB & 0x18);           //aktuelle stellung nach wert1
    
                if ((wert1 ^ wert2)  >= 1)     //wurde der Rotary bewegt oder wert1 = wert2
                   {
                     wert2 = (wert2 << 1 );    //verschieben des zweiten aufgenommenden wertes
    
                     if ((wert1 ^ wert2)  == 0x10) {i ++;}
    
                     if ((wert1 & wert2)  == 0x10) {i -- ;}
    
                     if (i > 200) {i = 1 ;}
    
                     if (i < 1)    {i = 200 ;}
    
                      wert2  = wert1 ;
    
                      IntToStr(i,anzeige);
                      Lcd_Out(2,6,anzeige);
                   }
               if (Button(&PORTB, 5, 20, 1) && e == 1)
               {
                while((PORTB & 0x20)==0x20);
                e =0;
    
                if (adresse == 0x00 ) {eprom_schreiben(adresse,i );}
     //           if (adresse == 0x02 ) {eprom_schreiben(adresse,i );}
                sollwert1=eprom_lesen(adresse);
    
                LCD_Cmd(_LCD_CLEAR);
                delay_ms(600);
                LCD_Out(2,6,anzeige);
                LCD_Out(2,8,"/");
               }
          }
    return e;
    }
    //----------------------------------------------------------
    unsigned int eprom_lesen(unsigned short adr)
    {
       unsigned int zahl;
       unsigned short temp;
    
       temp = Eeprom_Read(adr);
       zahl  = temp;
       //zahl  = zahl <<8;
    
       //temp = Eeprom_Read(adr+1);
       //zahl = zahl + temp;
    return zahl;
    }
    
    unsigned short eprom_schreiben(unsigned short xxx,unsigned int xxxx )
    {
       unsigned int temp;
    
       temp = xxxx;
       //Eeprom_Write ( xxx+1,temp );
       //temp = (xxxx>>8);
       Eeprom_Write ( xxx,((short)temp) );
    return 0;
    }
    
    
    //#######################  main  #######################
    void main()
    {
    unsigned short enter=0 ;
    //unsigned long ;
    unsigned int istwert1;
    unsigned char sollwert2[7],istwert2[7];
    
      TRISA = 0x3F; //Eingang
      TRISB = 0x38; //Ausgang und Eingang 00111000
      TRISC = 0x00; //Ausgang
    
      PORTA = 0x00; //Alle auf 0
      PORTB = 0x00; //Alle auf 0
      PORTC = 0x00; //Alle auf 0
      INTCON = 0x00;
      OPTION_REG = 0x80 ;
      PIE1 = 0x00 ;
      PIR1 = 0x00 ;
      CCP1CON = 0x00 ;
      ADCON1 = 0x06;   //alle Digital
    
      Lcd_Init();                        // Initialize LCD
      delay_ms(200);
      Lcd_Cmd(_LCD_CLEAR);               // Clear display
      Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
      Lcd_Out(1,2,txt1);
      delay_ms (2000);
      Lcd_Cmd(_LCD_CLEAR);
    
      sollwert1=eprom_lesen(0x00);
      IntToStr(sollwert1,sollwert2);
      LCD_Out(1,5,"Aktuell");
      LCD_Out(2,6,sollwert2);
      LCD_Out(2,8,"/");
    
      istwert1 = eprom_lesen(0x03);
      IntToStr(istwert1,istwert2);
      LCD_Out(2,1,istwert2);
    
    
      do
        {
                if (Button(&PORTB, 5, 20, 1) )             // Menueauswahl
            {
             while((PORTB & 0x20)==0x20);
             enter=0;
             menue = rotary_stell(enter);              // Sollwert einstellen
    
             LCD_Out(1,5,"aktuell");
             anzeige(istwert1);
            }
            if ((PORTA & 0x02)==0x02)
            {
            istwert1=istwert1+1;
            eprom_schreiben(0x03,istwert1 );
            anzeige(istwert1);
            while((PORTA & 0x02)==0x02);
            }
    
             // istwert1=istwert1+1;
             // anzeige(istwert1);
    
              
            if (((unsigned char)istwert1)==((unsigned char)sollwert1))
            //res=strcmp(istwert2,sollwert2) ;
            //if(res==0)
            {
            PORTB=0x80;
            istwert1=0;
    
            delay_ms(500);
            anzeige(istwert1);
            }
            else
            {
            PORTB=0x40;
            } 
        }
        while(1);
    }

Ähnliche Themen

  1. Vergleich zweier Werte führt zu merkwürdigem Verhalten
    Von chris@franke im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 27.01.2010, 15:50
  2. Konstantstromquelle... was stimmt nicht?
    Von Hansanaut im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 29.11.2007, 20:56
  3. was stimmt an dem schaltplan nicht?
    Von hacker im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 2
    Letzter Beitrag: 14.05.2005, 16:34
  4. LCD Ausgabe stimmt nicht
    Von emulein im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 14.02.2005, 20:28
  5. was stimmt da nicht?
    Von michi im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 24
    Letzter Beitrag: 02.03.2004, 13:05

Berechtigungen

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

12V Akku bauen