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

Re: Beta 2.12.06 Timer Probleme Kategorie: Programmierung Basic (von Joerg - 23.12.2010 9:22)
Als Antwort auf Beta 2.12.06 Timer Probleme von Christian - 22.12.2010 23:12
Ich nutze:
C-Control Pro Mega128
> Hallo,
> ich will die DCF Funktion nutzen und habe sie in den Timer2 reingelegt.
> Nun möchte ich aber 1x in der Sekunde Daten auf eine SD-Karte schreiben.
>
> Diese Funktion ist im Timer0 hinterlegt.
>
> Sub Main()
>
>     DCF_Initialisierung()
>
>     SPI_Init_Byte = 80  '3,6 Mhz
>
>     SPI_Enable(SPI_Init_Byte)
>
>     I2C_Init(I2C_100kHz)
>
>     Serial_Init(0,SR_8BIT Or SR_1STOP Or SR_NO_PAR,SR_BD38400)
> ..
>  Irq_SetVect(INT_TIM2COMP,INT_10ms)      ' Interrupt Service Routine definieren
>    
>  'Interrupt Service Routine definieren - Timer0
>  Irq_SetVect(INT_TIM0COMP,Step_0_Timer_0)
>  Timer_T0Time(144,PS0_1024) 'Zeit festlegen, Timer0 starten 144,44 * 69,44us= 9,966 ms
> ..
> ' Main
>
>     Do While True   'Endlosschleife
>
>     If Test_Bit = 0 Then
>         Port_WriteBit(7,1)      'PortA.7 - LED
>         Test_Bit = 1
>     Else
>         Port_WriteBit(7,0)      'PortA.7 - LED
>         Test_Bit = 0
>     End If
>
>     Temperatur_einlesen_Step_1() 'Multiplex - Kanal wechseln
>     Thread_Wait(0,10) '10*10ms
>     Temperatur_einlesen_Step_2() 'Kanal I2C einlesen
>
>     RS232_Write()
>
>     End While
> End Sub()
>
> Sub INT_10ms()
>  Dim irqcnt As Integer
>  DCF_INT_10ms()
>  irqcnt=Irq_GetCount(INT_TIM2COMP)       ' Interrupt Request Counter
> Retrun
> End Sub
>
> Sub Step_0_Timer_0()
>  Dim Temp_Int As Integer
>     'Aufruf alle 10ms
>
>     If Timer0_10ms_counter = 50 Then
>         SD_Karte_main()
>     End If
>
>     Timer0_10ms_counter = Timer0_10ms_counter + 1
>
>     If Timer0_10ms_counter >100 Then     '10ms * 100 = ca. 1 Sekunde
>         Timer0_10ms_counter = 0
>     End If
>
>     'Interrupt Request Counter
>     Temp_Int = Irq_GetCount(INT_TIM0COMP)
>
>     Return
> End Sub
>
> Wenn jetzt auf die SD-Karte geschrieben wird bleibt in diesem Moment das Hochzählen der Sekunden stehen.
> Eine Sekunde dauert dann ca. 2sek.
>
> Was kann ich Ändern, damit der Timer2 vorrang hat (DCF Funktion)
>
> Gruss Christian

Hallo Christian,

ich nehme an, es klappt jetzt mit dem SD Karten schreiben...

Ich glaube nicht, das Dein Problem etwas mit der Beta zu tun hat.

Ich programmiere normalerweise in C. Ist es richtig, das Du auf die SD Card
in einer Interuptroutine zugreifst???

Soweit mir bekannt ist, können Interrupte nicht unterbrochen werden. Das schreiben
dauert vermutlich sehr lange. Alle Interrupte, Threads und das Main Programm
sind dann unterbrochen. Kannst Du die Zeiten für das schreiben mal messen?
Es würde mich echt interessiere.


Ich würde das schreiben der SD Card in das Hauptprogramm oder in einen Thread verlagern.
Allerdings wenn der Aufruf einer Bibliotheksfunktion länger als 10ms dauert, gehen auch hier Interrupts
verloren.

Ich hatte das gleich Problem mit Serial_WriteText in meinem Hauptprogramm. Durch die Aufteilung
in mehrere Strings ging es dann.

Ich würde mal die maximal Werte von irqcnt=Irq_GetCount(INT_TIM2COMP) im Hauptprogam ausgeben.
Sie dürfen nie größer als 1 werden.


Grueße Joerg





    Antwort schreiben


Antworten:

Re: Beta 2.12.06 Timer Probleme (von Franz-Peter - 23.12.2010 10:34)
    Re: Beta 2.12.06 Timer Probleme (von Christian - 23.12.2010 12:23)
        Re: Beta 2.12.06 Timer Probleme (von Franz-Peter - 23.12.2010 12:41)