Re: Probleme mit Timer_T0Time bei Mega32 Kategorie: Programmierung Basic (von HW - 19.03.2008 17:01) | ||
Als Antwort auf Re: Probleme mit Timer_T0Time bei Mega32 von Sebastian - 19.03.2008 16:58 | ||
| ||
> Hi, > > Warum macht du das nicht mit AbsDelay()? > > Sebastian Ich nehme an, weil er die Hilfe gelesen hat: Die Funktion arbeitet zwar sehr genau, aber unterbricht nicht nur die Abarbeitung des aktuellen Threads, sondern lä�t den Bytecode Interpreter insgesamt warten. Interrupts werden zwar registriert, aber die Interruptroutinen in dieser Zeit nicht abgearbeitet, da auch dafür der Bytecode Interpreter nötig ist. Gru� Hanns > > > Danke für die schnelle Antwort > > Im Interrupt soll nur ein Zähler laufen. > > Mein Ziel war alle 1ms ein ADC-Wert in eine Variable zu speichern. > > Welche Möglichkeit gibt es sonst um 1ms-Pausen zu zu relisieren. > > Den ' Timer_T0Time ' kann man bei der Mega32 anscheinend nicht gebrauchen, da die 8bit-Parameter > > keinen Einflu� auf die Zählerstände nach eine Sekunde haben. > > Wozu gibt es den Befehl, wenn er anscheinend nicht funktioniert. > > > > Gru� Andreas > > > > > > > > Hallo, > > > > kann mir einer helfen. Ich wollte über die ' Timer_T0Time ' Funktion ein 1Millisekunden-Interrupt erstellen. > > > > Wie man im unten stehenden Programm sieht liefern die Mega32 und Mega128 unterschiedliche Ergebnisse. > > > Also ich kann bestätigen, das der Mega32 Bytecode-Interpreter langsamer ist als der Mega128 > > > Bytecode-Interpreter. Dies liegt daran, das sowenig Platz auf dem Mega32 ist, dort wurde der > > > Interpreter auf Platz optimiert, beim Mega128 auf Geschwindigkeit. > > > > > > Beide Module sind aber eigentlich zu langsam, um jede Milisekunde umfangreiche Befehle auszuführen. > > > Ich würde bei einem 1ms Interrupt die Interruptroutine auf ca. 10 Befehle begrenzen, damit noch > > > etwas Rechenleistung für das Hauptprogramm übrig bleibt. > > > > > > Gruss Peter > > > > > > > Da ich mit der Mega32 arbeite und die Mega128 nur testweise habe, bräuchte ich eine Lösung. > > > > > > > > Mache ich etwas verkehrt oder hat der Mega32-Interpreter einen Fehler. > > > > > > > > Besten Dank für die Hilfe > > > > > > > > Andreas > > > > > > > > Hier das Programm: > > > > > > > > > > > > 'Definition von globalen Variablen und Adressen > > > > Dim cnt1 As Byte ' Counter für Interrupt > > > > Dim cnt_10ms As Word ' Counter in 10ms Schritten > > > > Dim cnt_1ms As Word ' Counter in 1ms Schritten > > > > Dim Pause As Single'Word ' Pause in 10ms Schritten > > > > Dim Sekunde, Minute, Stunde As Byte ' für eventuelle Uhr / Betriebsstundenzähler? > > > > Dim i , y , z As Integer ' globale Variablendeklaration > > > > > > > > > > > > > > > > Sub main() > > > > ' Initialisierung > > > > ' !!!! ----- USB-Kommunikation abschalten ---- !!!!! > > > > SPI_Disable() > > > > 'Pullup-Widerstände von Port A Abschalten > > > > Port_DataDir(0,0) > > > > Port_Write(0,0) > > > > ' ------------------------------------------------- > > > > > > > > ' MEGA32 -->'ms --> Pause / cnt1 --> ms / Pause ' MEGA128 --> ms / Pause > > > > 'Timer_T0Time(14,PS0_1024) '500 --> 29 / 51 --> 1000 / 57 1000 / 1018 > > > > 'Timer_T0Time(57,PS0_256) '500 --> 112 / 51 --> 1000 / 222 1000 / 1000 > > > > 'Timer_T0Time(230,PS0_64) '500 --> 449 / 51 --> 1000 / 890 1000 / 990 > > > > Irq_SetVect(INT_TIM0COMP,INT_1ms) ' Interrupt Service Routine definieren > > > > Irq_SetVect(INT_TIM2COMP,INT_10ms) ' Interrupt Service Routine definieren > > > > > > > > > > > > 'Do While cnt1 <= 50 > > > > Do While Sekunde <=0 > > > > End While > > > > Msg_WriteFloat (Pause) > > > > Msg_WriteChar (32) > > > > Msg_WriteInt (cnt1) > > > > Msg_WriteChar (32) > > > > Msg_WriteInt (Sekunde) > > > > Msg_WriteChar (13) > > > > > > > > > > > > End Sub > > > > '--------------------------------------------- > > > > '---| ab hier folgen Subs und Funktionen |---- > > > > '--------------------------------------------- > > > > ' Interupt 10ms > > > > Sub INT_10ms() > > > > Dim irqcnt As Integer > > > > RTC() ' Funktionsaufrauf: RTC > > > > irqcnt=Irq_GetCount(INT_TIM2COMP) ' Interrupt Request Counter > > > > End Sub > > > > > > > > ' Interupt 1ms > > > > Sub INT_1ms() > > > > Dim irqcnt As Integer > > > > ms_1() ' Funktionsaufrauf: RTC > > > > irqcnt=Irq_GetCount(INT_TIM0COMP) ' Interrupt Request Counter > > > > End Sub > > > > > > > > Sub ms_1 () > > > > Pause = Pause + 1 > > > > End Sub > > > > > > > > Sub RTC() > > > > cnt1 = cnt1 + 1 ' 10ms Zähler erhöhen > > > > > > > > If cnt1=100 Then > > > > ' Display_Time() ' Funktionsaufruf: Display_Time > > > > Sekunde= Sekunde+1 > > > > If Sekunde=60 Then > > > > Sekunde=0 > > > > Minute= Minute+1 > > > > If Minute=60 Then > > > > Minute=0 > > > > Stunde= Stunde+1 > > > > If Stunde=24 Then > > > > Stunde=0 > > > > End If > > > > End If > > > > End If > > > > cnt1=0 > > > > End If > > > > End Sub > > > > | ||
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum