Die Software läuft ...
Hallo zusammen,
wenn man mal ein wenig Zeit hat, dann bekommt man auch was fertig
Also hier ist sie, die Software zum Projekt (wegen dem Forum um einige
Bemerkungen gekürzt) ...
CodeBox BASCOM
' #################################################
' ##### Kleiderschrankbeleuchtung mit ATmega8 #####
' #################################################
' (c) 15.01.2011 by Dino
'
' Prozessor ATmega8 - Definitionsdatei fuer internen uC-Aufbau
$regfile = "m8def.dat"
' 8,000MHz interner Takt
$crystal = 8000000
' 16,000MHz Quarztakt
'$crystal = 16000000
' Groesse des Hardwarestacks fuer Ruecksprungadressen (SUBs/ISRs/...)
$hwstack = 32
' Groesse des Softwarestacks fuer Adressen von Uebergabeparameter an SUBs
$swstack = 32
' Speichergroesse fuer Uebergabeparameter an Unterprogramme, lokale Variablen
' und temporaere Werte
$framesize = 32
' Wenn man die Variablen selber sauber setzt kann man sich den Code von
' BASCOM fuer eine Speicherreinigung sparen.
$noramclear
' ####################################
' ##### DEFINITION DER VARIABLEN #####
' ####################################
'
' Array fuer den 1Wire-Sensor
Dim Ds18s20(9) As Byte
' Variablen fuer DS18S20 Temperatur
Dim Ds_temp As Integer ' 2 Bytes : -32768 bis +32767
Dim Ds_count As Byte '
Dim Temperatur As Single ' 4 Bytes : 1.5 x 10^-45 bis 3.4 x 10^38
' ne Zaehlervariable
Dim Count As Byte
Dim Lpcnt As Byte ' Schleifenzaehler / LoopCounter
' Variablen fuer Reed-Scan
Dim Reed_out As Byte
Dim Reed_tmp As Byte
Dim Reed_in1 As Byte
Dim Reed_in2 As Byte
Dim Reed_ch1 As Byte
Dim Reed_ch2 As Byte
Dim Reed_in1_alt As Byte
Dim Reed_in2_alt As Byte
Dim Reed_open1 As Byte
Dim Reed_open2 As Byte
'
Reed01 Alias Reed_open1.2
Reed02 Alias Reed_open1.5
Reed03 Alias Reed_open1.1
Reed04 Alias Reed_open1.4
Reed05 Alias Reed_open1.0
Reed06 Alias Reed_open1.3
Reed07 Alias Reed_open2.2
Reed08 Alias Reed_open2.5
Reed09 Alias Reed_open2.1
Reed10 Alias Reed_open2.4
Reed11 Alias Reed_open2.0
Reed12 Alias Reed_open1.3
Last1 Alias Portc.0
Last2 Alias Portc.1
Last3 Alias Portc.2
Last4 Alias Portc.3
Last5 Alias Portc.4
Last6 Alias Portc.5
' ################################
' ##### DEFINITION DER PORTS #####
' ################################
'
' PB0 ------- nix
' PB1 -- 1Wire Dallas DS18S20
' PB2 ------- nix
'
' PB3 -- Reed-Gruppe 1 -- MOSI |
' PB4 -- Reed-Gruppe 2 -- MISO | ISP-Port
' PB5 -- Reed-Gruppe 3 -- SCK |
'
' PB6 -- XTAL1 | Systemquarz
' PB7 -- XTAL2 | 16,000MHz
'
' ===== PortB =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= I=1= I=0= => 00000000 => DDRB (In/Out)
' XTAL2 XTAL1 RGp3 RGp2 RGp1 ---- 1Wir ---- => 00111000 => PORTB (PullUp/init)
' x x | | | | | |
'
Ddrb = &B0000_0000
Portb = &B0011_1000
'
' ===== DS18S20 Temperatursensor =====
Config 1wire = Portb.1
'
'
' PC0 -- Last 1 / SSR1 (SolidStateRelais1)
' PC1 -- Last 2 / SSR2
' PC2 -- Last 3 / SSR3
' PC3 -- Last 4 / SSR4
' PC4 -- Last 5 / SSR5
' PC5 -- Last 6 / SSR6
' PC6 -- RESET | ISP-Port
'
' ===== PortC =================================================================
' I=7= I=6= O=5= O=4= O=3= O=2= O=1= O=0= => 00111111 => DDRC (In/Out)
' ---- Reset SSR6 SSR5 SSR4 SSR3 SSR2 SSR1 => 00000000 => PORTC (PullUp/init)
' x x | | | | | |
'
Ddrc = &B0011_1111
Portc = &B0000_0000
'
'
'
' PD0 -- RxD
' PD1 -- TxD
' PD2 ------- nix
' PD3 ------- nix
' PD4 -- Reed Zeile 1
' PD5 -- Reed Zeile 2
' PD6 -- Reed Zeile 3
' PD7 -- Reed Zeile 4
'
' ===== PortD =================================================================
' O=7= O=6= O=5= O=4= I=3= I=2= O=1= I=0= => 11110010 => DDRD (In/Out)
' RZe4 RZe3 RZe2 RZe1 ---- ---- TxD RxD => 11111101 => PORTD (PullUp/init)
' | | | | | | | |
'
Ddrd = &B1111_0010
Portd = &B1111_1101
'
' ===== UART (TTL) initialisieren =============================================
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 16
Open "com1:" For Binary As #1
Clear Serialin
'
' ======= Porttest in der Startphase =======
Portc = &B0000_0000 ' Alle Bits am Port auf 0 setzen
Waitms 200 ' 200ms warten
Portc = &B0000_0001 ' Bit0 am Port auf 1 setzen
Waitms 200 ' 200ms warten
Portc = &B0000_0010 ' Bit1 am Port auf 1 setzen
Waitms 200 ' 200ms warten
Portc = &B0000_0100 ' Bit2 am Port auf 1 setzen
Waitms 200 ' 200ms warten
Portc = &B0000_1000 ' Bit3 am Port auf 1 setzen
Waitms 200 ' 200ms warten
Portc = &B0001_0000 ' Bit4 am Port auf 1 setzen
Waitms 200 ' 200ms warten
Portc = &B0010_0000 ' Bit5 am Port auf 1 setzen
Waitms 200 ' 200ms warten
Portc = &B0000_0000 ' Alle Bits am Port auf 0 setzen
Waitms 200 ' 200ms warten
Portc = &B0011_1111 ' Alle Bits am Port auf 1 setzen
Waitms 200 ' 200ms warten
Portc = &B0000_0000 ' Alle Bits am Port auf 0 setzen
Waitms 200 ' 200ms warten
' ======= Porttest Ende =======
' ===== Startmeldung auf dem UART ausgeben =====
Print #1 , "Start"
Lpcnt = 0
' ###############################################
' ##### Hauptschleife Start #####################
' ###############################################
Do
Waitms 50 ' 100ms warten
If Lpcnt > 40 Then
Gosub Ds18s20_temp ' Temperatur einlesen
Gosub Ds18s20_mess ' Messung starten
Lpcnt = 0
If Temperatur > 75 Then
Print #1 , "Uebertemperatur! Notabschaltung!"
End If
End If
Incr Lpcnt
Gosub Reedscan
If Temperatur > 75 Then
Portc = &B0000_0000 ' Notabschaltung ! Alles SolidStates ausschalten
Else
' ========== Linke Seite ==========
' ===== Reed-Kontakt 01 verarbeiten =====
' ===== Reed-Kontakt 07 verarbeiten =====
If Reed01 = 1 Then
Last1 = 1
Elseif Reed07 = 1 Then
Last1 = 1
Else
Last1 = 0
End If
' ========== Mitte und Laden ==========
' ===== Reed-Kontakt 02 verarbeiten =====
' ===== Reed-Kontakt 03 verarbeiten =====
If Reed02 = 1 Then
Last2 = 1
Elseif Reed03 = 1 Then
Last2 = 1
Elseif Reed05 = 1 Then
Last2 = 1
Elseif Reed06 = 1 Then
Last2 = 1
Else
Last2 = 0
End If
' ===== Spiegelleuchte Mitte/Links =====
If Reed02 = 1 Then
Last4 = 1
Else
Last4 = 0
End If
' ===== Spiegelleuchte Mitte/Rechts =====
If Reed03 = 1 Then
Last5 = 1
Else
Last5 = 0
End If
' ========== Rechte Seite ==========
' ===== Reed-Kontakt 04 verarbeiten =====
' ===== Reed-Kontakt 08 verarbeiten =====
If Reed04 = 1 Then
Last3 = 1
Elseif Reed08 = 1 Then
Last3 = 1
Else
Last3 = 0
End If
' ========== Beleuchtung Aussen (Konsole) ==========
' ===== Reed-Kontakt 09 verarbeiten =====
If Reed09 = 1 Then
Last6 = 1
Else
Last6 = 0
End If
End If
Loop
' ###############################################
' ##### Hauptschleife Ende ######################
' ###############################################
' ============================================
' ===== Sub fuer DS18S20 Messung starten =====
' ============================================
Ds18s20_mess:
1wreset ' 1Wire-Bus zuruecksetzen
1wwrite &HCC ' Alle 1Wire-Devices ansprechen
1wwrite &H44 ' Temperaturmessung starten
Return
' ================================================
' ===== Sub fuer DS18S20 Temperatur einlesen =====
' ================================================
Ds18s20_temp:
1wreset ' 1Wire-Bus zuruecksetzen
1wwrite &HCC ' Alle 1Wire-Devices ansprechen
1wwrite &HBE ' Scratchpad einlesen
For Count = 1 To 9
Ds18s20(count) = 1wread() ' Scratchpad in Array uebertragen
' Print #1 , Count ; " - " ; Ds18s20(count)
Next
If Ds18s20(9) = Crc8(ds18s20(1) , 8) Then ' Wenn CRC8 korrekt dann Berechnung starten
Ds_temp = Makeint(ds18s20(1) , Ds18s20(2)) ' LSB und MSB zu 16Bit-Integer zusammensetzen
' ===== Ab hier eine genaue Berechnung =====
' Bemerkungen wegen Forum weggekürzt
' ===== oder eine Berechnung auf 0,5 Grad genau =====
Temperatur = Ds_temp / 2 ' Nachkommateil erzeugen
Print #1 , "Temperatur : " ; Temperatur ; "deg"
Else
Print #1 , "DS18S20 Messfehler"
End If
Return
' ===============================
' ===== Eingaenge abscannen =====
' ===============================
Reedscan:
' PD.7 , 6 , 5 , 4 => Ausgaenge zu den Dioden
' PB.5 , 4 , 3 => Eingaenge mit PullUps
'
' Reeds sind bei geschlossenen Tueren geschlossen (Eingang = 0)
'
'
Portd.4 = 0 ' Ports fuer die erste Aktion definieren
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1
Waitms 1 ' Ports beruhigen lassen
Reed_tmp = Pinb ' Einlesen
Shift Reed_tmp , Right , 3 ' Bits 5-3 auf 2-0 schieben (3 Positionen nach rechts)
Reed_in1 = Reed_tmp Or &B1111_1000 ' geschlossene Reeds als 0 uebrig lassen
Portd.4 = 1 ' Ports fuer die naechste Aktion definieren
Portd.5 = 0
Waitms 1 ' Ports beruhigen lassen
Reed_tmp = Pinb Or &B1100_0111 ' Einlesen und geschlossene Reeds als 0 uebrig lassen
Reed_in1 = Reed_in1 And Reed_tmp ' die ersten 3 Reeds mit den naechsten zusammenfuegen
' === die ersten 3 Stecker mit 6 Reeds sind fertig. Nun die naechsten 3 Stecker mit 6 Reeds einlesen
Portd.5 = 1 ' Ports fuer die naechste Aktion definieren
Portd.6 = 0
Waitms 1 ' Ports beruhigen lassen
Reed_tmp = Pinb ' Einlesen
Shift Reed_tmp , Right , 3 ' Bits 5-3 auf 2-0 schieben (3 Positionen nach rechts) ' Bits 5-3 auf 2-0 schieben (3 Positionen nach rechts)
Reed_in2 = Reed_tmp Or &B1111_1000 ' geschlossene Reeds als 0 uebrig lassen
Portd.6 = 1 ' Ports fuer die naechste Aktion definieren
Portd.7 = 0
Waitms 1 ' Ports beruhigen lassen
Reed_tmp = Pinb Or &B1100_0111 ' Einlesen und geschlossene Reeds als 0 uebrig lassen
Reed_in2 = Reed_in2 And Reed_tmp ' die ersten 3 Reeds mit den naechsten zusammenfuegen
Portd.7 = 1
' Change Eingang
' ---xor-- ---in---
' v v Reed geschlossen = 0
' 00000000 11111111
' 00010000 11101111 geaendert auf zu
' 00000000 11101111 ist jetzt zu
' 00010000 11111111 geaendert auf offen
' 00000000 11111111 ist jetzt offen
' 654321 654321
Reed_ch1 = Reed_in1 Xor Reed_in1_alt ' Bit bei Aenderung = 1 sonst 0
Reed_tmp = Reed_in1 Or Reed_ch1 ' Prellen (Aenderung wegen XOR auf 1) als Offen hinzufuegen
Reed_open1 = Reed_tmp And &B0011_1111 ' alle anderen Bits auf 0 setzen
Reed_ch2 = Reed_in2 Xor Reed_in2_alt ' Bit bei Aenderung = 1 sonst 0
Reed_tmp = Reed_in2 Or Reed_ch2 ' Prellen (Aenderung wegen XOR auf 1) als Offen hinzufuegen
Reed_open2 = Reed_tmp And &B0011_1111 ' alle anderen Bits auf 0 setzen
' Reed_open1 --> -- -- 02 04 06 01 03 05
' Reed_open2 --> -- -- 08 10 12 07 09 11
If Reed_in1_alt <> Reed_in1 Then
Print #1 , "-- -- 02 04 06 01 03 05 : " ; Bin(reed_open1) ; " " ; Bin(reed_ch1)
End If
If Reed_in2_alt <> Reed_in2 Then
Print #1 , "-- -- 08 10 12 07 09 11 : " ; Bin(reed_open2) ; " " ; Bin(reed_ch2)
End If
Reed_in1_alt = Reed_in1 ' Fuer naechsten Durchlauf sichern
Reed_in2_alt = Reed_in2 ' um Aenderungen erkennen zu koennen
Return
' ###############################################
' ##### Programm Ende ###########################
' ###############################################
End
Das Programm habe ich mit einer BASCOM-Demo v1.11.9.8 kompiliert und es
verbraucht 36% Flash. Ist also auch mit kostenloser Umgebung zu bearbeiten.
Hier nochmal vollständig als Download ...
Anhang anzeigen Kleiderschrankbeleuchtung_110117.bas
Das ist der selbstgemachte Stecker für die UART-Debug-Schnittstelle.
Da habe ich mich auf einen 4poligen MicroMatch festgelegt über den GND,
Vcc, RxD und TxD laufen. Damit ich auch längenmäßig durch das Gehäuse
komme mußte ich mir ein eigenes "Griffgehäuse" bauen das den Stecker
verlängert. Sonst ist es eher eine Art Pfostenstecker.
Und hier das gute Stück mal in zusammengeschraubter Version ...
hardwaretechnisch ist es fertig (bis auf die Thermosicherung) und die
Software ist eigentlich auch zu 95% fertig. Es fehlt lediglich die Einbindung
des Fußschalters für die Konsolenbeleuchtung und die Ansteuerung der
Warn-LED bei Temperaturalarm.
Gruß
Dino