From 4a9572c40fde82ca106253cd1239a241fff034c6 Mon Sep 17 00:00:00 2001 From: Jochen Friedrich Date: Sun, 18 Feb 2018 20:16:33 +0000 Subject: [PATCH] Initial commit --- .gitignore | 5 + Makefile | 28 +++ alarmhw.h | 7 + alarmnode.c | 130 +++++++++++++ hbw.c | 492 +++++++++++++++++++++++++++++++++++++++++++++++ hbw.h | 19 ++ hbw_el_alarm.xml | 34 ++++ hbw_el_relay.xml | 90 +++++++++ hbw_el_test.xml | 89 +++++++++ hw.h | 46 +++++ relaishw.h | 7 + relaisnode.c | 174 +++++++++++++++++ testhw.h | 23 +++ testnode.c | 77 ++++++++ 14 files changed, 1221 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 alarmhw.h create mode 100644 alarmnode.c create mode 100644 hbw.c create mode 100644 hbw.h create mode 100644 hbw_el_alarm.xml create mode 100644 hbw_el_relay.xml create mode 100644 hbw_el_test.xml create mode 100644 hw.h create mode 100644 relaishw.h create mode 100644 relaisnode.c create mode 100644 testhw.h create mode 100644 testnode.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8956788 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.hex +*.lst +*.elf +*.o +*.map diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d496156 --- /dev/null +++ b/Makefile @@ -0,0 +1,28 @@ +PROJ = avr-eb +CC = avr-gcc +OBJCOPY = avr-objcopy +CPU = atmega88 + +CFLAGS += -Os -g -mmcu=$(CPU) -Wall +CFLAGS += -Wa,-adhlns=$(<:%.c=%.lst) + +CLDFLAGS += -mmcu=$(CPU) -Wl,-Map=$(@:%.elf=%.map) + +TESTOBJS += testnode.o testhbw.o + +all: testnode.hex + +testnode.o: testnode.c hbw.h hw.h testhw.h + $(CC) $(CFLAGS) -DTESTNODE -c $< -o $@ + +testhbw.o: hbw.c hbw.h hw.h testhw.h + $(CC) $(CFLAGS) -DTESTNODE -c $< -o $@ + +testnode.elf: $(TESTOBJS) + $(CC) $(CLDFLAGS) -o $@ $(TESTOBJS) + +%hex:%elf + $(OBJCOPY) -j .text -j .data -O srec $< $@ + +clean: + rm -f *.hex *.elf *.o *.lst *.map diff --git a/alarmhw.h b/alarmhw.h new file mode 100644 index 0000000..05dbe66 --- /dev/null +++ b/alarmhw.h @@ -0,0 +1,7 @@ +#ifndef __ALARMHW_H__ +#define __ALARMHW_H__ +#define RedLED PD4 +#define GreenLED PD5 +#define BuzzerON PD6 +#define ReedSwitch PD7 +#endif diff --git a/alarmnode.c b/alarmnode.c new file mode 100644 index 0000000..b6f8338 --- /dev/null +++ b/alarmnode.c @@ -0,0 +1,130 @@ +#include +#include +#include +#include "alarmhw.h" +#include "rs485.h" +#include "eb.h" + +uint8_t reedstate; +uint8_t buzzerstate; + +uint8_t waitforack; +uint8_t waitforsend; +uint8_t acktimer; + +int main(void) +{ + uint8_t i; + + init_rs485(); + DDRD |= (1< 1) && (rchannel < 6))) { + ADMUX = (ADMUX & ~(0x1F)) | (rchannel - 2); + ADCSRA |= (1< +#include +#include +#include +#include +#include "hbw.h" + +uint8_t my_address[4]; + +uint8_t rind; +uint16_t rcrc; +uint8_t raddress[4]; +uint8_t rdest[4]; +uint8_t resc; +uint8_t rctl; +volatile uint8_t rready; +uint8_t rmessage[62]; +uint8_t rlen; + +uint8_t sind; +uint8_t sdisc; +uint8_t sctl; +uint16_t scrc; +uint8_t sesc; +uint8_t saddress[4]; +uint8_t slen; +uint8_t smessage[62]; + +uint16_t sdelay; + +uint8_t asent; +uint8_t waitack; +uint8_t gotack; + +static uint16_t crc16shift(uint16_t crc, uint8_t data) +{ + int stat, i; + + for (i=0; i<8; i++) { + stat = crc & 0x8000; + crc = crc << 1; + if (data & 0x80) + crc = crc | 1; + + if (stat) + crc = crc ^ 0x1002; + + data = data << 1; + } + return crc; +} + +static void readaddr(void) +{ + my_address[0]=eeprom_read_byte((const uint8_t *)EESIZE-4); + my_address[1]=eeprom_read_byte((const uint8_t *)EESIZE-3); + my_address[2]=eeprom_read_byte((const uint8_t *)EESIZE-2); + my_address[3]=eeprom_read_byte((const uint8_t *)EESIZE-1); + + if ((my_address[0] == 0xFF) && + (my_address[1] == 0xFF) && + (my_address[2] == 0xFF) && + (my_address[3] == 0xFF)) + my_address[0] = 0x42; +} + +static void send(uint8_t i,uint8_t crc) +{ + if (bit_is_set(UCSR0A, UDRE0)) { + if (sesc) { + UDR0 = i & 0x7F; + sind++; + sesc = 0; + return; + } + if (crc == 1) { + scrc = crc16shift(scrc, i); + } + if (crc == 2) { + scrc = crc16shift(scrc, 0); + scrc = crc16shift(scrc, 0); + i = (scrc >> 8) & 0xFF; + } + if ((i == 0xFD) || (i == 0xFC) || (i == 0xFE)) { + UDR0 = 0xFC; + sesc = 1; + return; + } + UDR0 = i; + sind++; + } +} + +void rloop(void) +{ + if (!sind) + return; + + if (sdisc) { + if (sind == 1) { + send(0x04,1); + return; + } + if (sind == 2) { + send(0x01,1); + return; + } + if (sind == 3) { + send((scrc >> 8) & 0xFF,2); + return; + } + if (sind == 4) { + send(scrc & 0xFF,0); + return; + } + if (bit_is_set(UCSR0A, TXC0)) { + PORTD &= ~(1<> 8) & 0xFF,2); + return; + } + if (sind == slen+12) { + send(scrc & 0xFF,0); + return; + } + if (bit_is_set(UCSR0A, TXC0)) { + PORTD &= ~(1< 0x7FFF) + return 1; + return 0; +} + +static void announce(void) +{ + sctl = 0xF8; + + saddress[0] = 0xFF; + saddress[1] = 0xFF; + saddress[2] = 0xFF; + saddress[3] = 0xFF; + + slen = 16; + + smessage[0] = 0x41; + smessage[1] = 0; + smessage[2] = HBWTYPE; + smessage[3] = 0; + smessage[4] = HBWMAJOR; + smessage[5] = HBWMINOR; + smessage[6] = HBWSERIAL0; + smessage[7] = HBWSERIAL1; + smessage[8] = HBWSERIAL2; + smessage[9] = HBWSERIAL3; + smessage[10] = HBWSERIAL4; + smessage[11] = HBWSERIAL5; + smessage[12] = HBWSERIAL6; + smessage[13] = HBWSERIAL7; + smessage[14] = HBWSERIAL8; + smessage[15] = HBWSERIAL9; + sendmsg(); + + asent = 1; +} + +void hbw_init(void) +{ + DDRD |= (1<> 1) & 3; + + switch (rmessage[0]) { + case '@': + if (rmessage[1] == 'a') { + eeprom_write_byte((uint8_t *)EESIZE-4, rmessage[2]); + eeprom_write_byte((uint8_t *)EESIZE-3, rmessage[3]); + eeprom_write_byte((uint8_t *)EESIZE-2, rmessage[4]); + eeprom_write_byte((uint8_t *)EESIZE-1, rmessage[5]); + + readaddr(); + } + slen = 0; + sctl = 0x19 | (seq << 5); + sendmsg(); + break; + case 'h': + smessage[0] = HBWTYPE; + smessage[1] = 0; + slen = 2; + sctl = 0x18 | (seq << 5); + sendmsg(); + break; + case 'n': + smessage[0] = HBWSERIAL0; + smessage[1] = HBWSERIAL1; + smessage[2] = HBWSERIAL2; + smessage[3] = HBWSERIAL3; + smessage[4] = HBWSERIAL4; + smessage[5] = HBWSERIAL5; + smessage[6] = HBWSERIAL6; + smessage[7] = HBWSERIAL7; + smessage[8] = HBWSERIAL8; + smessage[9] = HBWSERIAL9; + slen = 10; + seq = (rctl >> 1) & 3; + sctl = 0x18 | (seq << 5); + sendmsg(); + break; + case 'v': + smessage[0] = HBWMAJOR; + smessage[1] = HBWMINOR; + slen = 2; + seq = (rctl >> 1) & 3; + sctl = 0x18 | (seq << 5); + sendmsg(); + break; + case 'R': + addr = (rmessage[1] >> 8) | rmessage[2]; + for (i = 0; i < rmessage[3]; i++) + smessage[i] = eeprom_read_byte((const uint8_t *)addr+i); + slen = rmessage[3]; + seq = (rctl >> 1) & 3; + sctl = 0x18 | (seq << 5); + sendmsg(); + break; + case 'W': + addr = (rmessage[1] >> 8) | rmessage[2]; + for (i = 0; i < rmessage[3]; i++) + eeprom_write_byte((uint8_t *)addr+i, rmessage[4+i]); + slen = 0; + sctl = 0x19 | (seq << 5); + sendmsg(); + break; + case 'x': + case 's': + hbw_set_channel(rmessage[1], rlen - 2, &(rmessage[2])); + case 'S': + smessage[0] = 'i'; + smessage[1] = rmessage[1]; + slen = hbw_get_channel(rmessage[1], &(smessage[2])) + 2; + seq = (rctl >> 1) & 3; + sctl = 0x18 | (seq << 5); + sendmsg(); + break; + case 'C': + slen = 0; + sctl = 0x19 | (seq << 5); + sendmsg(); + break; + } + } +} + +void hbw_loop(void) +{ + rloop(); + if (rready) { + process(); + rready = 0; + } + if (!asent) { + if (is_bus_free()) { + announce(); + } + } +} + +uint8_t hbw_send_channel(uint8_t channel, uint8_t length, uint8_t const * const data, uint32_t target_address) +{ + if (gotack) { + gotack = 0; + return 1; + } + + if (!is_bus_free()) + return 0; + + if (waitack) + return 0; + + slen = length + 2; + sctl = 0xF8; + saddress[0] = eeprom_read_byte((const uint8_t *)2); + saddress[1] = eeprom_read_byte((const uint8_t *)3); + saddress[2] = eeprom_read_byte((const uint8_t *)4); + saddress[3] = eeprom_read_byte((const uint8_t *)5); + smessage[0] = 'i'; + smessage[1] = channel; + memcpy(&(smessage[2]), data, length); + sendmsg(); + waitack = 1; + gotack = 0; + return 0; +} + +ISR(USART_RX_vect) +{ + uint8_t c; + + sdelay = hbw_timer + 100 + (rand() & 0x1F); + + c = UDR0; + if (c == 0xFE) { + rind = 255; + resc = 0; + } + if (c == 0xFD) { + rind = 0; + resc = 0; + rready = 0; + rcrc =0xFFFF; + } + if (rind < 255) { + if (c == 0xFC) { + resc = 1; + return; + } + if (resc) + c = c | 0x80; + rcrc = crc16shift(rcrc, c); + resc = 0; + rind++; + } + if ((rind == 1) || (rind == 255)) + return; + if (rind < 6) { + rdest[rind-2] = c; + return; + } + if (rind == 6) { + rctl = c; + return; + } + if (rind < 11) { + raddress[rind-7] = c; + return; + } + if (rind == 11) { + rlen = c; + return; + } + if ((rlen < 2) || (rlen > 64)) { + rind = 255; + return; + } + if ((rind < rlen + 10)) { + rmessage[rind-12] = c; + return; + } + if (rind == rlen + 10) + return; + if (rind == rlen + 11) { + rind = 255; + if (rcrc) + return; + rready = 1; + return; + } +} + + +ISR(TIMER2_COMPA_vect) +{ + cli(); + hbw_timer++; + sei(); +} diff --git a/hbw.h b/hbw.h new file mode 100644 index 0000000..f2d6f75 --- /dev/null +++ b/hbw.h @@ -0,0 +1,19 @@ +#ifndef __HBW_H__ +#define __HBW_H__ + +#define BAUDRATE 19200L + +uint8_t hbw_rmessage[62]; +uint8_t hbw_rlen; + +uint8_t hbw_slen; +uint8_t hbw_smessage[62]; + +volatile uint16_t hbw_timer; + +void hbw_loop(void); +uint8_t hbw_send_channel(uint8_t channel, uint8_t length, uint8_t const * const data, uint32_t target_address); +void hbw_init(void); +uint8_t hbw_get_channel(uint8_t channel, uint8_t data[]); +void hbw_set_channel(uint8_t channel, uint8_t len, uint8_t data[]); +#endif diff --git a/hbw_el_alarm.xml b/hbw_el_alarm.xml new file mode 100644 index 0000000..25064d0 --- /dev/null +++ b/hbw_el_alarm.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + +
+ + + +