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;
}