- LiTime Speicher und Akkus         
Ergebnis 1 bis 9 von 9

Thema: warum negative zahl im terminal wenn diese >32000

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941

    warum negative zahl im terminal wenn diese >32000

    Anzeige

    LiFePo4 Akku selber bauen - Video
    hallo, bei ausgabe des wertes "wert_1 = 34000" kommt im terminal "-31536"
    zur anzeige. warum kommen die zahlen über "32000" als negative zahl
    zur ausgabe.
    mfg pebisoft

    Code:
    #include <inttypes.h> 
    #include <avr/io.h> 
    #include <avr/interrupt.h> 
    #include <avr/signal.h>
    #include <string.h> 
    #include <delay_1.c>
    #include <stdint.h>
    
    #define READ  1 
    #define WRITE 2 
    
    #define USART_BAUD_RATE 	19200 
    #define USART_BAUD_SELECT 	(F_CPU/(USART_BAUD_RATE*16l)-1) 
    
    void usart_init(int Enable, int Interupts) 
    { 
    	if (Enable & READ)         		UCSRB = (1<<RXEN); 
    	if (Enable & WRITE)        		UCSRB |= (1<<TXEN); 
    
        	if (Interupts & READ)         		UCSRB |= (1<<RXCIE); 
    	if (Interupts & WRITE)        		UCSRB |= (1<<TXCIE); 
        	UBRRL = (unsigned char) 		USART_BAUD_SELECT; 
    } 
    
    void usart_writeChar(unsigned char c) 
    { 
        	while (!(UCSRA & (1<<UDRE))) {} 
        	UDR = c; 
        	while(!(UCSRA & (1<<TXC))) {} 
    } 
    
    void usart_writeString(unsigned char *string) { 
        	while (!(UCSRA & (1<<UDRE))) {} 
    	while ( *string) 
        	usart_writeChar(*string++); 
    } 
    
    int main (void) 
    {   
               
    	char s[10];
    	uint16_t wert_1; 
    	usart_init( (READ + WRITE) , READ); 
    	
        	wert_1=34000; 
    	itoa( wert_1, s, 10);
    	while(1)
    	{
        	usart_writeString(s);
        	usart_writeString("\r");
        	warte(20000);
    	}
    }

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Pebi, sowas steht in der Doku für datentypen.
    du müßtest uint als "unsigned" definieren und hoffen, daß itoa auch schlau genug ist.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.12.2004
    Ort
    LEV
    Beiträge
    505
    Hallo,
    warum kommen die zahlen über "32000" als negative zahl
    zur ausgabe.
    Weil die Funktion itoa() zur Umsetzung von
    vorzeichenbehafteten Integerwerten in ASCII vorgesehen ist.
    Bei (unsigned)Integerwerten größer 32767 ist das höchstwertige Bit gesetzt,
    und das ist für itoa() das Kennzeichen für einen negativen Wert.

    Gruß Jan

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo, wie kann eine routine aussehen um dieses obern zu realisieren.
    oder gibt es in winavr-c eine routine, die ich nicht kenne für diese problem.
    mfg pebisoft

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    An sich wäre da "ltoa" statt "itoa" zuständig.

    extern char *ltoa(long int __val, char *__s, int __radix);

    versuch's mal.

    EDIT:
    eventuell auch das:

    extern char *utoa(long int __val, char *__s, int __radix);
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Hi,
    Zitat Zitat von pebisoft
    oder gibt es in winavr-c eine routine, die ich nicht kenne für diese problem.
    Auch selberschreiben ist in diesem Fall nicht schwer. Hier mal eine Routine von Peter Dannegger aus dem Mikrocontroller.net Forum:
    Code:
    void uart_put_int( uint16_t val )
    {
    	uint16_t TEST[] = { 10, 100, 1000, 10000 };
    	uint8_t d, i;
    	uint8_t zero;
    	uint16_t uval = val;
    
    	zero = 1;
    	i = 4;
    	do {
    		i--;
    		for( d = '0'; uval >= TEST[i]; uval -= TEST[i] ) {
    			d++;
    			zero = 0;
    		}
    		
    		if( zero == 0 )
    			uart_putc( d );
    		
    	} while( i );
    
    	uart_putc( (uint8_t) uval + '0' );
    }
    oder eine von mir die immer eine bestimmte Anzahl von Zeichen ausgibt ( das mit den Füllbytes kann man auch rausschmeißen wenn man es nicht benötigt ):
    Code:
    void uart_put_dec(uint16_t wert, uint8_t anzahl, char fuell)
    {
    	uint8_t i, s[5];
    
    	/* Zahl in String umwandeln */
    	for (i = 0; i < anzahl; i++)
    	{
    		s[anzahl - i - 1] = '0' + (wert % 10);
    		wert /= 10;
    	}
    
    	/* Füllbyte ersetzten */
    	for (i=0; i<(anzahl - 1); i++)
    	{
    		if (s[i] == '0')
    			s[i] = fuell;
    		else
    			break;
    	}
    
    	/* String ausgeben */
    	for (i=0; i<anzahl; i++)
    		uart_putc(s[i]);
    }
    MfG Kjion

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo robort vielen dank. uint auf 32 und dein "ltoa" klappt wunderbar.
    mfg pebisoft

    "uint32_t wert_1;"
    "ltoa( wert_1, s, 10)"

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo, habe noch ein projekt "srf08 zum laufen zu bringen".
    krieg ich nicht hin.
    mfg pebisoft

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ja Pebi, hab' ich gesehn. Das sieht aber irgendwie nach Arbeit aus.

Berechtigungen

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

LiFePO4 Speicher Test