'############################################################### '* '* Steuerschaltung für Belichtungsgerät '* '* Version 8 '* '* erstellt mit BASCOM-AVR Vers. 2.0.7.9 '* '* © Willie 26.02.2019 '* '*************************************************************** '* '* Schaltung: '* Prozessor ATMega8 '* LCD 16x2, mit I2C-Adapter '* '* Vcc auf +5V (Pin 7) '* GND auf GND (Pin 8) '* 100nF Kerko zwischen Vcc und GND (Pin 7+8) '* AVcc auf +5V (Pin 20) '* GND auf GND (Pin 22) '* 100nF Kerko zwischen AVcc und GND (Pin 20) '* '* 16Mhz Quarz zwischen XTAL1 und XTAL2 (Pin 9+10) '* 22pF Kerko zwischen XTAL1 und GND (Pin 9+8) '* 22pF Kerko zwischen XTAL2 und GND (Pin 10+8) '* '* 3,6kOhm zwischen PC5 (Pin 28) und Vcc - Pullup für I2C-SCL '* 3,6kOhm zwischen PC4 (Pin 27) und Vcc - Pullup für I2C-SDA '* '* Transistor für Einschalten der roten Beleuchtung an PB2 (Pin 16) '* Transistor für Einschalten der weißen Beleuchtung (grün und blau zusätzlich zu rot) an PB1 (Pin 15) '* Transistor für Einschalten des Relais für UV Beleuchtung an PB3 (Pin 17) '* '* LED-Anzeige Rot an PD6 (Pin 12) - NEGATIVE LOGIC !!! '* LED-Anzeige Grün an PD7 (Pin 13) - NEGATIVE LOGIC !!! '* LED-Anzeige Blau anN PB0 (Pin 14) - NEGATIVE LOGIC !!! '* '* Beeper an PD1 (Pin 3) '* '* Tastenleiste an ADC0 (Pin 23) '* 100nF Kerko zwischen ADC0 und GND (Pin 23) '* '* Tastenfeld: '* 1 = Menü '* 2 = nach unten '* 3 = nach oben '* 4 = Select '* 5 = Start/Stop '* 6 = Rot On/Off '* 7 = Weiß On/Off '* '* '*************************************************************** '* '* HARDWAREEINSTELLUNGEN DES ATMega8 '* '* Fusebit KLA987 = 111111:Ext.Crystal/Resonator High Freq. '* Fusebit High H = 0:CKOPT 0 '* '*************************************************************** '***** Genutzter Microcontroller, Takt in Hz, Stacks & Framesize $regfile = "m8def.dat" ' ATMega8; Stacks etc.automatisch aus Bascom übernommen $crystal = 16000000 ' Hardware intern auf ext. eingestellt (Fuse-Bits!) $hwstack = 32 $swstack = 10 $framesize = 40 '***** I2C & LCD konfigurieren Config Scl = Portc.5 ' I2C Scl (Pin 28) Config Sda = Portc.4 ' I2C Sda (Pin 27) Config Lcd = 16x2 $lib "YwRobot_Lcd_i2c.lib" ' YwRobot Treiber für LCD Const Pcf8574_lcd = 126 ' Slave-Adresse des I2C-LCDs 'Pcf8574_lcd = 78 'Pcf8574A_lcd = 126 Dim Lcd_backlight As Byte ' 1 = an; 0 = aus. Wird erst durch einen LCD-Befehl umgesetzt! Config I2cdelay = 1 ' 1=1Mhz,5=200Khz,10=100Khz,15=66,66Khz 'Wenn in Lcd keine Anzeige muß der Delaywert erhöht werden.Mit Wert 15 beginnen und dann langsam verringern. Waitms 300 ' warte bis Kondensator bei Ta0 geladen, auch für LCD-Init! '***** eigene Characters für Menüanzeige Deflcdchar 0 , 32 , 14 , 14 , 14 , 14 , 31 , 14 , 4 ' Pfeil runter Deflcdchar 1 , 4 , 14 , 31 , 14 , 14 , 14 , 14 , 32 ' Pfeil rauf '***** ADC konfigurieren Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC mit Ref 5 V '***** Portpin-Configs Config Portd.0 = Output ' LED "Alive" (läuft das Programm noch?) Config Portb.2 = Output ' Rote Beleuchtung Config Portb.1 = Output ' Weiße Beleuchtung (grün und blau zusätzlich zu rot) Config Portb.3 = Output ' Relais für UV Config Portd.6 = Output ' LED-Anzeige ROT - NEGATIVE LOGIC !!! Config Portd.7 = Output ' LED-Anzeige GRÜN - NEGATIVE LOGIC !!! Config Portb.0 = Output ' LED-Anzeige BLAU - NEGATIVE LOGIC !!! Config Portd.1 = Output ' Beeper '***** Timer-Config Const Timer1_preload = 3036 Config Timer1 = Timer , Prescale = 256 On Timer1 Isr_timer1 Enable Interrupts '***** Aliaszuweisungen Alive Alias Portd.0 ' LED "Alive" (läuft das Programm noch?) Bel_rot Alias Portb.2 ' Rote Beleuchtung Bel_weiss Alias Portb.1 ' Weiße Beleuchtung Relais_uv Alias Portb.3 ' Relais für UV Anzeige_rot Alias Portd.6 ' LED-Anzeige ROT - NEGATIVE LOGIC !!! Anzeige_gruen Alias Portd.7 ' LED-Anzeige GRÜN - NEGATIVE LOGIC !!! Anzeige_blau Alias Portb.0 ' LED-Anzeige BLAU - NEGATIVE LOGIC !!! Beeper Alias Portd.1 ' Beeper '***** Variablen Dim Adcval As Word ' ADC-Wert Dim Auswahl As Word ' Arbeitsvariable für ADC-Auswahl Dim Mp As Byte ' Menüpunkt Dim Mp2 As Byte ' 2. Zeile zur Menüpunktanzeige Dim Lmp As Byte ' letzter Menüpunkt Dim Rmp As Byte ' Rechenvariable für 2.Menü Dim Amin As Byte ' Arbeitsvariable Minuten Dim Asek As Byte ' Arbeitsvariable Sekunden Dim Umin As Byte ' Übergabevariable Minuten für LCD Dim Usek As Byte ' Übergabevariable Sekunden für LCD Dim Aktiv As Byte ' Aktive Sequenz für Änderungen oben/unten - 0=Startanzeige, 1=Menü, 2=Minuten, 3=Sekunden, 4=Speichern, 5=Belichten, 6=Autostop Dim Dz As Byte ' Durchlaufzähler für Schnelldurchlauf Werteänderungen Dim Startstop As Byte ' Arbeitsvariable 1=Start, 0=Stop Dim Countdown As Byte ' Arbeitsvariable 1=Start, 0=Stop '***** Variablen für Eeprom Dim Ee_min(3) As Eram Byte ' Array für Minuten - 1=Bungard, 2=Folie, 3=Manuell Dim Ee_sek(3) As Eram Byte ' Array für Sekunden - 1=Bungard, 2=Folie, 3=Manuell '***** bei erstmaligen Start Eeprom initialisieren If Ee_min(1) = 255 Then Ee_min(1) = 0 ' Werte für Bungard Ee_sek(1) = 40 Ee_min(2) = 3 ' Werte für Folie Ee_sek(2) = 0 Ee_min(3) = 10 ' Werte für Manuell Ee_sek(3) = 5 End If '***** Starteinstellungen Bel_rot = 0 ' Rote Beleuchtung AUS Bel_weiss = 0 ' Weiße Beleuchtung AUS Anzeige_rot = 1 ' NEGATIVE LOGIC !!! - AUS Anzeige_gruen = 1 ' NEGATIVE LOGIC !!! - AUS Anzeige_blau = 1 ' NEGATIVE LOGIC !!! - AUS Alive = 1 Umin = 0 Usek = 0 Mp = 1 Lmp = 1 Aktiv = 0 Dz = 0 Startstop = 0 Countdown = 0 Lcd_backlight = 1 Cls Locate 1 , 1 ' Startanzeige mit Versionsnummer Lcd "Belichtungspult " Locate 2 , 1 Lcd "Vers.8 26.02.19 " Wait 1 Sound Portd.1 , 300 , 700 Alive = 1 Umin = Ee_min(mp) Usek = Ee_sek(mp) Anzeige_gruen = 0 'NEGATIVE LOGIC - LED-Anzeige Betriebsbereit '############################################################### ' Hauptprogramm '############################################################### Do ' Start des Hauptprogramms in Endlosschleife Adcval = Getadc(0) ' ADC-Wert von Tastermatrix If Adcval < 1000 Then ' wenn Wert innerhalb des erlaubten Bereiches Auswahl = Adcval ' ADC-Wert in Arbeitsvariable kopieren Gosub Tasterauswertung End If If Mp = 11 Or Mp = 12 Or Mp = 13 And Aktiv = 4 Then ' nach dem Speichern eines neuen Wertes oder Abbruch Aktiv = 1 ' wieder ins Hauptmenü zum entsprechenden Menüpunkt, Mp = Mp - 10 ' dessen Wert gespeichert wurde Umin = Ee_min(mp) ' Werte neu holen Usek = Ee_sek(mp) Cls Gosub Lcd_anzeige Anzeige_blau = 1 ' NEGATIVE LOGIC !!! - AUS Anzeige_gruen = 0 ' NEGATIVE LOGIC !!! - LED-Anzeige Betriebsbereit End If If Countdown = 1 Then ' Countdown nur bei Menüpunkten 1-3 If Umin > 0 Or Usek > 0 Then Usek = Usek - 1 If Usek = 255 Then Umin = Umin - 1 Usek = 59 End If If Umin < 10 Then ' wenn Wert einstellig, dann eine 0 davorsetzen Lcd "0" Lcd Umin Else Lcd Umin End If Lcd ":" If Usek < 10 Then ' wenn Wert einstellig, dann eine 0 davorsetzen Lcd "0" Lcd Usek Else Lcd Usek End If Gosub Lcd_anzeige If Umin = 0 And Usek < 10 Then Sound Portd.1 , 400 , 700 ' Ton während der letzten 10 Sekunden Else ' wenn Countdown abgelaufen Relais_uv = 0 ' UV-Licht ausschalten Startstop = 0 ' Countdownroutine ausschalten Anzeige_rot = 1 ' NEGATIVE LOGIC Anzeige_gruen = 0 ' NEGATIVE LOGIC - LED-Anzeige Betriebsbereit Sound Portd.1 , 2000 , 550 Locate 2 , 1 Lcd " Fertig !!! " Disable Timer1 Aktiv = 6 End If Countdown = 0 End If Waitms 100 Toggle Alive ' läuft das Programm noch? Loop ' Schleife wieder von Vorn End '############################################################### ' Ende Hauptprogramm '############################################################### '############################################################### ' Unterprogramm Tasterauswertung '############################################################### Tasterauswertung: Select Case Auswahl ' jeweils eigener ADC-Messwert mit Toleranz '------------------------------------------------------------------------------------------------- Case Is < 160 ' TASTE 1 - Menü If Aktiv = 0 Or Aktiv = 6 Then ' Anzeige des 1.Menüpunktes nach Start oder letzten nach Belichtung fertig Aktiv = 1 Mp = Lmp Umin = Ee_min(mp) Usek = Ee_sek(mp) End If Gosub Lcd_anzeige '------------------------------------------------------------------------------------------------- Case Is < 290 ' TASTE 2 - nach unten If Aktiv = 1 And Mp < 5 Then ' Bewegen im Hauptmenü Mp = Mp + 1 ' nächsten Menüpunkt Lmp = Mp ' letzten Menüpunkt vom Hauptmenü merken If Mp < 4 Then ' gespeicherte Werte für Menüpunkt abrufen Umin = Ee_min(mp) Usek = Ee_sek(mp) End If Gosub Lcd_anzeige Elseif Aktiv = 1 And Mp = 11 Or Mp = 12 Then ' Bewegen im Menü 2 Mp = Mp + 1 ' nächsten Menüpunkt Rmp = Mp - 10 ' gespeicherte Werte für Menüpunkt abrufen Umin = Ee_min(rmp) Usek = Ee_sek(rmp) Gosub Lcd_anzeige End If If Aktiv = 2 Then ' Ändern Minuten Do Umin = Umin - 1 ' Minuten Minus 1 If Umin = 255 Then Umin = 59 Locate 1 , 12 ' neuen Minutenwert anzeigen If Umin < 10 Then ' wenn Wert einstellig, dann eine 0 davorsetzen Lcd "0" Lcd Umin Else Lcd Umin End If Dz = Dz + 1 ' nach 5sek. Schnelldurchlauf If Dz < 5 Then Waitms 500 Else Waitms 200 End If Adcval = Getadc(0) ' ADC-Wert von Tastermatrix Loop Until Adcval > 1000 ' wenn Taste noch gehalten wird Dz = 0 End If If Aktiv = 3 Then ' Ändern Sekunden Do Usek = Usek - 1 ' Sekunden Minus 1 If Usek = 255 Then Usek = 59 Locate 1 , 15 ' neuen Minutenwert anzeigen If Usek < 10 Then ' wenn Wert einstellig, dann eine 0 davorsetzen Lcd "0" Lcd Usek Else Lcd Usek End If Dz = Dz + 1 ' nach 5sek. Schnelldurchlauf If Dz < 5 Then Waitms 500 Else Waitms 200 End If Adcval = Getadc(0) ' ADC-Wert von Tastermatrix Loop Until Adcval > 1000 ' wenn Taste noch gehalten wird Dz = 0 End If '------------------------------------------------------------------------------------------------- Case Is < 420 ' TASTE 3 - nach oben If Aktiv = 1 And Mp > 1 And Mp < 6 Then ' Bewegen im Hauptmenü Mp = Mp - 1 ' vorherigen Menüpunkt Lmp = Mp ' letzten Menüpunkt vom Hauptmenü merken If Mp < 4 Then ' gespeicherte Werte für Menüpunkt abrufen Umin = Ee_min(mp) Usek = Ee_sek(mp) End If Gosub Lcd_anzeige Elseif Aktiv = 1 And Mp = 12 Or Mp = 13 Then ' Bewegen im Menü 2 Mp = Mp - 1 ' vorherigen Menüpunkt Rmp = Mp - 10 ' gespeicherte Werte für Menüpunkt abrufen Umin = Ee_min(rmp) Usek = Ee_sek(rmp) Gosub Lcd_anzeige End If If Aktiv = 2 Then ' Ändern Minuten Do Umin = Umin + 1 If Umin = 60 Then Umin = 0 ' Minuten Plus 1 Locate 1 , 12 ' neuen Minutenwert anzeigen If Umin < 10 Then ' wenn Wert einstellig, dann eine 0 davorsetzen Lcd "0" Lcd Umin Else Lcd Umin End If Dz = Dz + 1 ' nach 5sek. Schnelldurchlauf If Dz < 5 Then Waitms 500 Else Waitms 200 End If Adcval = Getadc(0) ' ADC-Wert von Tastermatrix Loop Until Adcval > 1000 ' wenn Taste noch gehalten wird Dz = 0 End If If Aktiv = 3 Then ' Ändern Sekunden Do Usek = Usek + 1 ' Sekunden Plus 1 If Usek = 60 Then Usek = 0 Locate 1 , 15 ' neuen Minutenwert anzeigen If Usek < 10 Then ' wenn Wert einstellig, dann eine 0 davorsetzen Lcd "0" Lcd Usek Else Lcd Usek End If Dz = Dz + 1 ' nach 5sek. Schnelldurchlauf If Dz < 5 Then Waitms 500 Else Waitms 200 End If Adcval = Getadc(0) ' ADC-Wert von Tastermatrix Loop Until Adcval > 1000 ' wenn Taste noch gehalten wird Dz = 0 End If '------------------------------------------------------------------------------------------------- Case Is < 550 ' TASTER 4 - Select If Aktiv = 1 And Mp = 5 Then ' Wenn "Werte neu setzen" ausgewählt Anzeige_gruen = 1 ' NEGATIVE LOGIC !!! - AUS Anzeige_blau = 0 ' NEGATIVE LOGIC !!! - LED-Anzeige Speichermodus Mp = 11 ' Sprung in 1. Eintrag des 2.Menüs Rmp = Mp - 10 ' gespeicherte Werte für Menüpunkt anzeigen Umin = Ee_min(rmp) Usek = Ee_sek(rmp) Gosub Lcd_anzeige Elseif Mp = 11 Or Mp = 12 Or Mp = 13 And Aktiv = 1 Then ' Umschalten auf Änderung Minuten Aktiv = 2 Elseif Mp = 11 Or Mp = 12 Or Mp = 13 And Aktiv = 2 Then ' Umschalten auf Änderung Sekunden Aktiv = 3 Elseif Mp = 11 Or Mp = 12 Or Mp = 13 And Aktiv = 3 Then ' Speichern der neuen Werte Aktiv = 4 Ee_min(rmp) = Umin Ee_sek(rmp) = Usek End If Gosub Lcd_anzeige '------------------------------------------------------------------------------------------------- Case Is < 680 ' TASTER 5 - Start/Stop If Aktiv = 1 And Mp < 4 And Startstop = 0 Then ' Start nur aus dem Hauptmenü möglich Anzeige_gruen = 1 ' NEGATIVE LOGIC !!! - AUS Anzeige_rot = 0 ' NEGATIVE LOGIC !!! - LED-Anzeige Belichtung Lmp = Mp Aktiv = 5 Startstop = 1 ' Countdownroutine für Menüpunkte 1-3 starten Bel_weiss = 0 ' Wenn Weißlicht an, dann ausschalten Bel_rot = 0 ' Wenn Rotlicht an, dann ausschalten Relais_uv = 1 ' UV-Licht einschalten Sound Portd.1 , 400 , 650 Locate 2 , 1 Lcd " UV starten ! " Wait 3 ' Wartezeit, bis alle Röhren sicher leuchten Enable Timer1 ' Timer für Sekundentakt starten Locate 2 , 1 Lcd " Belichten ! " Elseif Aktiv = 1 And Mp = 4 Then Anzeige_gruen = 1 ' NEGATIVE LOGIC !!! - AUS Anzeige_rot = 0 ' NEGATIVE LOGIC !!! - LED-Anzeige Belichtung Lmp = Mp Aktiv = 5 Bel_weiss = 0 ' Wenn Weißlicht an, dann ausschalten Bel_rot = 0 ' Wenn Rotlicht an, dann ausschalten Relais_uv = 1 ' UV-Licht einschalten Sound Portd.1 , 400 , 650 Locate 2 , 1 Lcd " UV starten ! " Wait 3 ' Wartezeit, bis alle Röhren sicher leuchten Enable Timer1 ' Timer für Sekundentakt starten Locate 2 , 1 Lcd " Belichten ! " Elseif Aktiv = 5 And Mp < 4 And Startstop = 1 Then ' Belichtung abbrechen Disable Timer1 Aktiv = 6 Countdown = 0 Relais_uv = 0 ' UV-Licht ausschalten Startstop = 0 ' Countdownroutine für Menüpunkte 1-3 abbrechen Anzeige_rot = 1 ' NEGATIVE LOGIC !!! - AUS Anzeige_gruen = 0 ' NEGATIVE LOGIC !!! - LED-Anzeige Betriebsbereit Sound Portd.1 , 400 , 650 Locate 2 , 1 Lcd " Abgebrochen ! " Elseif Aktiv = 5 And Mp = 4 Then Aktiv = 6 Countdown = 0 Relais_uv = 0 ' UV-Licht ausschalten Anzeige_rot = 1 ' NEGATIVE LOGIC !!! - AUS Anzeige_gruen = 0 ' NEGATIVE LOGIC !!! - LED-Anzeige Betriebsbereit Sound Portd.1 , 400 , 650 Locate 2 , 1 Lcd " Abgebrochen ! " Elseif Mp = 11 Or Mp = 12 Or Mp = 13 Then ' Abbruch der Eingabe eines neuen Wertes ohne Speicherung If Aktiv > 0 Or Aktiv < 4 Then Aktiv = 4 End If End If Do Adcval = Getadc(0) ' ADC-Wert von Tastermatrix Loop Until Adcval > 1000 ' wenn Taste noch gehalten wird '------------------------------------------------------------------------------------------------- Case Is < 810 ' TASTER 6 - Rote Beleuchtung If Aktiv = 1 Then ' Einschalten nur während des Hauptmenüs If Bel_rot = 0 And Bel_weiss = 0 Then ' Nur LED-Band ROT einschalten Bel_rot = 1 Elseif Bel_rot = 1 And Bel_weiss = 0 Then Bel_rot = 0 End If Do ' warten auf Loslassen der Taste, damit der Auswahlbefehl nicht wiederholt wird Adcval = Getadc(0) Loop Until Adcval > 1000 ' weiter, wenn Taster losgelassen End If '------------------------------------------------------------------------------------------------- Case Is < 940 ' TASTER 7 - Weiße Beleuchtung If Aktiv = 1 Then ' Einschalten nur während des Hauptmenüs If Bel_weiss = 0 And Bel_rot = 0 Then ' LED-Band RBG einschalten Bel_rot = 1 Bel_weiss = 1 Elseif Bel_weiss = 1 Then Bel_rot = 0 Bel_weiss = 0 End If Do ' warten auf Loslassen der Taste, damit der Auswahlbefehl nicht wiederholt wird Adcval = Getadc(0) Loop Until Adcval > 1000 ' weiter, wenn Taster losgelassen End If '------------------------------------------------------------------------------------------------- End Select Return '############################################################### ' LCD Anzeige für Menüpunkte '############################################################### Lcd_anzeige: Locate 1 , 1 Lcd Lookupstr(mp , Data_menue) ' Menüpunkt anzeigen If Mp < 4 Or Mp = 11 Or Mp = 12 Or Mp = 13 Then If Umin < 10 Then Lcd "0" Lcd Umin Else Lcd Umin End If Lcd ":" If Usek < 10 Then ' wenn Wert einstellig, dann eine 0 davorsetzen Lcd "0" Lcd Usek Else Lcd Usek End If Else Lcd " " End If If Aktiv = 1 And Startstop = 0 Then Locate 2 , 1 Mp2 = Mp + 20 Lcd Lookupstr(mp2 , Data_menue) ' Wahlmöglichkeit zum Menüpunkt anzeigen Elseif Aktiv = 1 And Startstop = 1 Then Locate 2 , 1 Lcd " Belichtung !! " Elseif Aktiv = 2 Then Locate 2 , 1 Lcd "Min " Lcd Chr(0) ; " " ; Chr(1) ; " Select " ' Wahlmöglichkeit zum Menüpunkt anzeigen Elseif Aktiv = 3 Then Locate 2 , 1 Lcd "Sek " Lcd Chr(0) ; " " ; Chr(1) ; " Select " ' Wahlmöglichkeit zum Menüpunkt anzeigen End If If Aktiv = 4 Then Locate 1 , 1 ' Bestätigung für Speichern Lcd "OK - weiter im" Locate 2 , 1 Lcd " Hauptmen" ; Chr(245) ; " !!! " Wait 3 End If Waitms 200 Return '############################################################### ' Interrupt Service Routine Timer 1 '############################################################### Isr_timer1: Timer1 = Timer1_preload ' Timer zurücksetzen Countdown = 1 ' Countdown erlaubt Return '############################################################### ' Daten für Menü '############################################################### Data_menue: Data "" , "Bungard " , "Folie " , "Manuell " , "Dauerlicht " , "Werte neu setzen" , "" , "" , "" , "" , "" Data "N-Bungard " , "N-Folie " , "N-Manuell " , "" , "" , "" , "" , "" , "" , "" Data "Start-Auto-Stop" , "Start-Auto-Stop" , "Start-Auto-Stop" , "Start-Stop " , " Select " , "" , "" , "" , "" , "" Data " Select " , " Select " , " Select "