Gast
#211276
Hallo!
Im nachfolgenden Stück Code muß irgendwas faul sein.
Er soll einen Spannungswert ADwandeln, dann soll der Wert im Timer
verglichen werden.
Der Timer ist so eingestellt, daß er fast genau eine Sekunde braucht,
um maximal 255bit zu zählen.
Proz: Attiny26, Takt extern 4Mhz
uint16_t SpannungWandeln(uint8_t a) // Funktion zum
AD-Wandeln der
Verzögerungsspannung
{
int i; // Initialisieren
uint16_t result = 0; // evtl. Inhalte löschen
ADCSR = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
// Frequenzvorteiler
// setzen auf 64 und ADC aktivieren
ADMUX = a; // Kanal waehlen
(MUX0,
also PA0, ist ausgewählt)
ADMUX |= (1<<REFS0) | (0<<REFS1); // AREF festlegen
(PA3)
/* Eigentliche Messung - Mittelwert aus 5 aufeinanderfolgenden
Wandlungen */
for(i=0;i<5;i++)
{
ADCSR |= (1<<ADSC); // eine Wandlung "single
conversion"
while(!(ADCSR & (1<<ADIF))); // auf Abschluss der
Konvertierung warten (ADIF-bit)
result += ADC; // Wandlungsergebnisse aufaddieren
ADCSR |= (1<<ADIF); // ADIF löschen
}
ADCSR &= ~(1<<ADEN); // ADC deaktivieren
result /= 5; // Summe durch 5 teilen =
arithm. Mittelwert
OCR1C = result; // Ergebnis in das Vergleichsregister von
Timer
1 schreiben
result= 0;
// Ergebnis-Register zurücksetzen
ADCSR = 0x00; // Kontroll- und Statusregister des ADC
zurücksetzen
ADMUX = 0x00; // Multiplexer zurücksetzen
return a;
}
//------------------------------------------------------------------
void VergleichswertPruefen(void) // Funktion zur Erzeugung
der
Verzögerungszeit
{
int i; // Laufvariable definieren
for (i=1;i<=30;i++) // Schleife festlegen für max.
Verzögerung
von 30S
{
do // führe aus:
{
TCCR1A = 0x00; // Initialisieren
TCCR1B = 0x8F; // Timer starten mit Vorteiler von 16384,
ohne
OC1-Aktionen
}while (!(TIFR & (1<<OCF1A))); // solange, wie kein
Compare-Match
eintritt
if(TIFR == 0x40) // Bedingung stellen: wenn
Compare-Match,
dann...
{
TCCR1B = 0x00; // Timer stoppen und rücksetzen
TIFR = (1<<OCF1A); // Compare-match-Bit zwangsweise
löschen
}
}
}
Gruß,
Andreas
P.S. µC bleibt nicht hängen oder so, er verzögert nur nicht! Egal
welche Spannung ich an PA0 anlege (max.5V, über Poti), keine Reaktion.