rendered paste body// 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 <avr/io.h>
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;
}
}
}
}