1 | /*
|
2 | * AVR_Schalter_Attiny13a_nachbau.c
|
3 | *
|
4 | * Created: 01.01.2002 00:59:52
|
5 | * Author: Q
|
6 | */
|
7 |
|
8 |
|
9 | /************************************************************************************/
|
10 | // Schalterfunktionalität an einem Empfänger- RC- Ausgang
|
11 | //
|
12 | // -> erprobt mit ATtiny13
|
13 | //
|
14 | // Version: 0.2
|
15 | //
|
16 | // Datum: 01.02.2010
|
17 | //
|
18 | // Hardware bei ATtiny13 (Taktfrequenz (4,8Mhz, CKDIV8 Vorteiler Fuse gesetzt -> 600kHz):
|
19 | // R/C-Kanal an PB1 (INT0)
|
20 | // Schalt-LED1 an PB3
|
21 | // Schalt-LED2 an PB4
|
22 |
|
23 |
|
24 | /************************************************************************************/
|
25 | // Compiler- Warnungen
|
26 |
|
27 | #ifndef F_CPU
|
28 | #warning "F_CPU not defined"
|
29 | #define F_CPU 600000UL
|
30 | #endif
|
31 |
|
32 | /************************************************************************************/
|
33 | // Libraries
|
34 |
|
35 | #include <avr/io.h>
|
36 | #include <avr/interrupt.h>
|
37 | #include <avr/wdt.h> // für Watchdog- Funktionen
|
38 | #include <stdint.h>
|
39 |
|
40 |
|
41 | /************************************************************************************/
|
42 | // Pin- Belegung
|
43 |
|
44 | #define RC_KanalEingang PINB // Eingangssignal R/C- Empfänger
|
45 | #define RC_KanalPin PINB1 // Pin für Eingangssignal R/C- Empfänger
|
46 |
|
47 |
|
48 |
|
49 | /************************************************************************************/
|
50 | // Variablen
|
51 |
|
52 | static volatile uint8_t Reading; // Bit- Merker zur Sperrung der Hauptroutine während der erneuten Wertermittlung
|
53 | // Merker Flanke
|
54 |
|
55 |
|
56 | static volatile uint8_t RCvalue; // empfangener Wert von R/C- Empfänger -> wird von Timer runtergezählt
|
57 |
|
58 | /************************************************************************************/
|
59 | //Header
|
60 |
|
61 | void RC_Read();
|
62 | void RC_Error();
|
63 |
|
64 | /************************************************************************************/
|
65 | // Interruptroutinen
|
66 |
|
67 | /* ISR für INT0 - R/C-Signal mit Timer lesen */
|
68 | ISR(INT0_vect)
|
69 | {
|
70 | RC_Read();
|
71 | }
|
72 |
|
73 |
|
74 | /************************************************************************************/
|
75 | // Hauptprogramm
|
76 |
|
77 | int main(void)
|
78 | {
|
79 | DDRB |= (1<<PB3); //LED1
|
80 |
|
81 | DDRB |= (1<<PB4); //LED2
|
82 |
|
83 | PORTB |= (1<<PB1);
|
84 |
|
85 |
|
86 |
|
87 |
|
88 | // Initialisierung Interrupteingang INT0
|
89 | MCUCR |= (1<<ISC00); // Interrupt wird bei jedem Pegelwechsel an INT0 ausgelöst
|
90 | GIMSK |= (1<<INT0); // Interrupt INT0 aktivieren
|
91 |
|
92 | // Initialisierung Timer0
|
93 | TIMSK0 |= (1<<TOIE0); // Timer0 Interrupt aktivieren
|
94 |
|
95 | // Initialisierung Watchdog auf 500ms, bedingt #include <avr/wdt.h>
|
96 | wdt_enable(WDTO_500MS);
|
97 |
|
98 |
|
99 |
|
100 |
|
101 | // globale Interrupptfreigabe
|
102 | sei();
|
103 |
|
104 | /***********************************************************************************/
|
105 | while(1)
|
106 | {
|
107 | // Watchdog zurücksetzen
|
108 | wdt_reset();
|
109 |
|
110 |
|
111 |
|
112 | {
|
113 |
|
114 |
|
115 | // LED- Ausgänge schalten, je Timer- Wert -> erprobt mit ATmega8
|
116 |
|
117 |
|
118 |
|
119 | if (RCvalue > 160)
|
120 | {
|
121 | PORTB &= ~(1<<PB3); //LED1 an
|
122 |
|
123 | }
|
124 |
|
125 | else
|
126 | {
|
127 | PORTB |= (1<<PB3);
|
128 | }
|
129 |
|
130 |
|
131 |
|
132 | if ((RCvalue > 100))
|
133 | {
|
134 | PORTB &= ~(1<<PB4); //LED2 an
|
135 | }
|
136 |
|
137 | else
|
138 | {
|
139 | PORTB |= (1<<PB4);
|
140 | }
|
141 |
|
142 |
|
143 |
|
144 |
|
145 |
|
146 |
|
147 |
|
148 |
|
149 | }
|
150 | }
|
151 | }
|
152 |
|
153 | /***********************************************************************************/
|
154 |
|
155 | // ISR für INT0 - R/C-Signal mit Timer lesen
|
156 | void RC_Read()
|
157 | {
|
158 | // Timer starten mit steigender Flanke
|
159 | if(Reading == 0)
|
160 | {
|
161 | TCCR0B |= (1<<CS01); // Start Timer0 mit Vorteiler 8
|
162 | Reading = 1; // Merker Flanke setzten
|
163 | }
|
164 |
|
165 | // Timer stoppen mit fallender Flanke
|
166 | else
|
167 | {
|
168 | TCCR0B = 0x00; // Stop Timer0
|
169 | RCvalue = TCNT0; // Wert von Timer lesen
|
170 | TCNT0 = 0x00; // neuen Startwert für Timer laden
|
171 | Reading = 0; // Merker Flanke setzten
|
172 | }
|
173 |
|
174 |
|
175 | }
|