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.
Hallo Andreas, wenn Dein Quellcode auch bei anderen so unglücklich umbricht, wäre es vieleicht besser, den Code sauber formatiert (wie er wohl auch war) als Anhang (.txt) mit zu senden. Dann kann er viel besser gelesen werden, und alle haben lust, Dir zu helfen. Grüße Quark
@Patrick: Habe ich geändert. Ohne große Wirkung! Die Routinen scheint der Proz ja zu durchlaufen, ansonsten käme ich ja nicht bis zum Hauptprogramm, daß ohne Mucken läuft! Drehe ich an dem Poti, ändert sich nichts an der Zeitverzögerung. Nach ca. 1s bin ich im Hauptprogramm! Ich schaue mir nochmal das Unterprogramm "Vergleichswert.." an. Auch ändere ich mal die Schleifendurchläufe. Gruß, Andreas
so... "Schleifendurchlauf-Anzahl" mal richtig hochgesetzt (3000). Ändert nichts! Ich glube, der Timer funzt nicht! Jetzt prüfe ich mal die Grundeinstellungen hierzu!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.