Sodele. Schnell noch ein bisschenwas drum herum gebastelt und

Code:
// Spannungswächter Lithium-Biene
// ****** by Rabenauge ****** 
// Misst die aktuelle Bordspannung und gibt sie auf Zehntel Volt genau auf Display aus
// Diese Messung wird alle zwei Sekunden wiederholt,
// ausserdem wird nach rund einer Minute die Displaybeleuchtung ausgeschaltet, kann aber 
// mit dem linken Fühler nach hinten jederzeit wieder für eine Minute eingeschalten werden
// Als Demo blinken die beiden gelben LED`s abwechselnd im Sekundentakt, nur, damit _irgend-
// was_ getan wird.
// Unterschreitet die Akkuspannung einen bestimmten Wert (konkret 6.5V), wird die Display-
// beleuchtung eingeschalten, ein Achtungssignal ausgegeben und die beiden roten LED 
// eingeschalten.
// Alles läuft Timergesteuert, über Timer 0, die delay()-Funktion wird nicht benötigt
// HINWEIS: das Programm ist ausgelegt auf NiboBee mit 2s LiPo als Stromversorgung, die 
// per Spannungsstabilisierung auf 5V gebracht wird, es wird aber die tatsächliche Akku-
// Spannung gemessen. Da die bei Standard-NiboBee`s gleich der Bordspannung ist, wird die
// Messung dann _so_ nichts bringen, da die 5V als Referenz benutzt werden!


#include <nibobee/iodefs.h>
#include <nibobee/i2cmaster.h>
#include <nibobee/lcdi2c.h>
#include <nibobee/led.h>
#include <nibobee/analog.h>
#include <nibobee/sens.h>
#include <stdio.h>

//------------------------------------------- Variablen & Co ----------------------------

 uint16_t volt=0;
 uint16_t volt_zehntel=0;
 uint16_t volt_mess=0;
 int16_t count_backLight=0;
 int8_t count=0;
//----------------------------------------- Spannungsüberwachung ------------------------

int Batterie(void)
   	{
   	volt_mess=analog_getValue(4);							// Analogeingang 4 abfragen		
	volt= 10*volt_mess/1023;								// Ganzevolt=2*5V*737/1023 
	volt_zehntel= 10*volt_mess/102-10*volt;					// Zehntelvolt=2*5V*737/102-10*Ganzevolt
    	lcd_setCursor(3,1);									// Messwert ausgeben
    	printf(" %1d",volt);
		printf(".");
		printf("%1d",volt_zehntel);
		printf(" Volt"); 
		if (volt==6&&volt_zehntel<5)						// Falls Spannung zu niedrig wird (unter 6.5V)
			{
			 lcd_setBacklight(0);							// Licht an
			 lcd_setCursor(7,2);							// Alarm schlagen
			 printf(" ACHTUNG");
			 led_set(LED_L_RD,1);
			 led_set(LED_R_RD,1);
			 count_backLight=0;
			 }
			
		                    
	return 0;
	}
//------------------------------------ Beleuchtung aus/Stromsparmode --------------------
 
int Beleuchtung(void)										//Unterprogramm Displaybeleuchtung
	{														//schaltet nach ca.1Minute die Display-
	if(count_backLight > 60*57)								//Beleuchtung ab
		{
		 lcd_setBacklight(1);
		}
	return 0;
	}	
//------------------------------------ Hauptprogramm ------------------------------------

int main(void)
{
 TCCR0 = (1<<CS02)| (1<<CS00);          					// Normal Mode, kein OC0-Pin, prescaler /1024 
 TIMSK |= (1<<TOIE0);                     					// Timer0 Overflow-Interrupt erlauben 
   i2c_init();												// I2C initialisieren
   lcd_init(0x27);											// LCD initialisieren, Adresse festlegen
   analog_init();											// Analogeingänge initialisieren
   led_init();												// LED`s initialisieren
   set_output_group(IO_SENS);       						// Pull-ups aktivieren
   enable_interrupts();										// Interrupts einschalten
   lcd_setBacklight(0);									 	// Licht an
   lcd_setCursor(1,0);
 	printf(" Bordspannung");								// Programmname
   lcd_setCursor(0,2);
	printf("<<Licht"); 
	
   	while(1) 
	{
     enable_interrupts();
     int8_t status_L = sens_getLeft();
		if(status_L < 0)									//mit linkem Fühler nach hinten
			{												//Licht wieder anmachen
			 lcd_setBacklight(0);
			 count_backLight=0;
			} 	
		if(count == 57) 									// nach 1 Sekunde
   			{ 
    		 led_set(LED_R_YE,1);                			// LED an 
    		 led_set(LED_L_YE,0); 							// andere aus
			Batterie();										// Akkuspannung messen
   			} 
   			if(count > 2*57) 								// nach 2 Sekunden
   				{ 
     		 	 led_set(LED_R_YE,0);                		// LED aus 
     		 	 led_set(LED_L_YE,1); 						// andere an
	 			 Beleuchtung();								// Licht aus?
	 		 	 count=0; 									// Sekundentimer zurücksetzen
   				} 
			}            
  return 0;                             
}
//--------------------------------- Timer-ISR -------------------------------------------

ISR(TIMER0_OVF_vect) 										
{     
  count++; 													// fürs blinken
  count_backLight++;										// für HG-Licht ausschalten
 }
//----------------------------------- ENDE ----------------------------------------------
Das Programm spielt mit den Leuchtdioden, und gibt alle zwei Sekunden die aktuelle Akkuspannung aus.
Ausserdem wird ein "Alarm" ausgelöst, wenn die Akkuspannung unter 6.5V fällt.
Zusätzlich habe ich (jaha, ich _hatte_ grad Langeweile) noch eine kleine Routine eingebaut, die nach einer Minute die Hintergrundbeleuchtung des Displays ausschaltet (man kann sie jederzeit wieder einschalten), und _das_ gibt eine verwirrende Erkenntnis:
Wenn z.B. die Akkuspannung bei 7.6V ist, und das Display AUS, dann habe ich, wenn ich das Display wieder einschalte, mindestens 1/10V _mehr_ auf der Anzeige.
Merkwürdig, bedeutet das, das Display braucht bei eingeschaltener Hintergrund-Beleuchtung WENIGER Strom als ohne sie?
Sowas ähnliches las ich heute doch schon mal an anderer Stelle?

Übrigens wäre es schön, wenn die Profis (bin ich ja weit, weit weg von noch...) sich den Code mal anschauen, und eventuelle Kritikpunkte anmerken, nur so lernt man schliesslich was.