PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : timer0 problem



Julian
24.07.2006, 16:38
Hallo wiedermal ..

ich will mit mit meinem Mega8 eine frequenz messen .. da das duty cycle nicht konstant ist kann ich mich nur auf die periodendauer konzentrieren .. (is ein rechteck signal) .. das signal kann werte zw ~10ms und ~100 ms annehmen ..

so habe ich den timer init. :

Config Timer0 = Timer , Prescale = 256 (auch schon mit 1024 probiert)

so starte/stoppe ich den timer:

While Sensora = 1 : Wend
While Sensora = 0 : Wend 'steigende Flanke abwarten
Start Timer0
While Sensora = 1 : Wend
While Sensora = 0 : Wend 'steigende Flanke abwarten
Stop Timer0

bei einem timerüberlauf erhöhe ich eine variable n um 1 und setz den timer zurück .. wenn der timer gestoppt ist multipliziere ich die variable n mit 255 und addiere sie zum timerwert zurück .. dann noch mit der zeitkonstate multiplizieren und fertig .. allerdings nur in 8-9 von 10 fällen

machmal kommt es vor das ich am ende so ein ergebniss habe:

timer0 = 0 .. is im fehlerfall IMMER 0
ov = crap .. immer kleiner als der soll wert, aber nciht konstant falsch
ich habe das signal mit dem oszi angesehen, aber keine hacker oder spitzen gesehen .. auch entstörkondensatoren bringen nix ..

leider mus das aber IMMER funktionieren .. und möglichst genau sein weil das ergebniss wiederum den input in den noch nicht ausprogramierten pid regler darstellt (wird eine drehzahlregelung)

ach ja .. vieleicht is das wichtig .. wenn ich 1024 als prescaler nem, dann kann ich die schnellsten perioden direkt (ohne interrupts) messen .. und das geht IMMER fehlerfrei .. soblad ich aber mit den interrupts anfange gehts los ..

puh .. so weit mein problem .. :-k .. hat wer rat ??

ps.: ich lass mir auch gern ein anderes verfahren zur messung an sich einreden, halbwegsexakt muss es halt sein ;-)

PicNick
24.07.2006, 17:59
Schau dir bei Bascom mal "PULSEIN" an, der zugehörige Code ist da
https://www.roboternetz.de/wissen/index.php/Bascom_Inside-Code#PULSEIN
zum Anschauen.

Vielleicht kommst du damit auch zurecht

Julian
24.07.2006, 18:10
hallo !!

danke für den tip .. ich hab mir das auch schon angeshen .. allerdings habe ich gerade jetzt das problem gefunden ..

ich hatte die option nosave bei initialisierung des interrupts verwendet und somit je nach situation ein paar register über den aufen geballert was dann zu dem fehler geführt hat (ich dachte erst das das nosave "wertvolle" zeit unnütz verbratet, aber irgendwie is die geschwindigkeit des prozessors bei 16Mhz derart wahnwitzig das das sowas von egal is .. w00t \:D/ )!!


danke trozdem für die mühe !

edit .. jetzt seh ichs erst .. a wiena !! *lol* vieleicht sind wir ja auch noch nachbarn ! *ggg* woher kommst gnau . .wie bist zur robotik gekommen .. usw usw .. wissbegierig bin !!