Re: ISR_10ms Kategorie: Programmierung Basic (von PeterS - 9.03.2010 9:50) | |
Als Antwort auf Re: ISR_10ms von Thomas - 8.03.2010 18:47
| |
> > > 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 > > > > > > > > > '------------------------------------------------------------------------------ > > > ' 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: Re: ISR_10ms (von Tron - 11.04.2010 17:34) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum