'############################################################### '* '* WM Blinker 5 - Automodus hinzugefügt '* '############################################################### '* '* Schaltung: LCD 16x2 mit I2C-Adapter; Anschluss s.Config SCL/SDA '* Vcc und AVcc auf +5V; Pins 8 & 22 auf GND; 100nF Kerkos zwischen '* Vcc, ARef, AVcc und GND bzw.AGND '* ca. 1nF zwischen ADC3 und AGND (geplant) '* ILN... an siehe LEDx Alias '* Spannungsteiler Schaltung: '* '* AVcc---10k---9 x 1k mit 9 Tastern gg. AGND '* l '* ADC3 (Pin26) '* '############################################################### '***** Genutzter Microcontroller, Takt in Hz, Stacks & Framesize $regfile = "m8adef.dat" ' ATMega8A; Stacks etc.automatisch aus Bascom übernommen $crystal = 8000000 ' auf 8 MHz eingestellt (Fuse-Bits!) $hwstack = 40 $swstack = 16 $framesize = 32 '***** Portpin-Configs, Aliases & Interrupts Config Portb = Output Config Portc.0 = Output Config Portc.1 = Output Config Portc.2 = Output Led0 Alias Portb.1 Led1 Alias Portb.2 Led2 Alias Portb.3 Led3 Alias Portb.4 Led4 Alias Portb.5 Led5 Alias Portc.0 Led6 Alias Portc.1 Led7 Alias Portc.2 '***** ADC konfigurieren Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC mit Ref 5 V '***** 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! '***** Variable Dim I As Byte ' Mehrzweckvariable ;-) Dim Flag As Byte ' Flag s. u. Dim Tasterflags As Byte ' Flagvariable Dim Spalte As Byte ' Spaltennummer Dim Adcval As Word ' ADC-Wert Dim Impuls As Byte ' legt die Impulsdauer fest Const Leer$ = " " ' 12 Leerzeichen (max.Text) Dim Sequenz As Byte ' Länge der Sequenz Werte 0 - 15 entsprechen 1 - 16 Sequenzbits '***** Arrays Config Base = 0 ' erstes Array- Element ist Element(0) Dim Led_aktiv(8) As Word ' aktive Sequenzen Dim Led_sequenz(8) As Word ' 8 LED-Sequenzen à 16 Schaltzustände Dim Led_name$(8) As String * 12 ' Beschreibung, z. B. Blinker; max. 12 Zeichen! '***** Sonderzeichen Deflcdchar 0 , 31 , 17 , 17 , 17 , 17 , 17 , 17 , 31 ' Aus-Symbol Deflcdchar 1 , 32 , 14 , 14 , 14 , 14 , 14 , 14 , 32 ' Ein-Symbol '############################################################### '* '* Spielwiese '* '############################################################### Impuls = 150 ' Impulsdauer in Millisekunden Sequenz = 15 ' s. o. Led_sequenz(0) = &B1111111111111111 Led_sequenz(1) = &B0000111100001111 Led_sequenz(2) = &B0000111100001111 Led_sequenz(3) = &B0000111100001111 Led_sequenz(4) = &B1111000011110000 Led_sequenz(5) = &B0101000001010000 Led_sequenz(6) = &B0001010100010101 Led_sequenz(7) = &B1100110011001100 Led_name$(0) = "Fahrlicht" ' Name - es wird später noch ein Leerzeichen und Ein bzw. Aus angehängt Led_name$(1) = "Blinker re." Led_name$(2) = "Blinker li." Led_name$(3) = "LED 3" Led_name$(4) = "LED 4" Led_name$(5) = "LED 5" Led_name$(6) = "LED 6" Led_name$(7) = "LED 7" '############################################################### '* '* Ende Spielwiese '* '############################################################### Lcd_backlight = 1 Cls ' LCD leeren/initialisieren und schon mal "festen" Text ausgeben Cursor Off Noblink Locate 1 , 3 Lcd "WM Blinker 4" Locate 2 , 1 Wait 1 Lcd "by M&Ms 4 Willie" Wait 1 For I = 1 To 30 Toggle Lcd_backlight Locate 1 , 1 Waitms 100 Next I Cls For I = 1 To 15 Step 2 ' 8 Aus-Symbole schreiben mit einem Leerzeichen Abstand Locate 1 , I Lcd Chr(0) Next I Locate 2 , 1 Lcd "viel Spaß!" Do For I = 0 To Sequenz Led0 = Led_aktiv(0).i Led1 = Led_aktiv(1).i Led2 = Led_aktiv(2).i Led3 = Led_aktiv(3).i Led4 = Led_aktiv(4).i Led5 = Led_aktiv(5).i Led6 = Led_aktiv(6).i Led7 = Led_aktiv(7).i Waitms Impuls Adcval = Getadc(3) ' ADC-Wert holen Select Case Adcval Case Is < Taster99 ' nicht Taster 9 gedrückt (größer ADC 9) Gosub Tasterauswertung Case Is < Taster9 ' Taster 9 gedrückt (Toleranz ADC 9) Gosub Auto_mode End Select Next I Loop End Tasterauswertung: Select Case Adcval Case Is < 100 ' jeweils *** eigenen *** ADC-Messwert mit Toleranz eintragen I = 0 ' I=0 ist Taster 1 Case Is < 180 I = 1 Case Is < 260 I = 2 Case Is < 310 I = 3 Case Is < 360 I = 4 Case Is < 400 I = 5 Case Is < 435 I = 6 Case Is < 470 I = 7. End Select Toggle Tasterflags.i ' schaltet um Flag = Tasterflags.i ' Hilfsvariable s. u. Do Adcval = Getadc(3) Loop Until Adcval > 470 ' Taster losgelassen? Wert s. o.(OK, Korrekt wäre >=...) Waitms 20 ' Tasterprellen abwarten Spalte = I * 2 ' Spaltenwerte: 1, 3, 5 etc.. Daher: Incr Spalte ' 1 addieren (0 -> 1) Locate 1 , Spalte ' Ein- oder Aus-Symbol Lcd Chr(flag) ' Lcd Chr(Tasterflags.i) geht nicht. Warum??? Locate 2 , 1 Lcd Led_name$(i) If Flag = 1 Then Led_aktiv(i) = Led_sequenz(i) Lcd " Ein" ; Leer$ Else Led_aktiv(i) = 0 Lcd " Aus" ; Leer$ End If I = 0 ' I auf 0 bevor in die Sequenzen zurückgesprungen wird Return Auto_mode: Cls For I = 1 To 15 Step 2 ' 8 Aus-Symbole schreiben mit einem Leerzeichen Abstand Locate 1 , I Lcd Chr(0) Next I Locate 2 , 1 Lcd "Auto-Mode" ; Leer$ ' Timer0.& Interrupt aktivieren ******************. Period = 0. Gosub Timer0_isr Do For I = 0 To Sequenz Led0 = Led_aktiv(0).i Led1 = Led_aktiv(1).i Led2 = Led_aktiv(2).i Led3 = Led_aktiv(3).i Led4 = Led_aktiv(4).i Led5 = Led_aktiv(5).i Led6 = Led_aktiv(6).i Led7 = Led_aktiv(7).i Waitms Impuls Adcval = Getadc(3) ' ADC-Wert holen If Adcval < Taster9 Then ' Taster 9 gedrückt (Toleranz ADC 9) I = 0 Exit Loop End If Next I ' ODER LOOPS ZÄHLEN? Ohne Interrupt? Loop Return Timer0_isr: Incr Period Select Case Period Case Period = 1 For I = 0 To 7 Led_aktiv(i) = 0 Next I Case Period = 5 Led_aktiv(0) = Led_sequenz(0) 'cases.*************.. Case Period > 50000 Period = 0 End Select ' LCD aktualisieren ************** I = 0 Return