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

Re: ISR_10ms Kategorie: CC-Pro Unit & Appl.Board (von Tron - 11.04.2010 17:34)
Als Antwort auf Re: ISR_10ms von PeterS - 9.03.2010 9:50
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board
> > > > Hallo,
> > > > ich habe ein kleines Problem. Ich starte bei meiner cc128 den 10ms Interrupt von Timer2.
> > > > Darüber möchte ich die Tastatur abfragen und mir die DCF-Zeit holen.
> > > > Wenn ich aber jetzt im Sub_main() in der DO...Loop Schleife auch noch Code ausführe dann
> > > > verlangsamt sich die Interrupt-Routiene extrem. Teilweise dauert ein Interrupt-Durchlauf 30ms
> > > > und mehr.... Unten habe ich mal ein bisschen vom Code eingestellt.......
> > > >
> > > >
> > > > '------------------------------------------------------------------------------
> > > > ' 10ms Interruptroutiene
> > > > '
> > > > Sub INT_10ms()
> > > >     Dim irqcnt As Integer
> > > >     DCF_PULS()                              ' DCF_MODE=1 Puls suchen
> > > >     DCF_SYNC()                              ' DCF_MODE=2 Synchronisation
> > > >     DCF_FRAME()                           ' DCF_MODE=3 Datenaufnahme
> > > >     Key_Input()                                ' Funktionsaufrauf: Tastaturabfrage
> > > >     irqcnt=Irq_GetCount(INT_TIM2COMP)       ' Interrupt Request Counter
> > > > End Sub
> > >

Hallo miteinand
ich habe mir diese DCF-Lib einmal angeschaut und es ist für mich ein Graus. Wieso ist dies kein eigener Thread?
warum verliert die Uhr Zeit?
wenn das ganze sowieso läuft warum findet keine regelmä�ige Synchronisation statt?
GruÃ? Robert
> > > >
> > > > '------------------------------------------------------------------------------
> > > > ' Hauptprogramm
> > > > '
> > > > Sub main()
> > > >
> > > >     Serial_Disable(1)                       ' 2. RS232 abschalten
> > > >     SPI_Disable()                           ' SPI abschalten
> > > >     LCD_Init()                                ' Display initialisieren
> > > >     LCD_ClearLCD()                       ' Display löschen
> > > >     LCD_CursorOff()                       ' Display Cursor ausschalten
> > > >     Key_Init()                                 ' Keyboard initialisieren
> > > >     I2C_Init(I2C_100kHz)                ' I2C-Bus mit 100kHz Initialisieren
> > > >     DCF_INIT()                               ' Initialisierung des DCF Modes
> > > >
> > > >     Irq_SetVect(INT_TIM2COMP,INT_10ms)      ' Interrupt Service Routine definieren für Key & DCF
> > > >                                                                     ' Timer2 erzeugt einen 10ms interrupt
> > > >     DCF_START()                          ' Starten des DCF Modes
> > > >
> > > >
> > > >     Do While 1                              ' Endlosschleife
> > > >                                                   ' Hier wird eigener code ausgeführt
> > > >     End While
> > > >
> > > >
> > > >
> > > > Nun meine Frage: Tastatur, LCD, DCF und ein Paar Ports schalten ist doch nicht zuviel
> > > > verlangt? Oder habe ich einfach nur einen Denkfehler?
> > > >
> > > > Danke schon jetzt für die Antworten.
> > > >
> > > > GruÃ?
> > > > Thomas
> > >
> > > Kommt doch immer darauf an, was Du da machst. Gib doch was aus, wenn irq_cnt > 1 ist, dann hast
> > > Du ja einen Interrupt verpasst. Dann in der Hauptschleife sukzessive Anweisungen auskommentieren
> > > bis man weniger als 10ms braucht. Dann hast Du Deine Antwort, was die Zeit frisst.
> > >
> > > Gruss Peter
> >
> > Hallo Peter,
> > es hat geklappt. Die unten aufgeführte Funktion war der �beltäter.
> > Aber braucht das generieren eines Strings von 20 Zeichen so viel Rechenleistung
> > des ATMega 128??? Zumal die Funktion nur jede Sekunde einmal ausgeführt wird.
> > Dadurch wird schon 5-6 mal die 10ms Interruptroutiene pro sekunde ausgelassen.
> >
> > '---------------------------------------------------------------------------------
> > ' Display Buffer schreiben
> > '
> > Sub Display_Buffer_Set()
> >     Dim sep(2) As Char
> >     Dim sep2(2) As Char
> >     Dim sep3(2) As Char
> >     Dim sep_luft(6) As Char
> >     Dim sep_boden(6) As Char
> >     Dim sep_feuchte(8) As Char
> >     Dim sep_c(3) As Char
> >
> >     sep=":"
> >     sep2="%"
> >     sep3=" "
> >     sep_c="'C"
> >     sep_luft="Luft "
> >     sep_boden="Boden"
> >     sep_feuchte="Feuchte"
> >
> >
> >     Str_WriteWord(HW_Stunde,10,Zeile1,0,2)     ' LCD erste Zeile
> >     Str_Copy(Zeile1,sep,STR_APPEND)
> >     Str_WriteWord(HW_Minute,10,Zeile1,STR_APPEND,2)
> >     Str_Copy(Zeile1,sep3,STR_APPEND)
> >     Str_WriteWord(DCF_MODE,10,Zeile1,STR_APPEND,1)
> >     Str_WriteWord(DCF_Status,10,Zeile1,STR_APPEND,1)
> >     Str_Copy(Zeile1,sep3,STR_APPEND)
> >     Str_WriteWord(Filter_Error,10,Zeile1,STR_APPEND,1)
> >     Str_Copy(Zeile1,sep3,STR_APPEND)
> >     Str_WriteWord(Wasser_Error,10,Zeile1,STR_APPEND,1)
> >
> >
> >     Str_Copy(Zeile2,sep_luft,0)                      ' LCD zweite Zeile
> >     Str_Copy(Zeile2,sep,STR_APPEND)
> >     Str_WriteFloat(LM75_Read(Sensor_Luft),1,Zeile2,0)
> >     Str_Copy(Zeile2,sep_c,STR_APPEND)
> >
> >     Str_Copy(Zeile3,sep_boden,0)                     ' LCD dritte Zeile
> >     Str_Copy(Zeile3,sep,STR_APPEND)
> >     Str_WriteFloat(LM75_Read(Sensor_Boden),1,Zeile3,STR_APPEND)
> >     Str_Copy(Zeile3,sep_c,STR_APPEND)
> >
> >     Str_Copy(Zeile4,sep_feuchte,0)                   ' LCD vierte Zeile
> >     Str_Copy(Zeile4,sep,STR_APPEND)
> >     Str_WriteWord(RH_Messung(RH_Terrarium),10,Zeile4,STR_APPEND,2)
> >     Str_Copy(Zeile4,sep2,STR_APPEND)
> >
> > End Sub
> >
> >
> > GruÃ? Thomas
>
> Einfach weiterschauen. Hier werden ja nicht nur die Strings erstellt. LM75_Read() und
> RH_Messung() kommunizieren mit einem Sensor, gerade dort gibt es immer wieder
> Wartezeiten...
>
> Gruss Peter


    Antwort schreiben


Antworten: