-
        

Ergebnis 1 bis 4 von 4

Thema: Zhlvariable luft ber

  1. #1

    Zhlvariable luft ber

    Anzeige

    Hallo Roboternetz-Forum!

    Ich habe ein kleines Problem. Ich will mit dem ATmega328p eine kleine Messschaltung aufbauen, fr welche ich eine Zeitmessung brauche. In diesem Fall habe ich den Timer 1 so eingestellt, dass er akke 10us einen Overflow-Interrupt verursacht. Die Variable, die ich in der Timer-ISR raufzhlen lasse, habe ich zum testen mal auf einem I2C LCD Display ausgegeben. Das Problem hierbei: die Variable hat schon nach dem Wert (2^16)/2 einen berlauf. Die ist aber als 'unsigned long int' deklariert, also eigendlich als 32-bit. Aber egal, was ich probiere, der berlauf kommt immer viel zu frh, was mache ich hier falsch?

    Hoffe, Ihr knnt mir helfen!

    Code:
    #include <avr/io.h>
    #include <util/delay.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    
    #include "lcd.h" // Library for I2C LCD Display
    
    #define F_CPU 16000000UL
    #define TIMER1_PRELOAD -20
    
    extern void lcd_backlight(char on); // not in lcd.h
    
    unsigned long int timer1_cnt = 0;
    char buffer_timer1_cnt[20]; // to buffer a variable for "itoa"
    
    int main (void) {
    
    	// Initalize 16-bit Timer 1 Overflow-Interrupt
    
    	TCCR1A = 0x00;
    	TCCR1B = (0 << CS12) | (1 << CS11) | (0 << CS10); // set prescaler to 8 --> Timer = 8 / 16MHz = 0.5us --> preload = -20
    	TCNT1 = TIMER1_PRELOAD;
    
    	TIMSK1 = (1<<TOIE1); // enable timer 1 overflow interrupt
    
    	sei(); // (set enable interrupt) enable all interrupts
    
    	lcd_init(LCD_ON_DISPLAY);
    
    	lcd_backlight(1);
    
    	while(1) {
    
    		lcd_clrscr();
    
    		lcd_gotoxy(0, 0); // first parameter = column, second parameter = line
    
    		itoa(timer1_cnt, buffer_timer1_cnt, 10); // convert integer to string
    		lcd_puts(buffer_timer1_cnt); // write a string to I2C-LCD Display
    
    		_delay_ms(10);
    
    	} // while (1)
    } // int main (void)
    
    ISR (TIMER1_OVF_vect) { // 0.01ms clk
    
    	TCNT1 = TIMER1_PRELOAD;    // preload timer cnt register
    
    	timer1_cnt++;
    
    } // ISR (TIMER1_OVF_vect)

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beitrge
    672
    Zitat Zitat von Mithrandir Beitrag anzeigen
    Aber egal, was ich probiere, der berlauf kommt immer viel zu frh, was mache ich hier falsch?
    Die falsche Funktion zum Umwandeln des Variableninhalts in einen String zu benutzen, und dir so einen berlauf vorgaukeln zu lassen, der in Wirklichkeit gar nicht da ist.
    MfG
    Stefan

  3. #3
    Ok, danke fr die Antwort!
    Da mit char hab ich echt bersehen, das war ein Fehler.
    Aber nachdem ich es umgendert hatte, bestand das Poblem immer noch. Hier hab ich dann gelesen, dass man statt itoa auch sprintf nehmen knnte, das hat mein Problem dann letztendlich gelst, nun geht es.

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beitrge
    1.140
    Genau das war es doch, was sternst meinte ^^ - eben das itoa hier ungeeignet ist.
    itoa() erwartet als ersten Parameter ein int (16 Bit / -32768 - +32767). Bei greren Zahlen bekommst Du daher einen berlauf.
    Auf die Lsung mit printf() bist Du ja schon selber gekommen
    Gru,
    askazo
    - Das Leben ist zu kurz, um in C zu programmieren -

hnliche Themen

  1. [ERLEDIGT] I2C-Kommunikation luft nicht ber lngere Zeit (Atmega644PA)
    Von addi241 im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 06.08.2014, 21:06
  2. LCD an PCF8574 ber I2C - 2*16 luft / 4*20 LCD nicht?
    Von stfan1409 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 15.04.2012, 16:06
  3. [ERLEDIGT] Attiny2313: Arbeitsspeicher luft ber?
    Von -schumi- im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 28.06.2011, 09:10
  4. Schrittmotor luft nicht - L297/L298 ber LTP
    Von TobiasBlome im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 4
    Letzter Beitrag: 14.02.2011, 17:17
  5. Temperaturmessung ber I2C und LM75 luft nicht
    Von michaelkoemm im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 16.10.2007, 19:50

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhnge hochladen: Nein
  • Beitrge bearbeiten: Nein
  •