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 Thomas - 8.03.2010 18:47)
Als Antwort auf Re: ISR_10ms von PeterS - 8.03.2010 13:43
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
> >
> >
> > '------------------------------------------------------------------------------
> > ' 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


    Antwort schreiben


Antworten:

Re: ISR_10ms (von PeterS - 9.03.2010 9:50)
    Re: ISR_10ms (von Tron - 11.04.2010 17:34)