Re: Timer-Ausgang überschreiben bzw. lange low-Zeit vermeiden Kategorie: CC-Pro Unit & Appl.Board (von PeterS - 26.12.2015 8:59) | |
Als Antwort auf Re: Timer-Ausgang überschreiben bzw. lange low-Zeit vermeiden von Niko - 25.12.2015 17:35
| |
> > > > Ich versuche, diese Tesla-Spule > > > > mit der C-Control über den externen Eingang anzusteuern. Liegt am Eingang eine positive Spannung an ist die > > Spule deaktiviert. > > > > Liegt der Eingang auf Masse, dann schwingt die Spule. > > > > Das Problem dabei ist, dass die Spule nicht für den kontinuierlichen Betrieb ausgelegt ist. > > > > Das hei�t, man darf den Eingang nur kurz auf Masse ziehen (wenige Millisekunden) > > > > und muss die Spule dann wieder einige Millisekunden ausschalten, damit die Elektronik nicht überlastet wird. > > > > > > > > Ich verwende ein Poti am ADC 0 und PWM an Timer 1. In einer Endlosschleife wird Timer_T1PWM aufgerufen. > > > > Vereinfacht sieht das so aus: > > > > > > > > ADC_Set(ADC_VREF_VCC, 0) > > > > Do While True > > > > Timer_T1PWM(0x610, EinPaarBerechnungen(ADC_Read()), PS_64) 'Für PW0 z.B. 0x54E > > > > Thread_Delay(6) > > > > End While > > > > > > > > Tatsächlich wird da noch geprüft, ob ein Taster gedrückt ist und Timer_T1PWM wird auch nur dann aufgerufen, > > > > wenn sich der gemessene Wert verändert hat, > > > > aber um das Problem zu zeigen ist es sinnvoll, wenn Timer_T1PWM ständig aufgerufen wird. > > > > > > > > Das Problem ist jetzt folgendes: Immer dann, wenn Timer_T1PWM aufgerufen wird, wird der Timer ganz kurz pausiert. > > > > Der Pin verweilt dann für kurze Zeit in einem Zustand, und das kann auch logisch 0 sein. > > > > Ich habe das am Oszilloskop gemessen und ein Foto davon angehängt. > > > > > > > > Es darf nicht passieren, dass der Pin für längere Zeit auf logisch 0 bleibt. Ich suche eine Möglichkeit, > > > > den Ausgang auf logisch 1 zu fixieren, während der Timer noch läuft. > > > > Einfach vorher Port_WriteBit(PinB5, 1) und nachher Port_WriteBit(PinB5, 0) aufzurufen scheint > keine Veränderung zu bewirken. > > > > > > > > > Hallo, > > > > > > du solltest den Timer nicht immer neu mit Timer_T1PWM() einstellen! > > > Die Routine läuft nach der Konfiguartion selber (IRQ). > > > �ndere diese nur wenn es sein muss... und übergib die Parameter bei einen Aufruf mit einer > > > eigenen Variablen und baue nicht eine Funktion in den Aufruf mit ein... > > > Wenn du keine Threads benutzt verwende absDelay! > > > > > > > > > Timer_T1PWM(0x610, meinewerte, PS_64) > > > > > > > > > > Bin mir jetzt nicht sicher, wie Du das meinst. Ich hab ja geschrieben, dass die Timer_T1PWM nur zum Demonstrieren > > permanent aufgerufen wird. > > In meiner Anwendung wird aber geprüft, ob sich der Wert tatsächlich verändert hat. Also wenn man nichts ändert, > > wird Timer_T1PWM auch nicht > > erneut mit den selben Werten aufgerufen. > > > > Welchen Unterschied macht es, sowas zu schreiben: > > > > Dim Temp As Word > > ADC_Set(ADC_VREF_VCC, 0) > > Do While True > > Temp = EinPaarBerechnungen(ADC_Read()) > > Timer_T1PWM(0x610, Temp, PS_64) 'Für PW0 z.B. 0x54E > > Thread_Delay(6) > > End While > > > > Ich sehe da keinen nennenswerten Unterschied, au�er halt, dass Platz für eine Variable benötigt wird. > > > > Es kann sein, dass ich später noch Threads verwenden möchte. Da möchte ich nicht alle > > AbsDelay-Aufrufe durch Thread_Delay austauschen müssen. > > *Push* Hi Nico, probier mal Timer_T1PWA() um die Pulsweite zu setzen. Timer_T1PWM() initialisiert den Timer immer neu. Gruss Peter | |
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum