openltc icon indicating copy to clipboard operation
openltc copied to clipboard

Using external interrupt source instead of timer

Open perotom opened this issue 2 years ago • 0 comments

I love this project and I tried to extend it. After some testing I saw that the internal timer of the Arduino Uno is not very accurate (after 2 hours it was 2 seconds off). My idea was to use some accurate external frequency generator with a frequency of 4khz (80 bits * 2 rising/falling * 25 fps) to be used for the generation of the time code. Sadly I am a high level programmer so I don't understand all the timer registers. Maybe you could guide my way?

The basic idea is:

#include <avr/io.h>
#include <avr/interrupt.h>

volatile unsigned char hourCount = 0;
volatile unsigned char minuteCount = 0;
volatile unsigned char secondCount = 0;
volatile unsigned char frameCount = 0;

volatile unsigned char bitCount = 0;
volatile unsigned char updateCnt = 0;
volatile unsigned char currentBit = 0;

volatile unsigned char lastLevel = 0;
volatile unsigned char polarBit = 0;

int main(void)
{

  /* What do I need here?
  DDRD = 0b00101000;
  DDRB = 0b00110000;
  
  //50% PWM Ground Level
  TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00);
  TCCR0B = _BV(WGM02) | _BV(CS00);
  OCR0A = 1;
  OCR0B = 0;

  //Set Output to Ground Level
  TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(WGM22) | _BV(CS20);
  OCR2A = 127;
  OCR2B = 63;
  
  //Per 1/2-Bit Interrupt
  TCCR1A = 0b00 << WGM10;
  TCCR1B = 0b01 << WGM12 | 0b001 << CS10;
  OCR1A = 3995;//3999@25fps
  TIMSK1 = 1 << OCIE1A;
  sei();
  */

  attachInterrupt(digitalPinToInterrupt(2), generateTimecode, RISING);
  while(1)
  {    
  }
}

void setLevel(void)
{
  switch(bitCount)
  {
    case 0:
      polarBit = 0;
      currentBit = (((frameCount % 10) >> (1 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 1:
      currentBit = (((frameCount % 10) >> (2 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 2:
      currentBit = (((frameCount % 10) >> (3 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 3:
      currentBit = (((frameCount % 10) >> (4 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 4:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 5:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 6:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 7:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 8:
      currentBit = (((frameCount / 10 % 10) >> (1 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;  
    case 9:
      currentBit = (((frameCount / 10 % 10) >> (2 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;  
    case 10:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 11:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 12:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 13:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 14:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 15:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 16:
      currentBit = (((secondCount % 10) >> (1 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 17:
      currentBit = (((secondCount % 10) >> (2 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 18:
      currentBit = (((secondCount % 10) >> (3 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 19:
      currentBit = (((secondCount % 10) >> (4 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 20:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 21:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 22:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 23:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 24:
      currentBit = (((secondCount /10 % 10) >> (1 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 25:
      currentBit = (((secondCount /10 % 10) >> (2 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break; 
    case 26:
      currentBit = (((secondCount /10 % 10) >> (3 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 27:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 28:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 29:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 30:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 31:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 32:
      currentBit = (((minuteCount % 10) >> (1 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 33:
      currentBit = (((minuteCount % 10) >> (2 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 34:
      currentBit = (((minuteCount % 10) >> (3 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 35:
      currentBit = (((minuteCount % 10) >> (4 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 36:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 37:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 38:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 39:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 40:
      currentBit = (((minuteCount / 10 % 10) >> (1 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 41:
      currentBit = (((minuteCount / 10 % 10) >> (2 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 42:
      currentBit = (((minuteCount / 10 % 10) >> (3 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 43:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 44:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break; 
    case 45:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 46:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 47:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break; 
    case 48:
      currentBit = (((hourCount % 10) >> (1 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 49:
      currentBit = (((hourCount % 10) >> (2 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 50:
      currentBit = (((hourCount % 10) >> (3 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 51:
      currentBit = (((hourCount % 10) >> (4 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 52:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 53:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 54:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 55:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 56:
      currentBit = (((hourCount / 10 % 10) >> (1 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 57:
      currentBit = (((hourCount / 10 % 10) >> (2 - 1)) & 1);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break; 
    case 58:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 59:
      currentBit = (polarBit);
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 60:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 61:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 62:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 63:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 64:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 65:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 66:
      currentBit = 1;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 67:
      currentBit = 1;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 68:
      currentBit = 1;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 69:
      currentBit = 1;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 70:
      currentBit = 1;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 71:
      currentBit = 1;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 72:
      currentBit = 1;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 73:
      currentBit = 1;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 74:
      currentBit = 1;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 75:
      currentBit = 1;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 76:
      currentBit = 1;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 77:
      currentBit = 1;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 78:
      currentBit = 0;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    case 79:
      currentBit = 1;
      OCR2B = (lastLevel = (updateCnt?(currentBit?(!lastLevel):(lastLevel)):(!lastLevel))?(1):(0))?(100):(27);
      if((updateCnt)&(!currentBit)){polarBit=!polarBit;};
      break;
    default:
      OCR2B = 63;
  }
}

void timeUpdate(void)
{
  
  if(bitCount < 79)
    {
      bitCount ++;
    }
    else
    {
      bitCount = 0;
      if(frameCount < 24)
      {
        frameCount ++;
      }
      else
      {
        frameCount = 0;
        if(secondCount < 59)
        {
          secondCount ++;
        }
        else
        {
          secondCount = 0;
          if(minuteCount < 59)
          {
            minuteCount ++;
          }
          else
          {
            minuteCount = 0;
            if(hourCount < 23)
            {
              hourCount ++;
            }
            else
            {
              hourCount = 0;
            }
          }
        }
      }      
    }
    
}

void generateTimecode(void)
{
    
  setLevel();

  if(updateCnt == 0)
  {
    updateCnt ++;
  }
  else
  {
    updateCnt = 0;
    timeUpdate();
  }          
}

perotom avatar Mar 02 '22 17:03 perotom