1 | /*
|
2 | * 1WallSwitch_RS485.c
|
3 | *
|
4 | * Created: 27.02.2017 08:15:42
|
5 | * Author : Mitch
|
6 | */
|
7 |
|
8 | #include <avr/io.h>
|
9 | #include <avr/sleep.h>
|
10 | #include <avr/power.h>
|
11 | #include <avr/wdt.h>
|
12 | #include <avr/interrupt.h>
|
13 | #include <stdint.h>
|
14 | #include <string.h>
|
15 | #include "EEPROM.h"
|
16 |
|
17 | #define F_CPU 8000000UL
|
18 | #include <util/delay.h>
|
19 |
|
20 | #define DEVICE 1
|
21 |
|
22 | #define BAUDRATE 19200UL
|
23 | #define USAR_BAUD_CALC 25 //8000000 / (16*19200)
|
24 |
|
25 | #define LOW(x) ((x) & 0xFF) //LOWBYTE
|
26 | #define HIGH(x) (((x) >> 8) & 0xFF) //HIGHBYTE
|
27 |
|
28 | //RF24 radio(8,7);
|
29 |
|
30 | volatile uint8_t fourBtn = 0, initBtn =0;
|
31 | volatile uint8_t WDT_count = 0;
|
32 | volatile uint64_t Zeitstempel = 0;
|
33 | volatile uint8_t id = 0;
|
34 | volatile uint8_t timer_1s = 0;
|
35 | volatile uint8_t timer_3s = 0;
|
36 |
|
37 | //Für Spannungsüberwachung
|
38 | volatile uint8_t adc_low, adc_high; //Zwischenspeicher für die Ergebnisse des ADC
|
39 | volatile uint64_t adc_result, vcc; //adc_result Gesamtergebnis der Messung des ADC //VCC Versorgungsspannung
|
40 |
|
41 | const uint64_t addresses[2] = {0xF0F0F0F002LL,0xE101000000LL};
|
42 |
|
43 | char *sendByte[20];
|
44 | volatile char recByte[10];
|
45 |
|
46 | void rs485_putc(unsigned char c){
|
47 | while (!(UCSR0A & (1<<UDRE0))) /* warten bis Senden moeglich */
|
48 | {
|
49 | }
|
50 |
|
51 | UDR0 = c; /* sende Zeichen */
|
52 | //return 0;
|
53 | }
|
54 |
|
55 | void rs485_puts(char *s, unsigned int len){
|
56 | while (*s)
|
57 | { /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
|
58 | rs485_putc(*s);
|
59 | s++;
|
60 | //_delay_ms(200);
|
61 | }
|
62 | }
|
63 |
|
64 | void rs485_putAddr(uint8_t data){
|
65 | UCSR0B |= (1<<TXB80);
|
66 | // _delay_ms(10);
|
67 | rs485_putc(data);
|
68 | //rs485_putc('\n');
|
69 | // _delay_ms(10);
|
70 | UCSR0B &= ~(1<<TXB80);
|
71 | }
|
72 |
|
73 | void config_timer(){
|
74 | //16Bit Timer1
|
75 | OCR1A = 31250;
|
76 | TCCR1B = (1<<CS12) | (1<<WGM12);
|
77 | TIMSK1 = (1<<OCIE1A);
|
78 | }
|
79 |
|
80 | void config_interrupt(){
|
81 | //PinChange Interrupt
|
82 | PCMSK1 |= (1<<PCINT11)|(1<<PCINT10)|(1<<PCINT9)|(1<<PCINT8); //4 Taster PC0,PC1,PC2,PC3
|
83 | PCICR |= (1<<PCIE1);
|
84 |
|
85 | //PinChange Interrupt PD4 (InitTaster)
|
86 | PCMSK2 |= (1<<PCINT20);
|
87 | PCICR |= (1<<PCIE2);
|
88 | }
|
89 |
|
90 | void config_rs485(){
|
91 | UBRR0H = HIGH(USAR_BAUD_CALC);
|
92 | UBRR0L = LOW(USAR_BAUD_CALC);
|
93 |
|
94 | //Bei Slave mit Adresse
|
95 | // UCSR0A = (1<<MPCM0); //Adressüberprüfung... dann 9Bit Modus
|
96 |
|
97 | //Character
|
98 | UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0); //RX Enable, TX Enable, Empfangsinterrupts erlauben , UCSZ02 und UCSZ01 und 2aus UCSR0C = 9n1 ...(1<<RXCIE0)
|
99 | UCSR0C = (1<<UCSZ00) | (1<<UCSZ01); //8n1
|
100 | }
|
101 |
|
102 | ISR(PCINT1_vect){ //4Taster
|
103 | fourBtn = 1;
|
104 | }
|
105 |
|
106 | ISR(PCINT2_vect){ //InitTaster
|
107 | initBtn = 1;
|
108 | }
|
109 |
|
110 | ISR(TIMER1_COMPA_vect){
|
111 | timer_1s = 1;
|
112 | timer_3s++;
|
113 | }
|
114 |
|
115 | int main(void){
|
116 | DDRC |= (1<<DDC4)|(1<<DDC5); //PC4 & PC5 als Ausgang für LEDs(Tasterleds)
|
117 | DDRD |= (1<<DDD2)|(1<<DDD3)|(1<<DDD5); //PD2 & PD3 als Ausgang für LEDs(Tasterleds), PD5 StatusLed
|
118 | DDRB |= (1<<DDB2);//PB1 als Ausgang Ansteuerung für RS485
|
119 |
|
120 | config_timer();
|
121 | config_interrupt();
|
122 | config_rs485();
|
123 | sei();
|
124 |
|
125 | //ADC abschalten, verbraucht dann noch weniger
|
126 | ADCSRA = 0;
|
127 |
|
128 | //Für Batterieüberwachung
|
129 | ADMUX |= (1<<REFS0); //VCC als Referenzspannung f?r den AD-Wandler
|
130 | ADMUX |= (1<<MUX3) | (1<<MUX2) | (1<<MUX1); //1.1V Referenzspannung als Eingang f?r ADC
|
131 |
|
132 | _delay_ms(10); //warten bis sich die Referenzspannung eingestellt hat
|
133 |
|
134 | sendByte[0] = 1;//DEVICE; //Modus
|
135 | sendByte[1] = 2;//EEPROM_read(0); ; //lese ID aus EEPROM
|
136 | sendByte[2] = 5;//EEPROM_read(1);
|
137 | sendByte[3] = 6;//EEPROM_read(2);
|
138 | sendByte[4] = 7;//EEPROM_read(3);
|
139 | sendByte[5] = 8; //CRC
|
140 | sendByte[6] = 9; //BAT
|
141 | sendByte[7] = 10; //STATUS
|
142 | sendByte[8] = 11; //STATUS
|
143 | sendByte[19] = 0; //STATUS
|
144 | for(uint8_t i=9; i<19; i++){
|
145 | sendByte[i] = 0xF1; //DATA i
|
146 | }
|
147 |
|
148 | while(1){
|
149 | if(fourBtn == 1){ //wenn einer der 4Taster gedrückt
|
150 | if(PINC & (1<<PINC0)){ //Btn 1 gedrückt
|
151 | _delay_ms(60);
|
152 | PORTC |= (1<<PORTC4);
|
153 | _delay_ms(60);
|
154 | PORTC &= ~(1<<PORTC4);
|
155 |
|
156 | sendByte[8] = 0x01;
|
157 | char *test = "1234567";
|
158 |
|
159 | // rs485_putAddr(0x42);
|
160 | rs485_puts(test,sizeof(test));
|
161 | //uart_putstring("\r\n");
|
162 | //uart_putstring(test);
|
163 | //_delay_ms(100);
|
164 | }
|
165 | if(PINC & (1<<PINC1)){ //Btn 2 gedrückt
|
166 | PORTC |= (1<<PORTC5);
|
167 | _delay_ms(100);
|
168 | PORTC &= ~(1<<PORTC5);
|
169 |
|
170 | // sendByte[8] = 0x02;
|
171 |
|
172 | rs485_putAddr(0x42);
|
173 | rs485_puts(sendByte,sizeof(sendByte));
|
174 |
|
175 | //_delay_ms(100);
|
176 | }
|
177 | if(PINC & (1<<PINC2)){ //Btn 3 gedrückt
|
178 | PORTD |= (1<<PORTD2);
|
179 | _delay_ms(100);
|
180 | PORTD &= ~(1<<PORTD2);
|
181 |
|
182 | // sendByte[8] = 0x03;
|
183 |
|
184 | rs485_putAddr(0x42);
|
185 | rs485_puts(sendByte,sizeof(sendByte));
|
186 |
|
187 | //_delay_ms(100);
|
188 | }
|
189 | if(PINC & (1<<PINC3)){ //Btn 4 gedrückt
|
190 | PORTD |= (1<<PORTD3);
|
191 | _delay_ms(100);
|
192 | PORTD &= ~(1<<PORTD3);
|
193 |
|
194 | //sendByte[8] = 0x04;
|
195 |
|
196 | rs485_putAddr(0x42);
|
197 | rs485_puts(sendByte,sizeof(sendByte));
|
198 |
|
199 | //_delay_ms(100);
|
200 | }
|
201 | fourBtn = 0;
|
202 | //sendByte[8] = 0x00;
|
203 |
|
204 | //rs485_putAddr(0x42);
|
205 | //rs485_puts(sendByte);
|
206 | }
|
207 | //Initialisierung
|
208 | if(initBtn == 1){
|
209 | timer_3s = 0;
|
210 | while(PIND & (1<<PIND4)){ //InitBtn gedrückt
|
211 | PORTD |= (1<<PORTD5);
|
212 | if(timer_3s == 3){ //3sekunden gedrückt
|
213 | for(int i=0; i<5; i++){
|
214 | PORTD &= ~(1<<PORTD5);
|
215 | _delay_ms(100);
|
216 | PORTD |= (1<<PORTD5);
|
217 | _delay_ms(100);
|
218 | }
|
219 |
|
220 | }
|
221 | }
|
222 | PORTD &= ~(1<<PORTD5);
|
223 | initBtn = 0;
|
224 | }
|
225 | }
|
226 | }
|