Hey, ich habe das Programm soweit vereinfacht wie nur irgendwie möglich.
Alles Unnötige rausgestrichen, wie die Anzeige der Daten.
Zuerst hatte ich die ganze main-Funktion rausgeschmissen, mit dieser fängt er aber an, drum gabs gleich einen Error.
Jetzt misst er nur mehr die Spannung mittels der Mainfunktion.
Und: Es klappte endlich zum draufbrennen!!!!!!!!!!
Der Code sieht vorerst so aus:
Code:
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
{
float spannung; //Definiere Variable
DDRB=0b00001111;
while (true)
{
uint16_t result = readADC(0); // ruft die ADC Funktion auf an Pin0 =ADC0
}
return 0;
}
Nun hätte ich gerne, dass er die Spannung konvertiert und anzeigt. Das sollte doch mittels Bit-Verschiebung gehen, oder?
Ich meine zB. 1,65 Grad: für die 1 Volt blinkt Led1 1 mal, für die sechs Volt Led2 6mal, etc.
Edit: Wenn ich ''spannung=0.003086*(float) (result);'' dazugebe, streikt das Programm wieder...
Lesezeichen