BAM Demo Software

BAM-Demo.c

/***********************************************************************
 *
 *  DATE        : 24.01.2016
 *  DESCRIPTION : BAM Test für Mocca 
 *  Author:		: Christian Marty
 *
 ***********************************************************************/
#include 
#include 

void init_timer2(void);
void update_BAM(void);

uint8_t LED_dimmwerte[8] = {1,2,4,8,16,32,64,128}; // Hier die Helligkeitswerte der LEDs eintagen

// Globale Variablen für BAM	
volatile uint8_t BAM_wartezeit = 0;	
volatile uint8_t BAM_ausgabewert;
volatile uint8_t BAM_position = 0;

int main(void)
{
	DDRA = 0xFF;	// LED-Port als Ausgang
	sei();			// Interrupts aktivieren
	
	init_timer2();	// BAM-Timer initialisieren

	while(1)
    {
		// Mach was du willst.
    }
}

//--------------------------------------------------------------------------------------------
// Initialisiert den Timer für die BAM
//--------------------------------------------------------------------------------------------
void init_timer2(void)
{
	TCCR2A = 0b00000000; // Timer Mode Einstellungen -> Normal Mode
	TCCR2B = 0b00000110; // Prescaler 256 -> 16Mhz / 256 = 62.5kHz 
	TIMSK2 = 0b00000001; // Timer overflow Interrupt aktivieren
}

//--------------------------------------------------------------------------------------------
// Timer interrupt in dem die Anzeige (LEDs) aktualisiert wird.
//--------------------------------------------------------------------------------------------
ISR(TIMER2_OVF_vect)
{
	TCNT2 = BAM_wartezeit;		// Setzt die Zeit bis zum Nächsten Interrupt
	PORTA = BAM_ausgabewert;	// Aktualisiert die Anzeige
	update_BAM();				// Berechnet die Daten für den nächsten Durchlauf
}

//--------------------------------------------------------------------------------------------
// Berechnet die Date für den nächsten BAM Zyklus
//--------------------------------------------------------------------------------------------
void update_BAM(void)
{
	// Berechnet den Ausgabewert für den LED-Port
	BAM_ausgabewert = 0;
	for(uint8_t i= 0; i<8; i++)
	{
		BAM_ausgabewert = (BAM_ausgabewert <<1);
		BAM_ausgabewert |= ((LED_dimmwerte[i] >> BAM_position) & 0x01);
	}
	
	// Berechnet die Zeit für den nächsten Durchlauf
	BAM_wartezeit = (0xFF << BAM_position+1); 
	
	// Berechnet die Position im BAM Zyklus
	BAM_position ++;
	if(BAM_position >= 8) BAM_position = 0;
}