Embedded-System fΓΌr Hausautomatisierung basierend auf RS485-Kommunikation und PIC16F946 Mikrocontroller. Das System ermΓΆglicht die zentrale Steuerung und Γberwachung von I/O-Funktionen ΓΌber ein serielles Busprotokoll.
Die multiIO-Platine basiert auf dem PIC16F946 Mikrocontroller und bietet eine vollstΓ€ndige I/O-LΓΆsung fΓΌr Hausautomatisierung:
- IC1: PIC16F946 - 64-Pin Mikrocontroller
- 8K words (14-Bit) Flash-Speicher, 368 Bytes RAM, 256B EEPROM
- Interner Oszillator mit prΓ€ziser OSCTUNE-Kalibrierung (7.3-8.3 MHz)
- UnterstΓΌtzt 38.4k/57.6k/115.2k bps durch Frequenzanpassung
- Alle 16 AusgΓ€nge und 16 EingΓ€nge voll ausgenutzt
- IC2: MAX487CSA - RS485 Transceiver
- Half-Duplex RS485 Kommunikation
- Differentielle SignalΓΌbertragung Β±7V
- Automatic Direction Control ΓΌber DE/RE-Pins
- IC8: MAX232ACSE - RS232 Interface (optional)
- ZusΓ€tzliche serielle Schnittstelle fΓΌr Debugging/Konfiguration
- Spannungswandlung Β±12V fΓΌr RS232-Pegel
- IC3/IC4: 2Γ VN808CM-E - 8-Kanal High-Side Schalter
- Intelligente Power-Switches fΓΌr 16 AusgΓ€nge (O1.0-O1.7, O2.0-O2.7)
- Integrierte Schutzfunktionen: Γbertemperatur, Kurzschluss, Γberstrom
- Status-Feedback ΓΌber STATUS1/STATUS2-Pins
- Bis zu 1A pro Kanal bei 12-48V Betriebsspannung
- 16Γ TLP280-4: Optokoppler fΓΌr galvanische Trennung
- 4-Kanal Optokoppler-Arrays (TLP280-4)
- Eingangsspannungsbereich: 12-24V DC
- 2,5kV Isolationsspannung
- Pull-up WiderstΓ€nde 47kΞ© fΓΌr sichere Schaltschwellen
- IC6: 74HC4017 - Dezimal-ZΓ€hler/Demultiplexer
- IC5: ULN2003AD - 7-Kanal Darlington-Array
- Matrixabtastung der 16 EingΓ€nge ΓΌber COL0-COL9 Spalten
- Reduziert Pin-Bedarf des Mikrocontrollers
- IC9: MC34063A - Step-Down Switching Regulator
- Eingangsspannung: 7-35V DC
- Ausgangsspannung: 5V fΓΌr Mikrocontroller-Logik
- Hocheffiziente Schaltregler-Topologie
- F1-F8: Sicherungen fΓΌr alle Aus- und EingΓ€nge
- D1-D4: Schutzdioden gegen Verpolung und Γberspannung
- EntstΓΆrung: 100nF Kondensatoren an allen kritischen Knoten
- VollstΓ€ndige Optoisolierung aller 16 EingΓ€nge
- Getrennte Massepotentiale (GNDA fΓΌr Analogteil)
- X1, X8: FK-MPT 10-polige Federkraftklemmen fΓΌr I/O
- X2: FK-MPT 2-polige Klemme fΓΌr RS485-Bus
- X3, X4: ZusΓ€tzliche I/O-Erweiterungen
- SV1, SV2: ICSP-Programmierschnittstelle
- JP1-JP10: Jumper fΓΌr Hardware-Konfiguration
- Adressierung, Terminierung, Betriebsmodi
- Pull-up/Pull-down Konfiguration
- LED1: Status-LED fΓΌr Betriebsanzeige
- EingΓ€nge: 16Γ optoisoliert, 12-24V DC, Matrix-gescannt
- AusgΓ€nge: 16Γ High-Side-Switch, 1A@48V max pro Kanal
- Versorgung: 7-35V DC Eingang, interne 5V/12V/24V Erzeugung
- Isolation: 2,5kV zwischen Ein-/AusgΓ€ngen und Logik
- Schutz: Sicherungen, Γberstrom-, Γbertemperaturschutz
- EMV: EntstΓΆrfilter, differentielle RS485-Γbertragung
- PlatinengrΓΆΓe: Eurocard-Format (ca. 160Γ100mm)
- AnschlΓΌsse: Federkraftklemmen fΓΌr industrielle Anwendung
- RS485-Kommunikation: Serielle Busverbindung fΓΌr Multi-Device-Netzwerk
- Multi-Device-UnterstΓΌtzung: 19 verschiedene Device-IDs fΓΌr verschiedene GerΓ€te
- I/O-Steuerung: Ein-/AusgΓ€nge fΓΌr Sensoren und Aktoren
- Zeitfunktionen: RTC-Funktionen fΓΌr zeitgesteuerte Aktionen
- Konfigurationsspeicher: EEPROM-basierte Parameterspeicherung
- Interrupt-gesteuert: Effiziente serielle Datenverarbeitung
[STARTBYTE] [COMMAND] [DEVICE_ID] [DATA...] [CHECKSUM]
- STARTBYTE (0x00): Markiert Nachrichtenbeginn
- COMMAND: 8-Bit Kommandocode
- DEVICE_ID: ZielgerΓ€t (0x01-0xFF)
- DATA: Variable Nutzlast (0-254 Bytes)
- CHECKSUM: XOR-PrΓΌfsumme aller Bytes
- CMDOFF (0x01): Alle AusgΓ€nge eines GerΓ€ts ausschalten
- Format:
00 01 ID - Schaltet alle Relais/AusgΓ€nge des ZielgerΓ€ts aus (Notaus-Funktion)
- Format:
- CMDRESET (0x02): GerΓ€t-Reset
- Format:
00 02 ID - FΓΌhrt Soft-Reset des Mikrocontrollers durch
- Format:
- CMDID (0x04): Device-Poll
- Format:
00 04 ID - PrΓΌft Erreichbarkeit eines GerΓ€ts, Antwort: CMDACK
- Format:
- CMDACK (0x03): BestΓ€tigung
- Format:
00 03 ID - Standardantwort fΓΌr erfolgreich verarbeitete Kommandos
- Format:
- CMDOWR (0x05): AusgΓ€nge setzen (16-Bit)
- Format:
00 05 ID LO_BYTE HI_BYTE - Setzt alle 16 AusgΓ€nge gleichzeitig (Bit 0 = Ausgang 0, etc.)
- Format:
- CMDIRD (0x06): EingΓ€nge lesen
- Format:
00 06 ID - Antwort:
00 08 ID LO_BYTE HI_BYTE(16-Bit Eingangsstatus)
- Format:
- CMDORD (0x07): AusgΓ€nge lesen
- Format:
00 07 ID - Antwort:
00 08 ID LO_BYTE HI_BYTE(16-Bit Ausgangsstatus)
- Format:
- CMDOC (0x8Y): Einzelausgang lΓΆschen
- Format:
00 8Y ID(Y = Kanal 0-F) - Schaltet spezifischen Ausgang aus
- Format:
- CMDOS (0x9Y): Einzelausgang setzen
- Format:
00 9Y ID(Y = Kanal 0-F) - Schaltet spezifischen Ausgang ein
- Format:
- CMDO (0xAY): Einzelausgang lesen
- Format:
00 AY ID(Y = Kanal 0-F) - Antwort:
00 08 ID 00/01 00(Ausgangszustand)
- Format:
- CMDI (0xBY): Einzeleingang lesen
- Format:
00 BY ID(Y = Kanal 0-F) - Antwort:
00 08 ID 00/01 00(Eingangszustand)
- Format:
- CMDPEDGE (0x1Y): Positive Flanke
- Format:
00 1Y ID(Y = Kanal 0-F) - Wird automatisch gesendet bei steigender Flanke an Eingang Y
- Format:
- CMDNEDGE (0x2Y): Negative Flanke
- Format:
00 2Y ID(Y = Kanal 0-F) - Wird automatisch gesendet bei fallender Flanke an Eingang Y
- Format:
- CMDSOFF (0x4Y): Komfort-Aus
- Format:
00 4Y ID(Y = Kanal 0-F) - Kontext-abhΓ€ngig: Jalousien
βοΈ /Fensterπ/Lichtπ‘β¬οΈ
- Format:
- CMDSON (0x6Y): Komfort-Ein
- Format:
00 6Y ID(Y = Kanal 0-F) - Kontext-abhΓ€ngig: Jalousienβ¬οΈ/Fensterπ/Lichtπ‘β¬οΈ
- Format:
- CMDGOFF (0x5G): Gruppensteuerung Aus
- Format:
00 5G GG(G = Gruppencode) - Schaltet alle GerΓ€te einer Gruppe aus
- Format:
- CMDGON (0x7G): Gruppensteuerung Ein
- Format:
00 7G GG(G = Gruppencode) - Schaltet alle GerΓ€te einer Gruppe ein
- Format:
- CMDAOFF (0x5F): Globaler Licht-Aus
- Format:
00 5F 01 - Schaltet alle Lichter im System aus
- Format:
- CMDAON (0x7F): Globaler Licht-Ein
- Format:
00 7F 01 - Schaltet alle Lichter im System ein
- Format:
- CMDTSET (0x09): RTC Zeit setzen
- Format:
00 09 ID SS MM HH DD MM(5 Bytes: Sek/Min/Std/Tag/Monat)
- Format:
- CMDTGET (0x0A): RTC Zeit lesen
- Format:
00 0A ID - Antwort:
00 0B ID SS MM HH DD MM(aktuelle Zeit)
- Format:
- CMDCGET (0x0C): Konfiguration lesen
- Format:
00 0C ID - Antwort:
00 0D ID [255 Config-Bytes](komplette EEPROM-Konfiguration)
- Format:
- CMDCSET (0x0E): Konfiguration schreiben
- Format:
00 0E ID [256 Config-Bytes](vollstΓ€ndige EEPROM-Programmierung)
- Format:
Jeder Ausgang kann individuell in verschiedenen Modi betrieben werden. Die Konfiguration erfolgt ΓΌber EEPROM-Parameter:
-
Mode 0 - Exit (1 Ausgang)
- Einfacher Taster-Ausgang fΓΌr TΓΌrΓΆffner
- Kurzer Impuls bei Aktivierung
-
Mode 1 - Passthrough (4 AusgΓ€nge)
- Direkte 1:1 Weiterleitung von EingΓ€ngen zu AusgΓ€ngen
- Ohne VerzΓΆgerung oder Logik
-
Mode 2 - Force Off (2 AusgΓ€nge)
- AusgΓ€nge werden permanent auf "Aus" gehalten
- FΓΌr Sicherheitsschaltungen
-
Mode 3 - Force On (2 AusgΓ€nge)
- AusgΓ€nge werden permanent auf "Ein" gehalten
- FΓΌr Always-On GerΓ€te
-
Mode 4 - Toggle Light (4 AusgΓ€nge)
- Klassische Lichtschaltung mit Toggle-Funktion
- Eingang schaltet Licht ein/aus
-
Mode 5 - Dual Toggle (4 AusgΓ€nge)
- Zwei AusgΓ€nge mit unabhΓ€ngiger Toggle-Steuerung
- FΓΌr Zwei-Kreis-Beleuchtung
-
Mode 6 - Dimmed Light (5 AusgΓ€nge)
- Zweistufiges Licht (Output 1: Stufe 1, Output 1+2: Stufe 2)
- Verschiedene Helligkeitsstufen
-
Mode 8 - Retriggerable Timer (5 AusgΓ€nge)
- Ausgang fΓΌr konfigurierbare Zeit eingeschaltet
- Bei erneutem Trigger wird Zeit zurΓΌckgesetzt
- Ideal fΓΌr Treppenhauslicht
-
Mode 9 - Blinker (5 AusgΓ€nge)
- Kontinuierliches Blinken mit konfigurierbarer Frequenz
- FΓΌr Signalgebung oder Warnleuchten
-
Mode D - Awning Control (6 AusgΓ€nge)
- Output 1: Ein/Aus (Hauptschalter)
- Output 2: Auf/Zu (Richtungssteuerung)
- Endlagenerkennung ΓΌber EingΓ€nge
- Automatische ZeitΓΌberwachung
-
Mode E - Blind Control (6 AusgΓ€nge)
- Output 1: Ein/Aus (Motorsteuerung)
- Output 2: Hoch/Runter (Richtung)
- Endschalter-Γberwachung
- Zwischenpositionen mΓΆglich
-
Mode F - Window Control (6 AusgΓ€nge)
- Output 1: Auf (Fenster ΓΆffnen)
- Output 2: Zu (Fenster schlieΓen)
- FΓΌr automatische FensterlΓΌftung
- Wettersensor-Integration
Jeder Modus kann ΓΌber EEPROM-Parameter angepasst werden:
Parameter-Layout (5-6 Bytes pro Ausgang):
[PrescaleMode] [OutputPin] [InputPin] [DeviceID1] [Delay] [DeviceID2]
- PrescaleMode: Modus + Zeitbasis (4 Bit Modus + 4 Bit Prescaler)
- OutputPin: Zugeordneter Ausgangspin (0x00-0x0F)
- InputPin: Zugeordneter Eingangspin (0x00-0x0F)
- DeviceID1: PrimΓ€re verknΓΌpfte GerΓ€te-ID
- Delay: Zeitwerte fΓΌr Timer-Modi (optional)
- DeviceID2: SekundΓ€re verknΓΌpfte GerΓ€te-ID (optional)
Die Datei parameter.asm implementiert ein cleveres bedingte Kompilierungs-System fΓΌr EEPROM-Konfiguration:
; In main.asm - Device-ID Definition:
#ifndef device
#define device 0x01 ; Standard-Device falls nicht definiert
#endif
; In parameter.asm - Bedingte Kompilierung:
org 0x2100 ; EEPROM-Startadresse (256 Bytes)
de device ; Byte 0: Aktuelle Device-ID
if device == 0x01 ; Nur fΓΌr Device 0x01 kompiliert
de 0x04,0x0d,0x0b,0x01 ; Konfigurationsdaten fΓΌr 0x01
de 0x56,0x10,0x00,0x01
...
endif
if device == 0x02 ; Nur fΓΌr Device 0x02 kompiliert
de 0x04,0x00,0x01,0x02 ; Andere Konfiguration fΓΌr 0x02
...
endif# build-all.sh kompiliert 19Γ die gleiche Firmware:
gpasm -D device=0x01 -o build/multiIO src/main.asm # β multiIO.device0x01.hex
gpasm -D device=0x02 -o build/multiIO src/main.asm # β multiIO.device0x02.hex
gpasm -D device=0x03 -o build/multiIO src/main.asm # β multiIO.device0x03.hex
# ... fΓΌr alle 19 Device-IDsErgebnis: Ein Source-Code β 19 verschiedene Firmwares mit jeweils optimierter EEPROM-Konfiguration
- Ohne parameter.asm: Firmware mit allen Konfigurationen + Runtime-Konditionierung
- Mit parameter.asm: Firmware enthΓ€lt nur relevante EEPROM-Daten fΓΌr eine Device-ID
- Keine Runtime-Entscheidungen: Kein
if (deviceID == 0x01)zur Laufzeit - Direkte EEPROM-Zugriffe: Konfiguration zur Compile-Time fest verdrahtet
- Kleinere EEPROM-Images: Nur benΓΆtigte Konfigurationsdaten pro Device
- Ein Source-Code fΓΌr alle GerΓ€te-Varianten
- Zentrale Konfiguration in einer Datei
- Bedingte Kompilierung verhindert Konfigurationsfehler
EEPROM-Adresse 0x2100-0x21FF (256 Bytes):
βββββββββββββββββββ¬ββββββββββββββββββ¬ββββββββββββββββββ
β Byte 0: DeviceIDβ Byte 1: OutLo β Byte 2: OutHi β
βββββββββββββββββββΌββββββββββββββββββΌββββββββββββββββββ€
β Byte 3: Action 0β Byte 4: Action 0β Byte 5: Action 0β
β [Mode+Prescale] β [Output Pin] β [Input Pin] β
βββββββββββββββββββΌββββββββββββββββββΌββββββββββββββββββ€
β Byte 6: DevID1 β Byte 7: Delay β Byte 8: DevID2 β
βββββββββββββββββββΌββββββββββββββββββΌββββββββββββββββββ€
β Byte 9: Action 1β Byte 10:Action 1β Byte 11:Action 1β
β ... β ... β ... β
βββββββββββββββββββ΄ββββββββββββββββββ΄ββββββββββββββββββ
org 0x2100 ; Startet bei EEPROM-Adresse
PARAMBASE equ $ ; Merkt sich aktuelle Position (Base-Pointer)
eeDeviceID equ $-PARAMBASE ; Offset 0 vom Base
de device ; Schreibt aktuelle Device-ID ins EEPROM
; Bedingte EEPROM-Programmierung:
if device == 0x01
; Diese Daten werden nur in multiIO.device0x01.hex geschrieben:
de 0x56,0x10,0x00,0x01,0x28 ; Technik Decke 1&2
de 0xa4,0x02,0x01,0x01,0xe1 ; Treppe UG Downlights (Timer)
de 0x04,0x0d,0x0b,0x01 ; Werkstatt Decke 3 (Toggle)
endif
if device == 0x02
; Diese Daten werden nur in multiIO.device0x02.hex geschrieben:
de 0x04,0x00,0x01,0x02 ; Andere Konfiguration
endif; In der Firmware (eeprom.asm):
startup:
call readEEPROM ; Liest Device-ID aus EEPROM Byte 0
movwf deviceID ; Speichert gelesene Device-ID
call loadParameters ; LΓ€dt alle Action-Konfigurationen
; Firmware weiΓ jetzt sofort ihre IdentitΓ€t und KonfigurationBedingte Kompilierung auf EEPROM-Ebene:
- Gleicher Code wird 19Γ mit verschiedenen
-D device=0xXXParameters kompiliert - Jede Firmware enthΓ€lt nur ihre spezifischen Konfigurationsdaten
- Zur Laufzeit keine Device-ID-PrΓΌfungen notwendig
- EEPROM zur Compile-Time gefΓΌllt, nicht zur Runtime
Beispiel-Installation:
π Device 0x01 - Untergeschoss: Technik, Werkstatt, Hobby
π Device 0x02 - Erdgeschoss: KΓΌche, Wohnen, Essen
π Device 0x03 - Obergeschoss: Schlafzimmer, Bad
π Device 0x4D - SondergerΓ€te: Garage, AuΓenbeleuchtung
Dieses System ermΓΆglicht eine skalierbare Hausautomatisierung mit optimaler Speichernutzung und maximaler Performance.
multiIO/
src/ # Assembly-Quelldateien (.asm)
inc/ # Include-Dateien (.inc)
build/ # Build-Artefakte (wird automatisch erstellt)
Makefile # Build-Konfiguration
build-all.sh # Skript zum Erstellen aller Device-Varianten
make # Baut Device-ID 0x01 (Standard)
make DEVICE_ID=0x05 # Baut spezifische Device-ID./build-all.shErstellt automatisch .hex-Dateien fΓΌr alle in src/parameter.asm definierten Device-IDs im build/ Verzeichnis.
make clean # LΓΆscht build/ Verzeichnis und temporΓ€re Dateien- gputils: gpasm und gplink fΓΌr PIC Assembly
- PIC16F946: Target-Mikrocontroller
build/multiIO.hex- Standard-Firmware (Device-ID 0x01)build/multiIO.device0xXX.hex- Spezifische Device-Variantenbuild/multiIO.cod- Code-Datei fΓΌr Debuggingbuild/multiIO.lst- Listing-Datei
- Mikrocontroller: PIC16F946
- Kommunikation: RS485 bei 38.400 bps
- Oszillator: Intern mit OSCTUNE-Anpassung fΓΌr prΓ€zise Baudrate
- Firmware-Revision: 4
- Debug-Modus: Mit ICSP-Debugging-UnterstΓΌtzung (__DEBUG)
- Release-Modus: Optimiert fΓΌr Produktionseinsatz
- Baudrate-Optionen: 38.4k (Standard), 57.6k, 115.2k bps
- PrΓ€zision: Β±0.16% Genauigkeit durch OSCTUNE-Register
- Frequenzbereiche:
- 7.352 MHz fΓΌr 115.2k bps
- 8.000 MHz fΓΌr 38.4k/57.6k bps
- 8.293 MHz fΓΌr erweiterte Modi
- Flash-Speicher: 8K words (14-Bit) Programmspeicher
- RAM: 368 Bytes Datenspeicher + Register
- EEPROM: 256 Byte fΓΌr persistente Konfiguration
- I/O-Pins: 16 konfigurierbare digitale Ein-/AusgΓ€nge
- Timer: Timer0, Timer1, Timer2 fΓΌr Zeitfunktionen
- ADC: 10-Bit A/D-Wandler fΓΌr AnalogeingΓ€nge
- Interrupts: UART, Timer, I/O-Change, LVD, ADC
- Real-Time OS: Interrupt-gesteuerte Verarbeitung (<1ms Response)
- Message-Buffers:
- RX: 32-Byte Ringpuffer (BUFSIZE=0x20)
- TX: 32-Byte Ringpuffer
- Message-Queue: 16-Byte (MSGBUFSIZE=0x10)
- Error-Handling: Watchdog, XOR-Checksumme, 100ms Timeout, 3Γ Retry
- Konfiguration: 256-Byte EEPROM-basierte Parameterspeicherung
- Debugging: .cod/.lst Dateien fΓΌr MPLAB/GPutils
- Compiler: gputils (gpasm/gplink) - Open Source PIC Toolchain
- Busart: Master-Slave
- Startbyte: 0x00 fΓΌr Synchronisation
- Adressraum: 1-255 GerΓ€te (0x01-0xFF)
- NachrichtenlΓ€nge: 3-258 Bytes
- Checksumme: XOR aller Bytes
- Timeout: 100ms Antwortzeit
- Retry: 3x automatische Wiederholung