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 18:32)
Als Antwort auf Re: Beta 2.12.06 Timer Probleme von PeterS - 23.12.2010 14:19
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,
>
> wie schon andere hier gesagt haben, liegt es an den SD-Card Aufrufen, die atomar
> ausgeführt werden. Wenn die länger als der Interrupt dauern, dann gehen Interrupts
> verloren. Wenn es um Uhrzeit Funktionen geht, kann ich hier die Clock Funktionen
> der Library empfehlen. Diese laufen ohne Störung durch die SD-Card Zugriffe, da
> bei Clock Routinen die Interrupts auf Assemblerebene laufen.
>
> Gruss Peter

Hallo Peter,

ist es denn möglich im Hauptprogramm SD-Card Aufrufen durchzuführen,
ohne das man 10ms IRQs verliert (z.B beim DCF Empfang)?

GrueÃ?e Joerg


    Antwort schreiben


Antworten: