/*********************************
Loesung zum Termin 4 Aufgabe 1
von: Manfredd Pester
am: Januar 2023
**********************************/
#include <sam.h>
#include <utils.h>

void init_wave_Timer0(unsigned int Frequenz)
{
  PMC->PMC_PCER0 = 0x1 << ID_TC0;

  TC0->TC_CHANNEL[0].TC_CCR = TC_CCR_CLKDIS;
  TC0->TC_CHANNEL[0].TC_CMR = TC_CMR_WAVE | TC_CMR_TCCLKS_TIMER_CLOCK1 | TC_CMR_WAVSEL_UP_RC | TC_CMR_BCPB_CLEAR | TC_CMR_BCPC_SET |  TC_CMR_EEVT_XC0;
  TC0->TC_CHANNEL[0].TC_RC  = SystemCoreClock / 2 / (Frequenz);
  TC0->TC_CHANNEL[0].TC_RB  = SystemCoreClock / 2 / (Frequenz) / 2;
  TC0->TC_CHANNEL[0].TC_CCR = TC_CCR_CLKEN | TC_CCR_SWTRG;

  PIOB->PIO_PDR = P27;
  PIOB->PIO_ABSR = P27;
}

void init_capt_Timer8(void)
{
  PMC->PMC_PCER1 = 0x1u << 3;

  TC2->TC_CHANNEL[2].TC_CCR = TC_CCR_CLKDIS;
  TC2->TC_CHANNEL[2].TC_CMR = TC_CMR_TCCLKS_TIMER_CLOCK1 | TC_CMR_LDRA_FALLING | TC_CMR_LDRB_FALLING | TC_CMR_LDBSTOP | TC_CMR_LDBDIS;

  PIOD->PIO_PDR = P7;
  PIOD->PIO_ABSR = P7;
}

unsigned int Messe_Frequenz_TimerX(TcChannel * channel)
{
  unsigned int Capture_RA, Capture_RB;
  
  channel->TC_CCR = TC_CCR_CLKEN | TC_CCR_SWTRG;
  while (~channel->TC_SR & TC_SR_LDRBS);
  Capture_RA = channel->TC_RA;
  Capture_RB = channel->TC_RB;
  return SystemCoreClock / (Capture_RB - Capture_RA) / 2;
}

int main(void)
{
  unsigned int Frequenz;
  
  SystemInit();
  WDT->WDT_MR = WDT_MR_WDDIS;

  init_wave_Timer0(1);
  init_capt_Timer8();


  while(1)
  {
    Frequenz = Messe_Frequenz_TimerX(&TC2->TC_CHANNEL[2]);
  }
}