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)