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

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)