#include <avr/io.h> // register and port definitions
#define T 160 // (16MHz/1)/200 = 80kHz
int main(void) {
GTCCR = 0b10000011; // assert and hold reset
TCCR0A = 0b00100011; // COM0A=off, COM0B=2, WGM0=7 (FastPWM 0..OCRA)
TCCR0B = 0b00001001; // WGM0=7, CS0=CLK/1 (16MHz)
TIMSK0 = 0b00000000; // disable interrupts
OCR0A = T-1; // F = 16MHz/T
OCR0B = 0.50*T; // duty = 50%
TCNT0 = 0; // reset counter (0deg)
TCCR1A = 0b00100011; // COM1A=off, COM1B=2, WGM1=15 (FastPWM 0..OCRA)
TCCR1B = 0b00011001; // WGM1=15, CS0=CLK/1 (16MHz)
TCCR1C = 0b00000000; // no force output compare
TIMSK1 = 0b00000000; // disable interrupts
ICR1 = 0; // input capture register (unused)
OCR1A = T-1; // F = (16MHz/1)/T
OCR1B = 0.50*T; // duty = 50%
//TCNT1 = 0.75*T; // reset counter (90deg) // WORKSN'T
TCNT1 = -0.25*T; // reset counter (90deg) // WORKS
TCCR2A = 0b00100011; // COM2A=off, COM2B=2, WGM2=7 (FastPWM 0..OCRA)
TCCR2B = 0b00001001; // WGM2=7, CS2=CLK/1 (16MHz)
TIMSK2 = 0b00000000; // disable interrupts
OCR2A = T-1; // F = (16MHz/1)/T
OCR2B = 0.50*T; // duty = 50%
//TCNT2 = 0.50*T; // reset counter (180deg) // WORKSN'T
TCNT2 = -0.50*T; // WORKS
ASSR = 0b00000000; // Clear async status reg
DDRD = 0b00101000; // PD5 (OC0B) = out, PD3 (OC2B) = out, PD6 (OC0A) = in
DDRB = 0b00000100; // PB2 (OC1B) = out, PB1 (OC1A) = in, PB3 (OC2A) = in
GTCCR = 0b00000011; // release reset (will be auto-deasserted)
return 0;
}
I2luY2x1ZGUgPGF2ci9pby5oPiAvLyByZWdpc3RlciBhbmQgcG9ydCBkZWZpbml0aW9ucwoKI2RlZmluZSBUIDE2MCAvLyAoMTZNSHovMSkvMjAwID0gODBrSHoKCmludCBtYWluKHZvaWQpIHsKICBHVENDUiAgPSAwYjEwMDAwMDExOyAvLyBhc3NlcnQgYW5kIGhvbGQgcmVzZXQKICAKICBUQ0NSMEEgPSAwYjAwMTAwMDExOyAvLyBDT00wQT1vZmYsIENPTTBCPTIsIFdHTTA9NyAoRmFzdFBXTSAwLi5PQ1JBKQogIFRDQ1IwQiA9IDBiMDAwMDEwMDE7IC8vIFdHTTA9NywgQ1MwPUNMSy8xICgxNk1IeikKICBUSU1TSzAgPSAwYjAwMDAwMDAwOyAvLyBkaXNhYmxlIGludGVycnVwdHMKICBPQ1IwQSAgPSBULTE7ICAgICAgICAvLyBGID0gMTZNSHovVAogIE9DUjBCICA9IDAuNTAqVDsgICAgIC8vIGR1dHkgPSA1MCUKICBUQ05UMCAgPSAwOyAgICAgICAgICAvLyByZXNldCBjb3VudGVyICgwZGVnKQogIAogIFRDQ1IxQSA9IDBiMDAxMDAwMTE7IC8vIENPTTFBPW9mZiwgQ09NMUI9MiwgV0dNMT0xNSAoRmFzdFBXTSAwLi5PQ1JBKQogIFRDQ1IxQiA9IDBiMDAwMTEwMDE7IC8vIFdHTTE9MTUsIENTMD1DTEsvMSAoMTZNSHopCiAgVENDUjFDID0gMGIwMDAwMDAwMDsgLy8gbm8gZm9yY2Ugb3V0cHV0IGNvbXBhcmUKICBUSU1TSzEgPSAwYjAwMDAwMDAwOyAvLyBkaXNhYmxlIGludGVycnVwdHMKICBJQ1IxICAgPSAwOyAgICAgICAgICAvLyBpbnB1dCBjYXB0dXJlIHJlZ2lzdGVyICh1bnVzZWQpCiAgT0NSMUEgID0gVC0xOyAgICAgICAgLy8gRiA9ICgxNk1Iei8xKS9UCiAgT0NSMUIgID0gMC41MCpUOyAgICAgLy8gZHV0eSA9IDUwJQogIC8vVENOVDEgID0gMC43NSpUOyAgICAgLy8gcmVzZXQgY291bnRlciAoOTBkZWcpIC8vIFdPUktTTidUCiAgVENOVDEgID0gLTAuMjUqVDsgICAgLy8gcmVzZXQgY291bnRlciAoOTBkZWcpIC8vIFdPUktTCiAgCiAgVENDUjJBID0gMGIwMDEwMDAxMTsgLy8gQ09NMkE9b2ZmLCBDT00yQj0yLCBXR00yPTcgKEZhc3RQV00gMC4uT0NSQSkKICBUQ0NSMkIgPSAwYjAwMDAxMDAxOyAvLyBXR00yPTcsIENTMj1DTEsvMSAoMTZNSHopCiAgVElNU0syID0gMGIwMDAwMDAwMDsgLy8gZGlzYWJsZSBpbnRlcnJ1cHRzCiAgT0NSMkEgID0gVC0xOyAgICAgICAgLy8gRiA9ICgxNk1Iei8xKS9UCiAgT0NSMkIgID0gMC41MCpUOyAgICAgLy8gZHV0eSA9IDUwJQogIC8vVENOVDIgID0gMC41MCpUOyAgICAgLy8gcmVzZXQgY291bnRlciAoMTgwZGVnKSAvLyBXT1JLU04nVAogIFRDTlQyICA9IC0wLjUwKlQ7ICAgIC8vIFdPUktTCiAgQVNTUiAgID0gMGIwMDAwMDAwMDsgLy8gQ2xlYXIgYXN5bmMgc3RhdHVzIHJlZwoKICBERFJEICAgPSAwYjAwMTAxMDAwOyAvLyBQRDUgKE9DMEIpID0gb3V0LCBQRDMgKE9DMkIpID0gb3V0LCBQRDYgKE9DMEEpID0gaW4KICBERFJCICAgPSAwYjAwMDAwMTAwOyAvLyBQQjIgKE9DMUIpID0gb3V0LCBQQjEgKE9DMUEpID0gaW4sICBQQjMgKE9DMkEpID0gaW4KICAKICBHVENDUiAgPSAwYjAwMDAwMDExOyAvLyByZWxlYXNlIHJlc2V0ICh3aWxsIGJlIGF1dG8tZGVhc3NlcnRlZCkKICAKICByZXR1cm4gMDsKfQo=