1 | #define F_CPU 16000000UL // Angabe der Quarzfrequenz, wichtig für die Zeit
|
2 | #include <avr/io.h> // Einbindung Datein
|
3 | #include <avr/interrupt.h>
|
4 | #include <stdint.h>
|
5 | #include <util/delay.h>
|
6 | #include <stdbool.h>
|
7 | #include <avr/pgmspace.h>
|
8 | #include "main.h"
|
9 | #include "i2clcd.h"
|
10 | #include "i2cmaster.h"
|
11 | #include <stdlib.h>
|
12 |
|
13 | #define PCF8591w 0x90
|
14 | #define PCF8591r 0x91
|
15 |
|
16 | volatile int16_t led1=0;
|
17 | volatile int8_t lauf=0;
|
18 | volatile int8_t anz=123;
|
19 | char Buffer[20];
|
20 | ///////////////////////////////////////////////////////
|
21 | volatile int8_t wait;
|
22 | volatile int8_t flag_1ms;
|
23 | volatile uint8_t key_state;
|
24 | volatile uint8_t key_press;
|
25 | volatile uint8_t key_rpt;
|
26 | //////////////////////////////////////////////////////
|
27 | #define KEY_DDR DDRA // Datenrichtung A
|
28 | #define KEY_PORT PORTA // Angabe Port A
|
29 | #define KEY_PIN PINA // Angabe PIN A
|
30 | #define KEY_1 3 // PA 3
|
31 | #define KEY_2 5 // PA 5
|
32 | #define KEY_3 7 // PA 7
|
33 | #define ALL_KEYS (1<<KEY_1|1<<KEY_2|1<<KEY_3)
|
34 | #define REPEAT_MASK (1<<KEY_1|1<<KEY_2)
|
35 | #define REPEAT_START 50 // after 500ms
|
36 | #define REPEAT_NEXT 20 // every 200ms
|
37 | ///////////////////////////////////////////////////
|
38 | void startanzeige() // Titelbild
|
39 | {
|
40 | lcd_command(LCD_CLEAR);
|
41 | _delay_ms(2);
|
42 | lcd_printlc(1,2,"Versuch1n-I2C");
|
43 | lcd_printlc(2,2,"P30 + P64 + D2");
|
44 | lcd_printlc(3,2,"AT1284 und LCD");
|
45 | lcd_printlc(4,4,"bei achim S");
|
46 | //_delay_ms(2000);
|
47 | }
|
48 | //////////////////////////////////////////////////
|
49 |
|
50 |
|
51 | /////////////////////////////////////////////////////
|
52 | ISR (TIMER0_COMPA_vect) // wait1=1ms,
|
53 | {
|
54 | static uint8_t ct0,ct1,rpt;
|
55 | uint8_t i;
|
56 | //if (flag_1ms)
|
57 | //{
|
58 | // Laufzeit der Tasks >2ms, Fehlersignalisierung auf PA6, Programm stoppen
|
59 | //PORTA &= ~(1<<PA6); // Schaltet Pin
|
60 | //while(1); // Endlosschleife, stoppt Programm
|
61 | //}
|
62 | flag_1ms=1;
|
63 | if(wait<=9) // bei 9 sind es 10ms
|
64 | {
|
65 | wait++;
|
66 | } // erhöht
|
67 | else // wenn dann ...
|
68 | {
|
69 | wait=0; // setzt wait auf 0
|
70 | i=key_state ^~KEY_PIN;
|
71 | ct0=~(ct0&i);
|
72 | ct1=ct0^(ct1&i);
|
73 | i&=ct0&ct1;
|
74 | key_state^=i;
|
75 | key_press|=key_state&i;
|
76 | if((key_state & REPEAT_MASK)==0)
|
77 | rpt=REPEAT_START;
|
78 | if(--rpt==0)
|
79 | {
|
80 | rpt=REPEAT_NEXT;
|
81 | key_rpt|=key_state & REPEAT_MASK;
|
82 | }
|
83 | }
|
84 | }
|
85 | //////////////////////////////////////////////////////
|
86 | uint8_t get_key_press(uint8_t key_mask)
|
87 | {
|
88 | cli();
|
89 | key_mask &=key_press;
|
90 | key_press^=key_mask;
|
91 | sei();
|
92 | return key_mask;
|
93 | }
|
94 | /////////////////////////////////////////
|
95 | uint8_t get_key_rpt(uint8_t key_mask)
|
96 | {
|
97 | cli();
|
98 | key_mask &=key_rpt;
|
99 | key_rpt^=key_mask;
|
100 | sei();
|
101 | return key_mask;
|
102 | }
|
103 | ///////////////////////////////////////////////////////
|
104 | uint8_t get_key_short(uint8_t key_mask)
|
105 | {
|
106 | cli();
|
107 | return get_key_press(~key_state & key_mask);
|
108 | }
|
109 | ///////////////////////////////////////////////////////
|
110 | uint8_t get_key_long(uint8_t key_mask)
|
111 | {
|
112 | return get_key_press(get_key_rpt(key_mask));
|
113 | }
|
114 | //////////////////////////////////////////////////////
|
115 | void led_blinken1()
|
116 | {
|
117 | led1++;
|
118 | if(led1==500)
|
119 | {
|
120 | PORTA &= ~(1<<PA2); // Schaltet Pin
|
121 | }
|
122 | else
|
123 | {
|
124 | if(led1==1000)
|
125 | {
|
126 | PORTA |= (1<<PA2); // Schaltet Pin
|
127 | led1=0;
|
128 | }
|
129 | }
|
130 | }
|
131 |
|
132 | //////////////////////////////////////////////////////
|
133 | void anzeige()
|
134 | {
|
135 | lauf++;
|
136 | if(lauf==50)
|
137 | {
|
138 |
|
139 | itoa( anz, Buffer, 10 ); // Zeile 1
|
140 | lcd_printlc(3,1,"Wert ");
|
141 | lcd_printlc(3,9,Buffer);
|
142 |
|
143 | lauf=0;
|
144 |
|
145 | }
|
146 |
|
147 | /////////////////////////////////////////////////////
|
148 | void timer_init()
|
149 | { // Timer 0 konfigurieren
|
150 | TCCR0A = 0; // CTC Modus
|
151 | TCCR0B = (1<<WGM01)|(1<<CS01)|(1<<CS00); // Prescaler 64
|
152 | TCNT0=1;
|
153 | OCR0A=249;
|
154 | TIMSK0|=(1<<OCIE0A); // Interrupt erlauben
|
155 | }
|
156 | ////////////////////////////////////////////////////
|
157 | int main(void)
|
158 | {
|
159 | timer_init();
|
160 |
|
161 | DDRA=0b00000100; // Port A 1x auf Ausgang schalten
|
162 | DDRC=0b01100000; // Port C 2x auf Ausgang schalten
|
163 |
|
164 | KEY_DDR&=~ALL_KEYS;
|
165 | KEY_PORT|=ALL_KEYS;
|
166 |
|
167 | PORTC |= (1<<PC5); // Port A beim einschalten Ausgänge aus
|
168 | PORTC |= (1<<PC6);
|
169 |
|
170 | //char Buffer[20];
|
171 | i2c_init(); // Starte I2C Bus
|
172 | lcd_init(); // Starte I2CLCD
|
173 | lcd_light(0); // 0=Licht an, 1=Licht aus
|
174 | // Display Befehle
|
175 | lcd_command(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF);
|
176 | // Display ON/OFF / Cursor ON/OFF / Blinken ON/OFF
|
177 | startanzeige();
|
178 |
|
179 | _delay_ms(5000);
|
180 |
|
181 |
|
182 | lcd_command(LCD_CLEAR); // Leere Display
|
183 | _delay_ms(2); // warte 2ms
|
184 |
|
185 | sei();
|
186 |
|
187 |
|
188 | while(1) // Programmschleife
|
189 | {
|
190 | if(flag_1ms)
|
191 | {
|
192 | flag_1ms=0;
|
193 | led_blinken1(); // Aufruf Unterprogramm
|
194 | }
|
195 | ////////////////////////////// Test mit delay
|
196 | // _delay_ms(2);
|
197 | //////////////////////////////
|
198 |
|
199 | if(get_key_press(1<<KEY_2)) // nur Taste press
|
200 | { // LED an
|
201 | PORTC &= ~(1<<PC5);
|
202 | }
|
203 |
|
204 | if(get_key_press(1<<KEY_3)) // nur Taste press
|
205 | { // LED aus
|
206 | PORTC |= (1<<PC5);
|
207 | }
|
208 |
|
209 | if(get_key_short(1<<KEY_1)) // kurz schalten immer zusammen mit long
|
210 | {
|
211 | PORTC &= ~(1<<PC6); // LED an
|
212 | }
|
213 |
|
214 | if(get_key_long(1<<KEY_1)) // Lang schalten immer mit short
|
215 | {
|
216 | PORTC |= (1<<PC6); // LED aus
|
217 | }
|
218 |
|
219 | anzeige();
|
220 |
|
221 | _delay_ms(1);
|
222 |
|
223 | }
|
224 | }
|