Hallo Georg-Johann

Danke Ich dachte der Term wird als ganzes gesehen.

Es funktioniert nun eigentlich schon fast. Jedoch hab ich noch ein Problem. Das Auslesen oder das Abspeichern der 16Bit Werte funktioniert noch nicht ganz Richtig. Nach einem Reset ist das Flag für das Abspeichern auf 1 gesetzt. Es soll ein Abspeichern erfolgen wenn der ADC Wert unter 614 ist. Jedoch funktioniert das nicht

Code:
/*=================================================================
Programmtitel: Unterspannungsaanzeige
Autor: Robert Schilling
Datum: 2.3.2006
Hardware: LCD an PORTB
		Led an PortD0
		Poti an PC0, PC1
		Schalter an PD7
		
Programmbeschreibung:
Die beiden Potis simulieren 2 Lipo Zellen.
Sobald der Spannungswert unter 3V Wird ein Zähler um 
1 erhöht und der Wert in den EEprom geschrieben.
Es wenn der Wert wieder über 3V steigt wird die 
nächste Unterspannung "gewertet" und in den EEprom geschrieben.
Die Messungen sind Timergesteuert (8bit Timer0). Sie 
lösen einen Overflow Interrupt aus. Sobald 600 Interrupts (~5sek)
werden die Zellen gemessen.

====================================================================*/
#include <avr/io.h>
#include <stdlib.h>
#include <avr/eeprom.h>
#include <avr/signal.h>   
#include <avr/interrupt.h>   
#include "avrlibdefs.h"
#include "avrlibtypes.h"

#include "a2d.h"
#include "lcd.h"

volatile uint16_t zelle[2];	//Varibale die von der Interruptroutine 
volatile uint16_t counter =0; //und auch von anderen Funktionen gelesen werden können

int lcd_maske(void);		//LCD Maske
int lcd_put_f(uint16_t adc);	//Funktion zum Anzeigen des Spannungswertes
int timer_init (void);		//Initialisieren des Timers

int timer_init(void) //Initialisieren des Timers
{
   TCCR0 = (1<<CS02);	//Freq = F_CPU/256
   TCNT0 = 0;			//Counter = 0
   TIMSK = (1<<TOIE0);   //Enable Overflow Interrupts
   return(0);
}

int lcd_maske (void)	//Aufbau der LCD Maske
{
   lcd_init(LCD_DISP_ON);	//LCD initialisiern
   lcd_home();				//lcd home
   lcd_clrscr();			//Clear Screen
   lcd_puts("   Unterspannungsanzeige");
   lcd_gotoxy(0,1);
   lcd_puts("Zelle 1:");
   lcd_gotoxy(0,2);
   lcd_puts("Zelle 2:");
   return(0);
}


int lcd_put_f (uint16_t adc) //Zum anzeigen der Spannungen am Display
{							//ADC Wert wird in eine Spannung umgerechnet
   float ganzzahl,komma;
   uint8_t  int_ganzzahl, int_komma;
   
   cli();						//Disable Interrupts
   ganzzahl = (adc/1024.0) * 5;
   komma = (ganzzahl -  (int) ganzzahl)*100;
   sei();						//Enable Interrupts
   
   int_ganzzahl = (int)ganzzahl;
   int_komma = komma;
   
   lcd_put_d(int_ganzzahl);
   lcd_putc('.');
   lcd_put_d(int_komma);
   lcd_putc('V');
   return(0);
}

SIGNAL (SIG_OVERFLOW0) //Overflow Routine
{
   counter++;			// bei jedem Overflow counter++
   
   if(counter == 600) //Wenn counter = 600 (~5sek)
   {
      counter=0;
      cli();			//Disable Interrupts
      zelle[0] = a2dConvert10bit(0); //Messen der Werte
      zelle[1] = a2dConvert10bit(1);
	  sei();			//Enable Interrupts
      PORTD ^= (1<<0);	//Led umschalten

   }
}

