1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include "lcd-routines.h"
|
4 | #include <stdlib.h>
|
5 |
|
6 | extern void lcd_data(unsigned char temp1);
|
7 | extern void lcd_command(unsigned char temp1);
|
8 | extern void lcd_enable(void);
|
9 | extern void lcd_init(void);
|
10 | extern void lcd_home(void);
|
11 | extern void lcd_clear(void);
|
12 | extern void set_cursor(uint8_t x, uint8_t y);
|
13 | extern void lcd_string(char *data);
|
14 |
|
15 | volatile int i=0;
|
16 | volatile float ms=0;
|
17 |
|
18 | void init_io(void)
|
19 | {
|
20 | DDRD = 0b00010010; //PD4 Ausgang
|
21 | PORTD &=~ (1<<PB1);
|
22 | DDRB = 0;
|
23 | PORTB = 255;
|
24 |
|
25 | }
|
26 |
|
27 | void init_pwm(void)
|
28 | {
|
29 | /* TCCR1B-Registeraufbau ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10
|
30 |
|
31 | CS12 CS11 CS10 Description
|
32 | 0 0 0 No clock source (Timer/Counter stopped).
|
33 | 0 0 1 clkI/O/1 (No prescaling)
|
34 | 0 1 0 clkI/O/8 (From prescaler)
|
35 | 0 1 1 clkI/O/64 (From prescaler)
|
36 | 1 0 0 clkI/O/256 (From prescaler)
|
37 | 1 0 1 clkI/O/1024 (From prescaler)
|
38 |
|
39 | TCCR1A-Registeraufbau COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10
|
40 |
|
41 | COM1A1/COM1B1 COM1A0/COM1B0 Description
|
42 | 0 0 Normal port operation, OC1A/OC1B disconnected.
|
43 | 0 1 WGM13:0 = 15: Toggle OC1A on Compare Match, OC1B disconnected (normal port operation).
|
44 | For all other WGM13:0 settings, normal port operation, OC1A/OC1B disconnected.
|
45 | 1 0 Clear OC1A/OC1B on compare match, set OC1A/OC1B at BOTTOM, (non-inverting mode)
|
46 | 1 1 Set OC1A/OC1B on compare match, clear OC1A/OC1B at BOTTOM, (inverting mode)
|
47 | */
|
48 |
|
49 | TCCR1A |= (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11) | (1<<WGM10); // 10 Bit FastPWM - clear at bottom, set on compare match invertiert
|
50 | TCCR1B |= (1<<WGM12) | (1<<CS11) | (1<<CS10);
|
51 | }
|
52 |
|
53 | void init_timer0(void)
|
54 | {
|
55 | OCR0 = 63; // ((16000000Hz/256)/1000Hz) = 62,5 für 1ms
|
56 | TIMSK = (1<<OCIE0); // enable interrupts on compare match
|
57 | }
|
58 |
|
59 | void activate_timer0(void)
|
60 | {
|
61 | TCCR0 = (1<<WGM01) | (1<<CS02); //prescaler 256; CTC-Mode
|
62 | sei();
|
63 | }
|
64 |
|
65 | void deactivate_timer0(void)
|
66 | {
|
67 | cli();
|
68 | TCCR0 = (0<<CS02) | (0<<CS01) | (0<<CS00); //prescaler 1024; CTC-Mode
|
69 | }
|
70 |
|
71 | void rst_timer0(void)
|
72 | {
|
73 | ms = 0;
|
74 | i = 0;
|
75 | }
|
76 |
|
77 | void ShowTime(void)
|
78 | {
|
79 | unsigned char milliseconds[6];
|
80 | lcd_clear();
|
81 | set_cursor(0,0);
|
82 | ms = ms / 1000;
|
83 | dtostrf(ms, 3,3, milliseconds);
|
84 | lcd_string(milliseconds);
|
85 | }
|
86 |
|
87 | ISR(TIMER0_COMP_vect)
|
88 | {
|
89 | cli();
|
90 | if (i < 50)
|
91 | {
|
92 | i++;
|
93 | }
|
94 | else
|
95 | {
|
96 | ms++;
|
97 | }
|
98 | sei();
|
99 | }
|
100 |
|
101 | int main(void)
|
102 | {
|
103 | init_io();
|
104 | init_pwm();
|
105 | lcd_init();
|
106 | init_timer0();
|
107 | lcd_clear();
|
108 | set_cursor(0,0);
|
109 | sei();
|
110 |
|
111 | while (1)
|
112 | {
|
113 | if ( !(PINB & (1<<PINB0)) )
|
114 | {
|
115 | activate_timer0(); // Timer aktivieren
|
116 | while (i < 50) {} // warten bis Taster vollständig gedrückt - Prellen unterdrücken
|
117 | OCR1B = 1023; // DC 1,0 13,8 V
|
118 | while ( !(PINB & (1<<PINB0)) ) {}
|
119 | deactivate_timer0();
|
120 | OCR1B = 0;
|
121 | ShowTime();
|
122 | rst_timer0();
|
123 | }
|
124 |
|
125 | while ( !(PINB & (1<<PINB2)) )
|
126 | {
|
127 | activate_timer0(); // Timer aktivieren
|
128 | while (i < 50) {} // warten bis Taster vollständig gedrückt - Prellen unterdrücken
|
129 | OCR1B = 819; // DC ~0,8 11,03 V
|
130 | while ( !(PINB & (1<<PINB0)) ) {}
|
131 | deactivate_timer0();
|
132 | ShowTime();
|
133 | rst_timer0();
|
134 | }
|
135 |
|
136 | while ( !(PINB & (1<<PINB4)) )
|
137 | {
|
138 | activate_timer0(); // Timer aktivieren
|
139 | while (i < 50) {} // warten bis Taster vollständig gedrückt - Prellen unterdrücken
|
140 | OCR1B = 615; // DC ~0,6 8,29 V
|
141 | while ( !(PINB & (1<<PINB0)) ) {}
|
142 | deactivate_timer0();
|
143 | ShowTime();
|
144 | rst_timer0();
|
145 | }
|
146 |
|
147 | while ( !(PINB & (1<<PINB6)) )
|
148 | {
|
149 | activate_timer0(); // Timer aktivieren
|
150 | while (i < 50) {} // warten bis Taster vollständig gedrückt - Prellen unterdrücken
|
151 | OCR1B = 411; // DC ~0,4 5,54 V
|
152 | while ( !(PINB & (1<<PINB0)) ) {}
|
153 | deactivate_timer0();
|
154 | ShowTime();
|
155 | rst_timer0();
|
156 | }
|
157 |
|
158 | while ( !(PINB & (1<<PINB1)) )
|
159 | {
|
160 | activate_timer0(); // Timer aktivieren
|
161 | while (i < 50) {} // warten bis Taster vollständig gedrückt - Prellen unterdrücken
|
162 | OCR1B = 207; // DC ~0,2 2,79 V
|
163 | while ( !(PINB & (1<<PINB0)) ) {}
|
164 | deactivate_timer0();
|
165 | ShowTime();
|
166 | rst_timer0();
|
167 | }
|
168 |
|
169 | OCR1B = 0;
|
170 | }
|
171 | return 0;
|
172 | }
|