Dieses Programm war das, was ich eigentlich machen wollte


Code:
//----------------------------------------------------------------------
// Titel     : Spannung messen AVR-C
//----------------------------------------------------------------------
// Funktion  : Misst Spannung
// Schaltung : erstmals Minimalbeschaltung
//----------------------------------------------------------------------
// Prozessor : Attiny13
// Takt		 : 3.6864 MHz
// Sprache   : C
// Datum     : 03.08.2010
// Version   : 1
// Autor     : 
//----------------------------------------------------------------------
#define 	F_CPU 3686400	// Taktfrequenz des myAVR-Boards
#include	<avr\io.h>		// AVR Register und Konstantendefinitionen
#include    <inttypes.h> 
//----------------------------------------------------------------------

uint16_t readADC(uint8_t channel) 
{
	// Funktion 1 zum Auslesen der Spannung

	uint8_t i;                   // Variablen definieren (Zählervariable i + Resultat)
	uint16_t result = 0;

	ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); //ADEN = ADC Enable 
	// wenn adps1+2 on sind und adps0 off, dann ist der Teilungsfaktor 64 (Tabelle Datasheet)

	ADMUX = channel; //Kanal wählen; REFs0+1 -> interne Referenz 2,56V verwenden, REFS1 gibt es bei Attiny13 nicht
	//externen Kondensator mit 100nF (Aufdruck 104) an AREF auf Masse

	//Dummy-Readout (unten), misst 1* Ergebnis, wird nicht gespeichert
	ADCSRA = ADCSRA | (1<<ADSC); // Schaltet bei ADCSRA das ADSC-Bit ein, d.h. Messung starten
	while(ADCSRA & (1<<ADSC)); //Warte bis Messvorgang vorbei ist

	// Nun 3* Spannung auslesen, Durchschnittswert ausrechnen
	for (i=0; i<3; i++) 
	{
		// Schleife, startet 3*
		ADCSRA = ADCSRA |(1<<ADSC); // Einmal messen
		while(ADCSRA & (1<<ADSC));  //Warte bis Messung vorbei

		result = result + ADCW; // Resultate zusammenzählen (R1+R2+R3) -> später alles /3
	}

	ADCSRA = ADCSRA & (~(1<<ADEN)); //ADC wieder deaktivieren

	result=result/3;    // Durchschnittswert

	return result;
}

main ()						// Hauptprogramm, startet bei Power ON und Reset
{
	int spannung; //Definiere Ganzzahl-Variable Spannung
	int einer,zehner, hunderter, startwert, mittelwert, endwert;
	int i=0;
	int j =0;
	int k =0;

	while (true)
	{

		uint16_t result = readADC(0); // ruft die ADC Funktion auf an Pin0 =ADC0

		spannung = result*3086;
		spannung = spannung/1000; 

		startwert=spannung/10;
		hunderter=startwert/100;
		mittelwert=startwert-100*hunderter;
		zehner=mittelwert/10;
		endwert=mittelwert-10*zehner;
		einer=endwert;

		for (i=0;i<(einer);i++)
		{
			DDRB=0b00001111;
			PORTB=PORTB|(1<<PB0);
			waitMs(50);
			PORTB=PORTB&(~(1<<PB0));
			waitMs(50);
		}

		for (j=0;j<(zehner);j++)
		{
			DDRB=0b00001111;
			PORTB=PORTB|(1<<PB1);
			waitMs(50);
			PORTB=PORTB&(~(1<<PB1));
			waitMs(50);
		}

		for (k=0;k<(hunderter);k++)
		{
			DDRB=0b00001111;
			PORTB=PORTB|(1<<PB2);
			waitMs(50);
			PORTB=PORTB&(~(1<<PB2));
			waitMs(50);
		}

		waitMs(1100);

	}

	return 0;
}
//----------------------------------------------------------------------
Als das nicht ging (besser gesagt nichts passierte), schrieb ich zahlreiche Testprogrammen, wie z.b. dass er nur die Hunderterstelle ausgeben sollte, sonst das gleiche wwie oben. Als das auch nicht ging, sollte er hunderter und Zehner schreiben (Wie gesagt, ich rechne in mV, das durch 10-> 125 (1-2-5) dh. 1,25V)

Code:
if (spannung==0)  // Problem: spannung = laut adc immer 0
		{
			PORTB=PORTB|(1<<PB1)|(1<<PB2);
			waitMs(330);
			PORTB=PORTB&(~(1<<PB1));
			waitMs(80);
			PORTB=PORTB|(1<<PB2);
			waitMs(80);
			PORTB=PORTB&(~(1<<PB2));
			waitMs(80);
		}