int lesen (void)		//Lesefunktion zum Auslesen der Werte
{
   cli();			//Disable Interrupts
   lcd_clrscr();
   lcd_home();
   lcd_puts("Auslesen der Werte");
   lcd_gotoxy(0,1);
   lcd_puts("Niedrigster Wert    Anzahl\n");
   lcd_puts("Zelle 1:\n");
   lcd_puts("Zelle 2:");

   lcd_gotoxy(9,2);
   lcd_put_f(eeprom_read_word((uint16_t*) 2)); //Wert von Zelle 1 auslesen

   lcd_gotoxy(9,3);
   lcd_put_f(eeprom_read_word((uint16_t*) 4)); //Wert von Zelle 2 auslesen

   lcd_gotoxy(20,2);
   lcd_put_d(eeprom_read_byte((uint8_t*)0));	//Anzahl der Unterspannungen vo Zelle1

   lcd_gotoxy(20,3);
   lcd_put_d(eeprom_read_byte((uint8_t*)1));	//Anzahl der Unterspannungen von Zelle2

   loop_until_bit_is_set(PIND, PD7); //warten bis Schalter an PD7 wieder ausgeschalten ist.

   lcd_clrscr();
   lcd_home();
   lcd_maske();
   sei();			//Enable Interrupts
   return(0);
}

int main (void) //Mainfunktion
{
   uint8_t i, istpositiv[2], zaehler[2];
   
   istpositiv[0] = 1; //Flag ob positiv 
   istpositiv[1] = 1;
   zaehler[0] = eeprom_read_byte((uint8_t*) 0); //Zähler aus dem EEprom auslesen
   zaehler[1] = eeprom_read_byte((uint8_t*) 1); //Zähler aus dem EEprom auslesen
   
   if(zaehler[0] == 255) //Wenn Zähler =255 = 0xFF (nach dem Flashen)
		zaehler[0] = 0; //Zähler = 0;
	
    if(zaehler[1] == 255) 
		zaehler[1] = 0;
		
   DDRC &=~ ((1<<PC0) | (1<<PC1));	//PC0, PC1 Eingänge
   PORTC &=~ ((1<<PC0) | (1<<PC1));	//disabke pullups
   DDRD &=~ (1<<7);					//PD7 Eingang (schalter)
   PORTD &=~ (1<<7);					//Disable pullups		
   DDRD |= (1<<0);		//PD0 Ausgang
   PORTD &=~ (1<<0);
   
   a2dInit();			//A2D initialisiern
   a2dSetPrescaler(ADC_PRESCALE_DIV32); //Prescaler = 32
   a2dSetReference(ADC_REFERENCE_AVCC); //Refernzspannung = Versorgungsspanung
   lcd_maske();
   timer_init(); //Timer initialisieren
   sei();
      
   while(1)
   {
	cli();
      if(bit_is_clear(PIND, PD7) == 1) //PD7 auf high geschalten ist
         lesen();			//Funktion lesen aufrufen (Auslesen der Werte)
    sei();
	
      for(i=0; i <2; i++) //Auswerten der Messungen
      {
        if(zelle[i] > 614) //wenn Zelle > 3V
		 {
         istpositiv[i] = 1; //Flag setzen 
		 }
	
         if(istpositiv[i] == 1) //Wenn Flag gesetzt
         {
            if(zelle[i] < 614) //Wenn zelle i < 3V
            {
               zaehler[i]++;	//Zähler um eins erhöhen
               cli();			//Disable Interrups
               eeprom_write_byte((uint8_t*)i, zaehler[i]);	//wert des Zählers in den EEprim schreiben
               eeprom_write_word((uint16_t*)((i*2)+2), zelle[i]);	//Wert der Spannung in EEProm schreiben
               sei();			//Enable Interrupts
               istpositiv[i] =0;	//Flag löschen
            }
         }
      }      
         
      lcd_gotoxy(9,1);
      lcd_put_f(a2dConvert10bit(0)); //Spannungswert anzeigen
      lcd_gotoxy(9,2);
      lcd_put_f(a2dConvert10bit(1));	//Spannungswert anzeigen
   }
   return(0);
}

Beim Auslesen wird immer 0.0V dargestellt. Bis ich den Wert ändere. Warum?

Danke im Voraus

Gruß Robert[/code]