@Joe jetzt übertreibst Du aber ;-)
Gruß Sebastian
Druckbare Version
@Joe jetzt übertreibst Du aber ;-)
Gruß Sebastian
Danke, sehr lieb - aber meine letzte, dreitägige Fehlersuche am mega168 hatte den Grund:
und so etwas ist ja nun wirklich total doof.Zitat:
... TIMSK1 |= (1<<TOIE1); // heisst eben nicht: Tmr/Cntr1 Overflow interrupt disabled. Jetzt steht dort TIMSK1 &= ~(1<<TOIE1); und "alles" läuft prächtig ...
Sorry, ich gerate immer wieder OT ;-)
Guten morgen!
vielen Dank für eure Hilfe! Ich hab jetzt mal noch etwas rum gerechnet. Und zwar will ich die LED für eine Sekunde aufleuchten lassen. Ich hab einen Versorgungstakt von 12MHz. Wenn ich den Prescaler auf 1024 stelle bedeutet das einen Takt von 11,71875kHz für den Timer.
Das würde heißen dass die ISR in einer Sekunde 45,77mal durchlaufen wird. Also muss ich ja schreiben:
Sehe ich das richtig oder habe ich eine Denk/Rechenfehler?Code:while(t<46)
{
.
.//LED an
.
}
Grüße!!
Bean
Sieht gut aus, sofern Du mit der Genauigkeit auskommst.
Gruß
Vielleicht ist Dir das
Bild hier
eine Hilfe. Du kannst Dir also eine ISR machen, die ungefähr 50 Hz läuft - das ist annähernd das Langsamste, was mit Deiner Konfiguration geht.
In dieser Routine zählst Du eine Zahl runter. Wenn Du Null erreichst, dann setzt Du diese Zahl wieder auf den Anfangswert und toggelst einen Port - oder machst sonst was.
Aufpassen: Bei 12 MHz und beim Prescaler 1024 kannst Du keine (na ja, gaaanz wenige) ganzzahligen Werte fahren. Es sind eben auch nur UNGEFÄHR 50 Hz, siehe Tabelle.
Ok?
Guten Morgen!!
Vielen Dank für euer Hilfe!! Bin viel weiter gekommen. Habe gestern Abend noch etwas mit den Zeiten herum experimentiert. Das passt ja schon recht gut. Soll heißen dass die Genauigkeit für das was ich es brauche vollkommen ausreicht... :-)
Jetzt hab ich nur noch ein Problem mit der while Schleife. Und zwar will ich nun in dieser Schleife einen Analogwert einlesen und in Abhängigkeit von diesem einen Port schalten... Das will aber noch nicht so richtig... :-( Ich hab jetzt mal so angefangen:
So scheint es aber nicht zu funktionieren. Ich hab leider gerade nicht den kompletten Code zur Hand. Hab auch schon probiert mit itoa den "resultwert" vor der if Schleife umzurechnen... Aber hat nicht das gewollte Ergebniss gebracht... :-( Habt ihr eine Idee?Code:while(t<2746)
{
AD_einlesen();
if(result<350)
{
PORTB |= (1<<PB0);
}
}
Grüße!!
Bean
Brrrrr - ist diese Schleife in der ISR? Das hiesse dann mit dem Formel1 nach dem Start bei Vollgas voll auf die Bremse :( .... (ok, schlechter Vergleich, viele fahren so gokartmässig).
Vielleicht warten wir mal den kompletten/erweiterten Code ab
Nein Nein, in der ISR wird nach wie vor nur t hochgezählt (t=t+1; ). Mehr steht da nicht drin. Der Rest steht alles in main...
Grüße!!
Bean
Ok, gut so. Nun will ich nicht päpstlicher sein als ... Ausserdem bin ich eher ein C-Anfänger. Aber die C-Freaks sehen es ja pfiffig, dass man dann schreibt:Zitat:
Zitat von Mr Bean
Ich mach das mittlerweile auch - es spart sogar Schreibarbeit :) :)Code:t++;
ja die Schreibweise kenne ich... :-) Danke... :-) bin halt eher altmodisch... :-)