Das dazugefügt führt immer dazu, dass das Passiert, also muss ADC immer gleich null sein...


Auch das hier
Code:
//----------------------------------------------------------------------
// Titel     : Spannung messen AVR-C
//----------------------------------------------------------------------
// Funktion  : Misst Spannung
// Schaltung : erstmals Minimalbeschaltung
//----------------------------------------------------------------------
// Prozessor : Attiny13
// Takt		 : 3.6864 MHz
// Sprache   : C
// Datum     : 03.08.2010
// Version   : 1
// Autor     : 
//----------------------------------------------------------------------
#define 	F_CPU 3686400	// Taktfrequenz des myAVR-Boards
#include	<avr\io.h>		// AVR Register und Konstantendefinitionen
#include    <inttypes.h> 
//----------------------------------------------------------------------

uint16_t readADC(uint8_t channel) 
{
	// Funktion 1 zum Auslesen der Spannung

	uint8_t i;                   // Variablen definieren (Zählervariable i + Resultat)
	uint16_t result = 0;

	ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); //ADEN = ADC Enable 
	// wenn adps1+2 on sind und adps0 off, dann ist der Teilungsfaktor 64 (Tabelle Datasheet)

	ADMUX = channel; //Kanal wählen; REFs0+1 -> interne Referenz 2,56V verwenden, REFS1 gibt es bei Attiny13 nicht
	//externen Kondensator mit 100nF (Aufdruck 104) an AREF auf Masse

	//Dummy-Readout (unten), misst 1* Ergebnis, wird nicht gespeichert
	ADCSRA = ADCSRA | (1<<ADSC); // Schaltet bei ADCSRA das ADSC-Bit ein, d.h. Messung starten
	while(ADCSRA & (1<<ADSC)); //Warte bis Messvorgang vorbei ist

	// Nun 3* Spannung auslesen, Durchschnittswert ausrechnen
	for (i=0; i<3; i++) 
	{
		// Schleife, startet 3*
		ADCSRA = ADCSRA |(1<<ADSC); // Einmal messen
		while(ADCSRA & (1<<ADSC));  //Warte bis Messung vorbei

		result = result + ADCW; // Resultate zusammenzählen (R1+R2+R3) -> später alles /3
	}

	ADCSRA = ADCSRA & (~(1<<ADEN)); //ADC wieder deaktivieren

	result=result/3;    // Durchschnittswert

	return result;
}

main ()						// Hauptprogramm, startet bei Power ON und Reset
{
	int spannung; //Definiere Ganzzahl-Variable Spannung
	int einer,zehner, hunderter, startwert, mittelwert, endwert=0;
	int i=0;

	DDRB=0b00001111;

	while (true)
	{

		uint16_t result = readADC(0); // ruft die ADC Funktion auf an Pin0 =ADC0

		spannung = result*3086;
		spannung = spannung/100000; // zB. 15 = 1500mV

		PORTB=PORTB|(1<<PB1); //kurzer LED - Test
		waitMs(10);
		PORTB=PORTB&(~(1<<PB1));
		waitMs(100);

		if (spannung==0)  // Problem: spannung = laut adc immer 0
		{
			PORTB=PORTB|(1<<PB1)|(1<<PB2);
			waitMs(330);
			PORTB=PORTB&(~(1<<PB1));
			waitMs(80);
			PORTB=PORTB|(1<<PB2);
			waitMs(80);
			PORTB=PORTB&(~(1<<PB2));
			waitMs(80);
		}

		if ((spannung>0)&(spannung<=15)) 
		{
			PORTB=PORTB|(1<<PB1);
			waitMs(100);
			PORTB=PORTB&(~(1<<PB1));
			waitMs(100);

		}

		if ((spannung>15)&(spannung<40)) 
		{
			PORTB=PORTB|(1<<PB2);
			waitMs(100);
			PORTB=PORTB&(~(1<<PB2));
			waitMs(100);

		}

		if (spannung>40) 
		{
			PORTB=PORTB|(1<<PB1);
			waitMs(100);
			PORTB=PORTB&(~(1<<PB1));
			waitMs(100);
			PORTB=PORTB|(1<<PB2);
			waitMs(100);
			PORTB=PORTB&(~(1<<PB2));
			waitMs(100);

		}

		waitMs(1100);

	}

	return 0;
}

//----------------------------------------------------------------------
zeigt immer 0 an.