// lfuse is 1101 1111; EF // PIN0 PIN1 PIN2 OUTPUT // 0 0 0 0.0V - Sync level // 1 0 0 510mV - Gray // 0 1 0 246mV - ??? // 0 0 1 296mV - Black // 1 1 0 757mV - gray/white // 1 0 1 806mV - gray/white // 0 1 1 542mV - black/gray // 1 1 1 1.05V - white // 18.432 cycles = 1µS #include void set_sync() { PORTA &= ~(1 << 0); // Sets pins 0,1,2 to LOW PORTA &= ~(1 << 1); PORTA &= ~(1 << 2); } void set_black() { PORTA &= ~(1 << 0); // Sets pin 2 to HIGH PORTA &= ~(1 << 1); PORTA |= 1 << 2; } void set_white() { PORTA |= 1 << 0; PORTA |= 1 << 1; PORTA |= 1 << 2; } uint32_t GetUsecs() { return TCNT1/18.432; } int main() { uint32_t us; // microsecond counter DDRA = 0xFF; TCCR1B |= (1 << CS10); us = 0; uint32_t line = 1; PORTA ^= 255; while (1) { us = GetUsecs(); switch(line) { case 1: case 2: set_sync(); switch(us) { case 30: set_black(); case 32: set_sync(); case 62: set_black(); case 64: us = 0; TCNT1 = 0; } line++; continue; case 3: set_sync(); switch(us) { case 30: set_black(); case 32: set_sync(); case 34: set_black(); case 64: us = 0; TCNT1 = 0; } line++; continue; case 4: case 5: case 311: case 312: case 316: case 317: case 623: case 624: case 625: set_sync(); switch(us) { case 2: set_black(); case 32: set_sync(); case 34: set_black(); case 64: us = 0; TCNT1 = 0; } default: set_sync(); switch(us) { case 12: set_black(); case 20: set_white(); case 40: set_black(); case 50: set_white(); case 64: us = 0; TCNT1 = 0; } } } }