Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

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
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board
> 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: