1 | /* Name: main.c
|
2 | * Author: <insert your name here>
|
3 | * Copyright: <insert your copyright message here>
|
4 | * License: <insert your license reference here>
|
5 | */
|
6 |
|
7 | #include <avr/io.h>
|
8 | #include <util/delay.h>
|
9 | #include <avr/interrupt.h>
|
10 | #include "lcd_routines.h"
|
11 |
|
12 | #define GREEN_LED PD2
|
13 | #define GREEN_LED_ON ( PORTD &= ~(1<<GREEN_LED) )
|
14 | #define GREEN_LED_OFF ( PORTD |= (1<<GREEN_LED) )
|
15 |
|
16 | #define SERVO PD3
|
17 | #define SERVO_ON ( PORTD &= ~(1<<SERVO) )
|
18 | #define SERVO_OFF ( PORTD |= (1<<SERVO) )
|
19 | #define STEPSIZE 10
|
20 | #define TIMER1_START ( TCCR1B |=(1<<CS11) | (1<<WGM13) | (1<<WGM12) ) // clk/8 + CTC-mode12 (ICR1)
|
21 | #define TIMER1_STOP ( TCCR1B = 0x00 )
|
22 | #define IMPULS_BREAK 40000 //(us)
|
23 | #define IMPULS_STEP_SIZE 10
|
24 |
|
25 | #define BUT_UP PIND4
|
26 | #define BUT_DWN PIND7
|
27 | #define BUT_LF PIND5
|
28 | #define BUT_RI PIND6
|
29 |
|
30 | #define SETUP_TIMEOUT 30 //After 20 x 100ms Setup start is gone
|
31 |
|
32 | struct {
|
33 | unsigned bNormal:1; // 1 bit for NORMAL Mode
|
34 | unsigned bSetup:1; // 1 bit for SETUP Mode
|
35 | unsigned bDebug:1; // 1 bit for DEBUG Mode
|
36 | unsigned bError:1; // 1 bit for ERROR Mode
|
37 | unsigned bRS232:1; // 1 Bit RS232 Enable
|
38 | unsigned bADU:1; // 1 Bit ADU Enable
|
39 | unsigned bI2C:1; // 1 Bit I2C Enable
|
40 | } Mode;
|
41 |
|
42 | volatile unsigned int centi_sec=0;
|
43 | volatile unsigned short ucCompValue=1500;
|
44 |
|
45 | /* timer0 overflow */
|
46 | ISR(TIMER0_OVF_vect) {
|
47 | /* wait state loop */
|
48 | if (!Mode.bNormal) {
|
49 | centi_sec++;
|
50 | TCNT0=0xB1;
|
51 |
|
52 | if ( (PIND & (1<<GREEN_LED)) ) {
|
53 | GREEN_LED_ON;
|
54 | }
|
55 | else {
|
56 | GREEN_LED_OFF;
|
57 | }
|
58 |
|
59 | if (centi_sec == SETUP_TIMEOUT) {
|
60 | Mode.bNormal=1;
|
61 | centi_sec=0;
|
62 | GREEN_LED_OFF;
|
63 | }
|
64 | }
|
65 |
|
66 | /* setup state loop */
|
67 | if (Mode.bSetup) {
|
68 | TCNT0=0x3C;
|
69 |
|
70 | if ( (PIND & (1<<GREEN_LED)) ) {
|
71 | GREEN_LED_ON;
|
72 | }
|
73 | else {
|
74 | GREEN_LED_OFF;
|
75 | }
|
76 | }
|
77 |
|
78 | }
|
79 |
|
80 | /* timer1 compare */
|
81 | ISR(TIMER1_COMPB_vect) {
|
82 | SERVO_OFF;
|
83 | OCR1B = ucCompValue;
|
84 | }
|
85 |
|
86 | /* timer1 overflow */
|
87 | ISR(TIMER1_COMPA_vect) {
|
88 | SERVO_ON;
|
89 | OCR1B = ucCompValue;
|
90 | OCR1A = IMPULS_BREAK; //(20ms)
|
91 | }
|
92 |
|
93 |
|
94 | void vFIncreaseServo(void);
|
95 | void vFDecreaseServo(void);
|
96 |
|
97 | int main(void)
|
98 | {
|
99 | /* insert your hardware initialization here */
|
100 | PORTD |= (1<<PD2) | (1<<PD3); //active pull-ups
|
101 | DDRD |= (1<<DDD2) | (1<<DDD3); //pin as output
|
102 |
|
103 | DDRD &= ~( ( 1 << DDD6 ) | ( 1<<DDD7) ); //pin as inputs
|
104 |
|
105 | /* display setting */
|
106 | lcd_init();
|
107 |
|
108 | /* global interrupts on */
|
109 | sei();
|
110 |
|
111 | /* timer0 setting */
|
112 | TCNT0 =0xB1; // timer0 start value (100ms)
|
113 | TIMSK |=(1<<TOIE0); //timer0 overflow interrupt enabled
|
114 | TCCR0 |=(1<<CS00) |(1<<CS02); //timer0 start
|
115 |
|
116 | /* timer1 for PWM (16bit) */
|
117 | /*8 MHz Chip clock, appr. 1° -> 0,004ms per clock */
|
118 | TIMSK |=(1<<OCIE1A) | (1<<OCIE1B); //compare + overflow interr enable
|
119 | OCR1A = IMPULS_BREAK; //(20ms) TOP
|
120 | OCR1B = ucCompValue;
|
121 | TCCR1A = 0x00;
|
122 | TCCR1B |=(1<<CS11) | (1<<WGM12);
|
123 | SERVO_OFF;
|
124 |
|
125 | /* power on state */
|
126 | while(1)
|
127 | {
|
128 | /* wait state */
|
129 | while(!Mode.bNormal)
|
130 | {
|
131 | if ( !(PIND & (1<<BUT_DWN)) ) {
|
132 | TCCR0 =00; // timer0 stop
|
133 | Mode.bSetup =1; //setup state set
|
134 | Mode.bNormal =1; //normal state set
|
135 | TCNT0=0x3C; // new timer0 start value (250ms)
|
136 | TCCR0 |=(1<<CS00) |(1<<CS02); // timer0 start
|
137 | }
|
138 | lcd_string("1");
|
139 | }
|
140 |
|
141 | /* setup state */
|
142 | while(Mode.bSetup)
|
143 | {
|
144 | if ( !(PIND & (1<<BUT_UP)) ) {
|
145 | TCCR0 =00; // timer0 stop
|
146 | Mode.bSetup =0;
|
147 | Mode.bNormal =1;
|
148 | }
|
149 |
|
150 | lcd_string("2");
|
151 | }
|
152 |
|
153 | /* normal state */
|
154 | while(Mode.bNormal)
|
155 | {
|
156 | GREEN_LED_ON;
|
157 | lcd_string("3");
|
158 |
|
159 | if(TCCR1B == 0x00) {
|
160 |
|
161 | }
|
162 |
|
163 | /* increase compare low */
|
164 | if ( !(PIND & (1<<BUT_RI)) ) {
|
165 | vFIncreaseServo();
|
166 | }
|
167 | /* decrease compare low */
|
168 | if ( !(PIND & (1<<BUT_LF)) ) {
|
169 | vFDecreaseServo();
|
170 | }
|
171 |
|
172 | }
|
173 |
|
174 | }
|
175 |
|
176 | set_cursor(0,2);
|
177 | lcd_string("bye");
|
178 | return 0; /* never reached */
|
179 | }
|
180 |
|
181 | void vFIncreaseServo(void) {
|
182 | if(ucCompValue < (2000 - STEPSIZE) )
|
183 | ucCompValue = ucCompValue + STEPSIZE;
|
184 | }
|
185 |
|
186 | void vFDecreaseServo(void) {
|
187 | if(ucCompValue > (1000 + STEPSIZE))
|
188 | ucCompValue = ucCompValue - STEPSIZE;
|
189 | }
|