#include #include #include #include #include "delay.h" #define PORTB_PTT (1 << 0) volatile uint8_t Timer; /* Timer (100Hz increment) */ /*---------------------------------------------------------*/ /* 100Hz timer interrupt generated by OC2 */ /*---------------------------------------------------------*/ ISR(TIMER1_COMPA_vect) { Timer++; } static int inittimer(void) { /* Start 100Hz system timer (TC2.OC) */ TCCR0B |= (1 << WGM02); // Configure timer for CTC mode TIMSK |= (1 << OCIE1A); // enable overflow interrupt OCR1A = (uint8_t)(F_CPU / 64 / 1000 / 100 - 1); // Set CTC compare value to 10ms TCCR0B |= ((1 << CS10) | (1 << CS11)); // Start timer at Fcpu/64 // Enable interrupts sei(); return 0; } #define DIT_DURATION 100 // ms #define PTT_LOGIC_LOW 0 #if PTT_LOGIC_LOW void dah(void) { PORTB = 0; // PTT is inverted logic delay_ms(3*DIT_DURATION); PORTB = PORTB_PTT; // PTT is inverted logic delay_ms(DIT_DURATION); } void dit(void) { PORTB = 0; // PTT is inverted logic delay_ms(DIT_DURATION); PORTB = PORTB_PTT; // PTT is inverted logic delay_ms(DIT_DURATION); } #else void dah(void) { PORTB = PORTB_PTT; delay_ms(3*DIT_DURATION); PORTB = 0; delay_ms(DIT_DURATION); } void dit(void) { PORTB = PORTB_PTT; delay_ms(DIT_DURATION); PORTB = 0; delay_ms(DIT_DURATION); } #endif #include "morse.c" int main(void) { /* Enable PTT output on PB0 */ PORTB = PORTB_PTT; #if PTT_LOGIC_LOW DDRB = PORTB_PTT; #else DDRB = 0; #endif /* initialise timer interrupt */ inittimer(); morse("HB9EGM"); delay_ms(12*DIT_DURATION); while (1) { // morse code ! morse("MOH"); delay_ms(6*DIT_DURATION); } return 0; }