blob: 9ce1456dd247d6cf070d491a4960084bee8d320a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#include <stdio.h>
#include <avr/pgmspace.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#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()
{
PORTB = 0; // PTT is inverted logic
delay_ms(3*DIT_DURATION);
PORTB = PORTB_PTT; // PTT is inverted logic
delay_ms(DIT_DURATION);
}
void dit()
{
PORTB = 0; // PTT is inverted logic
delay_ms(DIT_DURATION);
PORTB = PORTB_PTT; // PTT is inverted logic
delay_ms(DIT_DURATION);
}
#else
void dah()
{
PORTB = PORTB_PTT;
delay_ms(3*DIT_DURATION);
PORTB = 0;
delay_ms(DIT_DURATION);
}
void dit()
{
PORTB = PORTB_PTT;
delay_ms(DIT_DURATION);
PORTB = 0;
delay_ms(DIT_DURATION);
}
#endif
int main ( void )
{
/* Enable PTT output on PB0 */
PORTB = PORTB_PTT;
DDRB = PORTB_PTT;
/* initialise timer interrupt */
inittimer();
while (1) {
// morse code !
dah();
dah();
delay_ms(2*DIT_DURATION);
dah();
dah();
dah();
delay_ms(2*DIT_DURATION);
dit();
dit();
dit();
delay_ms(6*DIT_DURATION);
}
return 0;
}
#if 0
static void some_old_function(uint32_t data)
{
uint32_t test_status;
int sleep_ticks;
/* Enable all LEDs */
DDRB = 0xFF;
PORTB = 0xFF;
/* Flash LED once per second if passed, very quickly if failed */
sleep_ticks = (test_status == 0) ? SYSTEM_TICKS_PER_SEC : (SYSTEM_TICKS_PER_SEC/8);
/* Test finished, flash slowly for pass, fast for fail */
while (1)
{
/* Toggle a LED */
PORTB ^= (1 << 0);
}
}
#endif
|