aboutsummaryrefslogtreecommitdiffstats
path: root/src/testapp1/main.c
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