Permalink
Browse files

BUGFIX: Fadeoperation with different startvalues is possible now.

Erklärung: DoFade darf nur alle 0,75ms ausgeführt werden, weil die LED-Controller ca 0,4ms "ruhe" brauchen um den Farbwert zu aktualisieren. Erst nach 0,4 ms ohne ClockSignale an der SPI-Schnittstelle übernehmen die LED-Controller den Farbwert. Senden wir ohne Pause, wird ein zufälliger Wert übernommen. Update Fade können wir jedoch wesentlich öfter ausführen.
  • Loading branch information...
1 parent ac5aec7 commit 6153c4fcab50e50e9bae6200b819ffdd8d30bee4 Nils Weiß committed Jul 26, 2012
Showing with 117 additions and 9 deletions.
  1. +13 −4 main.c
  2. +84 −3 timer.c
  3. +20 −2 timer.h
View
17 main.c
@@ -44,7 +44,7 @@
#endif /* #ifdef X86 */
//*********************** GLOBAL VARIABLES *******************************************
-unsigned char g_UpdateFade;
+uns8 g_UpdateFade,g_DoFade;
//*********************** X86 InterruptRoutine *******************************************
#ifndef X86
@@ -71,8 +71,12 @@ interrupt InterruptRoutine(void)
{
Timer4Interrupt();
g_UpdateFade = 1;
-
}
+ if(TMR2IF)
+ {
+ Timer2Interrupt();
+ g_DoFade = 1;
+ }
FSR0 = sv_FSR0;
#pragma fastMode
}
@@ -103,11 +107,16 @@ void main(void)
Error_Throw();
Commandstorage_GetCommands();
Commandstorage_ExecuteCommands();
- Ledstrip_DoFade();
-
+ if(g_DoFade)
+ {
+ Ledstrip_DoFade();
+ g_DoFade = 0;
+ }
if(g_UpdateFade)
{
+ //Timer_StartStopwatch();
Ledstrip_UpdateFade();
+ //Timer_StopStopwatch();
g_UpdateFade = 0;
}
View
87 timer.c
@@ -18,21 +18,102 @@
#include "timer.h"
#include "ledstrip.h"
+#include "USART.h"
void Timer_Init()
{
T1CON = 0b00110111;
TMR1IE = 1;
- //T4 Interrupt every 2 Millisecound if clock is 64MHz
- //Calculation
- //64000000 Hz / 4 / 16 / 200 / 10
+
+ /*
+ ** T4 Interrupt every 2 Millisecound if clock is 64MHz
+ ** Calculation
+ ** 64000000 Hz / 4 / 16 / 200 / 10
+ */
T4CON = 0b01001111;
TMR4IE = 1;
PR4 = 200;
+
+ /*
+ ** T2 Interrupt every 0.5 Millisecound if clock is 64MHz
+ ** Calculation
+ ** 64000000 Hz / 4 / 16 / 75 / 10
+ */
+ T2CON = 0b01001111;
+ TMR2IE = 1;
+ PR2 = 75;
+
+ /*
+ ** T3 Modul count with a frequency of 2MHz
+ ** Calculation:
+ ** 64MHz / 4 / 8
+ */
+ T3CON = 0b00110100;
}
void Timer_SetForFade(char value)
{
//Not Implemented yet
}
+void Timer_StartStopwatch(void)
+{
+#ifndef X86
+ TMR3H = 0;
+ TMR3L = 0;
+
+ TMR3ON = 1;
+#endif
+}
+
+void Timer_StopStopwatch(void)
+{
+#ifndef X86
+ TMR3ON = 0;
+ uns16 measuredValue,tempValue;
+ uns8 value;
+ measuredValue.low8 = TMR3L;
+ measuredValue.high8 = TMR3H;
+
+ UART_SendString("Measured Time:");
+
+ tempValue = measuredValue >> 1; //rotate right, so there are µS in tempValue
+
+ if((tempValue & 0xf000) > 0)
+ {
+ value = (uns8)(tempValue >> 12);
+ value &= 0x0f;
+ value += '0';
+ UART_Send(value);
+ }
+ if((tempValue & 0x0f00) > 0)
+ {
+ value = (uns8)(tempValue >> 8);
+ value &= 0x0f;
+ value += '0';
+ UART_Send(value);
+ }
+ if((tempValue & 0x00f0) > 0)
+ {
+ value = (uns8)(tempValue >> 4);
+ value &= 0x0f;
+ value += '0';
+ UART_Send(value);
+ }
+ if((tempValue & 0xf000) > 0)
+ {
+ value = (uns8)tempValue;
+ value &= 0x0f;
+ value += '0';
+ UART_Send(value);
+ }
+
+ if((measuredValue & 0x0001) == 1) //check LSB if set
+ {
+ UART_Send('.');
+ UART_Send('5');
+ UART_SendString(" µSecounds in HEX");
+ }
+
+#endif
+}
View
22 timer.h
@@ -32,10 +32,23 @@ void* timer_interrupt(void* unused);
#endif
void Timer_Init();
-//To Do: Funktion bekommt einen Wert, anhand diese wertes wird die geschwindigkeit des
-//Timers festgelegt. Wert kommt aus der berechnung einer anderen Funktion (fade oder run)
+
+/*To Do: Funktion bekommt einen Wert, anhand diese wertes wird die geschwindigkeit des
+Timers festgelegt. Wert kommt aus der berechnung einer anderen Funktion (fade oder run)*/
void Timer_SetForFade(char value);
+
+/**
+** Function start the internal Stopwatch. It's realised with the Timer3 Modul.
+** The Range of the Stopwatch is from 0.5µSec to 32.7mSec
+**/
+void Timer_StartStopwatch(void);
+
+/**
+** Function terminates the Stopwatch and print out the measured Time over UART
+**/
+void Timer_StopStopwatch(void);
+
#define Timer1Interrupt(x) \
{ \
TMR1IF = 0; \
@@ -46,4 +59,9 @@ void Timer_SetForFade(char value);
TMR4IF = 0; \
}
+#define Timer2Interrupt(x) \
+{ \
+ TMR2IF = 0; \
+}
+
#endif

0 comments on commit 6153c4f

Please sign in to comment.