![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
'############################################################### '* '* ADC-Test 3 by Willie '* '* Schaltung: LCD 16x2, 4 Bit-Modus; Anschluss s.Config Lcdpin '* Vcc und AVcc auf +5V; Pins 8 & 22 auf GND; 100nF Kerkos zwischen Vcc, ARef, AVcc und GND bzw.AGND '* ca. 1nF zwischen ADC0 und AGND (geplant) '* "alive"-LED mit Vorwiderstand 1k zwischen Portc.3 (Pin 26) und GND '* Spannungsteiler Poti 10k; Schaltung:: '* '* AVcc---Poti---Schleifer Poti---Poti---AGND '* l '* ADC0 (Pin23) '* '* '* Erweiterung des Ursprungsprogramms mit: '* '* Anzeige der Zwischenschritte innerhalb der Blocks '* Nur änderungsrelevante Blocks behandeln '* '############################################################### '***** Genutzter Microcontroller, Takt in Hz, Stacks & Framesize $regfile = "m8adef.dat" ' ATMegaA8; Stacks etc.automatisch aus Bascom übernommen $crystal = 8000000 ' auf 8 MHz eingestellt (Fuse-Bits!) $hwstack = 40 $swstack = 16 $framesize = 32 '***** Portpin-Configs & Interrupts Config Portc.3 = Output ' "alive"-LED (läuft das Programm noch?) Alive Alias Portc.3 '***** ADC konfigurieren Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC mit Ref 5 V '***** LCD konfigurieren Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.7 , Rs = Portb.6 Config Lcd = 16x2 '***** eigene Characters konfigurieren Deflcdchar 0 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 ' replace [x] with number (0-7) Deflcdchar 1 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 31 ' replace [x] with number (0-7) Deflcdchar 2 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 31 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 4 , 32 , 32 , 32 , 32 , 31 , 31 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 5 , 32 , 32 , 32 , 31 , 31 , 31 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 6 , 32 , 32 , 31 , 31 , 31 , 31 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 7 , 32 , 31 , 31 , 31 , 31 , 31 , 31 , 31 ' replace [x] with number (0-7) '***** Variablen Dim I As Byte ' Zählvariable Dim Adcval As Word ' ADC-Wert Dim Adcval_old As Word ' alter ADC-Wert Dim Adcval_rest As Word ' Hausaufgabe Dim Anzahl_blocks As Word ' Anzahl der Bargraph-Zeichen Dim Anzahl_blocks_old As Word ' alte Anzahl der Bargraph-Zeichen Dim Anzahl_zeilen As Word ' Anzahl der Zeilen im Bargraph-Zeichen Dim C As Byte ' Position des Cursors Dim Diff As Byte ' Alt/Neu Differenz der Blocks Alive = 1 ' "alive"-LED einschalten '***** Hauptprogramm Cls ' LCD leeren/initialisieren und Programmnamen ausgeben Cursor Off Noblink Locate 1 , 4 Lcd "ADC-Test 3" Locate 2 , 4 Lcd "by Willie" Waitms 200 '****** Permanenten Namen für den Abfragewert anzeigen Cls Lcd "ADC-Wert = "; Adcval '****** Ständige Prüfung der Potistellung und ggf. Anpassen der Anzeige Do Adcval = Getadc(0) ' ADC-Wert holen If Adcval <> Adcval_old Then ' nur rechnen, wenn neuer ADC-Wert vorliegt Locate 1 , 12 Lcd Adcval ; Spc(3) ' Ausgabe des ADC-Werts in der ersten Zeile,gefolgt von 3 Leerzeichen Anzahl_blocks = Adcval / 63 ' Anzahl der Bargraph-Zeichen berechnen Adcval_rest = Adcval Mod 63 Anzahl_zeilen = Adcval_rest / 7.9 ' Anzahl der Zeilen im Sonder-Zeichen berechnen If Anzahl_blocks < Anzahl_blocks_old Then ' wenn neuer ADC-Wert kleiner ist Diff = Anzahl_blocks_old - Anzahl_blocks 'Differenz ermitteln End If If Anzahl_blocks > Anzahl_blocks_old Then ' wenn neuer ADC-Wert größer ist Diff = Anzahl_blocks - Anzahl_blocks_old 'Differenz ermitteln C = Anzahl_blocks_old + 1 'Cursorposition bestimmen Locate 2 , C For I = 0 To Diff 'Fehlende Blocks Hinzufügen Lcd Chr(255) Next I End If C = Anzahl_blocks + 1 'Cursorposition bestimmen Locate 2 , C Lcd Chr(anzahl_zeilen) 'selbstdefiniertes Zeichen entsprechend der errechneten Zeilenanzahl ausgeben Lcd Spc(16) 'event. vorhandene Altzeichen überschreiben Adcval_old = Adcval 'neuen ADC-Wert merken End If Toggle Alive '"alive"-LED umschalten Waitms 20 ' kleine Pause Loop End |
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
****** '############################################################### 'Zeilentest mit LCD-Anzeige für ATMega8 ' 'Schaltung: LCD 16x2, 4 Bit-Modus; Anschluss s.Config Lcdpin 'Vcc und AVcc auf +5V; Pins 8 & 22 auf GND; 100nF Kerkos zwischen Vcc, ARef, AVcc und GND bzw.AGND '"alive"-LED mit Vorwiderstand 1k zwischen Portc.3 (Pin 26) und GND ' 'Programm zum Austesten der Überlaufeigenheiten des LCD '############################################################### '***** Genutzter Microcontroller, Takt in Hz, Stacks & Framesize $regfile = "m8adef.dat" ' ATMegaA8; Stacks etc.automatisch aus Bascom übernommen $crystal = 8000000 ' auf 8 MHz eingestellt (Fuse-Bits!) $hwstack = 40 $swstack = 16 $framesize = 32 '***** Portpin-Configs & Interrupts Config Portc.3 = Output ' "alive"-LED (läuft das Programm noch?) '**** LCD Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.7 , Rs = Portb.6 Config Lcd = 16x2 'Config Lcd = 20x4 '***** Aliaszuweisungen Alive Alias Portc.3 '***** Variablen Dim I As Byte ' Standard-Zählvariable Dim A As Word 'Zeichenvariable A = 65 Alive = 1 '***** Hauptprogramm Cls Cursor Off Noblink Lcd "Zeilentest" Waitms 100 Cls Locate 1 , 1 Do Lcd Chr(a) Waitms 5 A = A + 1 Toggle Alive Loop 'For I = 1 To 41 ' Lcd Chr(a) ' Waitms 5 ' Toggle Alive 'Next I 'Locate 1 , 1 'Lcd "fertig " End ****** |
Das heißt, das LCD 16x2 ist nur eine abgespeckte Anzeigeversion des LCD 20x4!
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
'############################################################### '* '* ADC-Test 3 by Willie '* '* Schaltung: LCD 20x4, 4 Bit-Modus; Anschluss s.Config Lcdpin '* Vcc und AVcc auf +5V; Pins 8 & 22 auf GND; 100nF Kerkos zwischen Vcc, ARef, AVcc und GND bzw.AGND '* ca. 1nF zwischen ADC0 und AGND (geplant) '* "alive"-LED mit Vorwiderstand 1k zwischen Portc.3 (Pin 26) und GND '* Spannungsteiler Poti 10k; Schaltung:: '* '* AVcc---Poti---Schleifer Poti---Poti---AGND '* l '* ADC0 (Pin23) '* '* Erweiterung des Ursprungsprogramms mit: '* '* Anzeige der Zwischenschritte innerhalb der Blocks '* Nur änderungsrelevante Blocks behandeln '* Wechsel auf LCD 20x4, 4 Bit-Modus '* '############################################################### '***** Genutzter Microcontroller, Takt in Hz, Stacks & Framesize $regfile = "m8adef.dat" ' ATMegaA8; Stacks etc.automatisch aus Bascom übernommen $crystal = 8000000 ' auf 8 MHz eingestellt (Fuse-Bits!) $hwstack = 40 $swstack = 16 $framesize = 32 '***** Portpin-Configs & Interrupts Config Portc.3 = Output ' "alive"-LED (läuft das Programm noch?) Alive Alias Portc.3 '***** ADC konfigurieren Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC mit Ref 5 V '***** LCD konfigurieren Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.7 , Rs = Portb.6 Config Lcd = 20x4 '***** eigene Characters konfigurieren Deflcdchar 0 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 ' replace [x] with number (0-7) Deflcdchar 1 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 31 ' replace [x] with number (0-7) Deflcdchar 2 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 31 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 4 , 32 , 32 , 32 , 32 , 31 , 31 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 5 , 32 , 32 , 32 , 31 , 31 , 31 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 6 , 32 , 32 , 31 , 31 , 31 , 31 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 7 , 32 , 31 , 31 , 31 , 31 , 31 , 31 , 31 ' replace [x] with number (0-7) '***** Variablen Dim I As Byte ' Zählvariable Dim Adcval As Word ' ADC-Wert Dim Adcval_old As Word ' alter ADC-Wert Dim Adcval_rest As Word ' Hausaufgabe Dim Anzahl_blocks As Word ' Anzahl der Bargraph-Zeichen Dim Anzahl_blocks_old As Word ' alte Anzahl der Bargraph-Zeichen Dim Anzahl_zeilen As Word ' Anzahl der Zeilen im Bargraph-Zeichen Dim C As Byte ' Position des Cursors Dim L As Byte ' Anzahl der Leerstellen Dim Diff As Byte ' Alt/Neu Differenz der Blocks Alive = 1 ' "alive"-LED einschalten '***** Hauptprogramm Cls ' LCD leeren/initialisieren und Programmnamen ausgeben Cursor Off Noblink Locate 1 , 5 Lcd "ADC-Test 3" Locate 2 , 5 Lcd "by Willie" Waitms 200 '****** Permanenten Namen für den Abfragewert anzeigen Locate 3 , 1 Lcd "ADC-Wert = " ; Adcval '****** Ständige Prüfung der Potistellung und ggf. Anpassen der Anzeige Do Adcval = Getadc(0) ' ADC-Wert holen If Adcval <> Adcval_old Then ' nur rechnen, wenn neuer ADC-Wert vorliegt Locate 3 , 12 Lcd Adcval ; " " ' Ausgabe des ADC-Werts in der ersten Zeile,gefolgt von 3 Leerzeichen Anzahl_blocks = Adcval / 51.15 ' Anzahl der Bargraph-Zeichen berechnen Adcval_rest = Adcval Mod 51.15 Anzahl_zeilen = Adcval_rest / 6.6 ' Anzahl der Zeilen im Sonder-Zeichen berechnen If Anzahl_blocks < Anzahl_blocks_old Then ' wenn neuer ADC-Wert kleiner ist Diff = Anzahl_blocks_old - Anzahl_blocks 'Differenz ermitteln End If If Anzahl_blocks > Anzahl_blocks_old Then ' wenn neuer ADC-Wert größer ist Diff = Anzahl_blocks - Anzahl_blocks_old 'Differenz ermitteln C = Anzahl_blocks_old + 1 'Cursorposition bestimmen Locate 4 , C For I = 1 To Diff 'Fehlende Blocks Hinzufügen Lcd Chr(255) Next I End If If Anzahl_blocks < 20 Then 'wenn weniger als 20 Blocks, dann selbstdefiniertes Zeichen entsprechend der errechneten Zeilenanzahl anfügen C = Anzahl_blocks + 1 'Cursorposition bestimmen Locate 4 , C Lcd Chr(anzahl_zeilen) 'selbstdefiniertes Zeichen ausgeben If Anzahl_blocks < 19 Then 'wenn weniger als 20 Blocks, dann Leerzeichen anfügen C = Anzahl_blocks + 2 'Cursorposition bestimmen Locate 4 , C L = 19 - Anzahl_blocks 'Anzahl Leerzeichen bestimmen (L = 20 - Blocks - Sonderzeichen) For I = 0 To L 'event. vorhandene Altzeichen überschreiben Lcd Chr(0) Next I Locate 4 , 1 'Cursorposition bestimmen, damit der Cursor nicht in Zeile 1 springt End If End If End If Adcval_old = Adcval 'neuen ADC-Wert merken Anzahl_blocks_old = Anzahl_blocks 'neue Blockanzahl merken Toggle Alive '"alive"-LED umschalten Waitms 20 ' kleine Pause Loop End |
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
'############################################################### '* '* ADC-Test 4 by Willie '* '* Schaltung: LCD 20x4, 4 Bit-Modus; Anschluss s.Config Lcdpin '* Vcc und AVcc auf +5V; Pins 8 & 22 auf GND; 100nF Kerkos zwischen Vcc, ARef, AVcc und GND bzw.AGND '* ca. 1nF zwischen ADC0 und AGND (geplant) '* "alive"-LED mit Vorwiderstand 1k zwischen Portc.3 (Pin 26) und GND '* Spannungsteiler Poti 10k; Schaltung:: '* '* AVcc---Poti---Schleifer Poti---Poti---AGND '* l '* ADC0 (Pin23) '* '* Erweiterung des Ursprungsprogramms mit: '* '* Anzeige der Zwischenschritte innerhalb der Blocks '* Nur änderungsrelevante Blocks behandeln '* Wechsel auf LCD 20x4, 4 Bit-Modus '* Optimierung des Codes '* '############################################################### '***** Genutzter Microcontroller, Takt in Hz, Stacks & Framesize $regfile = "m8adef.dat" ' ATMegaA8; Stacks etc.automatisch aus Bascom übernommen $crystal = 8000000 ' auf 8 MHz eingestellt (Fuse-Bits!) $hwstack = 40 $swstack = 16 $framesize = 32 '***** Portpin-Configs & Interrupts Config Portc.3 = Output ' "alive"-LED (läuft das Programm noch?) Alive Alias Portc.3 '***** ADC konfigurieren Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC mit Ref 5 V '***** LCD konfigurieren Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.7 , Rs = Portb.6 Config Lcd = 20x4 '***** eigene Characters konfigurieren Deflcdchar 0 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 ' replace [x] with number (0-7) Deflcdchar 1 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 31 ' replace [x] with number (0-7) Deflcdchar 2 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 31 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 4 , 32 , 32 , 32 , 32 , 31 , 31 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 5 , 32 , 32 , 32 , 31 , 31 , 31 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 6 , 32 , 32 , 31 , 31 , 31 , 31 , 31 , 31 ' replace [x] with number (0-7) Deflcdchar 7 , 32 , 31 , 31 , 31 , 31 , 31 , 31 , 31 ' replace [x] with number (0-7) '***** Variablen Dim I As Byte ' Zählvariable Dim Adcval As Word ' ADC-Wert Dim Adcval_old As Word ' alter ADC-Wert Dim Adcval_rest As Word ' Hausaufgabe Dim Anzahl_blocks As Word ' Anzahl der Bargraph-Zeichen Dim Anzahl_blocks_old As Word ' alte Anzahl der Bargraph-Zeichen Dim Anzahl_zeilen As Word ' Anzahl der Zeilen im Bargraph-Zeichen Dim C As Byte ' Position des Cursors Alive = 1 ' "alive"-LED einschalten '***** Hauptprogramm Cls ' LCD leeren/initialisieren und Programmnamen ausgeben Cursor Off Noblink Locate 1 , 5 Lcd "ADC-Test 4" Locate 2 , 5 Lcd "by Willie" Waitms 200 '****** Permanenten Namen für den Abfragewert anzeigen Locate 3 , 1 Lcd "ADC-Wert = " ; Adcval '****** Ständige Prüfung der Potistellung und ggf. Anpassen der Anzeige Do Adcval = Getadc(0) ' ADC-Wert holen If Adcval <> Adcval_old Then ' nur rechnen, wenn neuer ADC-Wert vorliegt Locate 3 , 12 Lcd Adcval ; " " ' Ausgabe des ADC-Werts in der ersten Zeile,gefolgt von 3 Leerzeichen Anzahl_blocks = Adcval / 51.15 ' Anzahl der Bargraph-Zeichen berechnen Adcval_rest = Adcval Mod 51.15 Anzahl_zeilen = Adcval_rest / 6.6 ' Anzahl der Zeilen im Sonder-Zeichen berechnen If Anzahl_blocks > Anzahl_blocks_old Then ' wenn neuer ADC-Wert größer ist C = Anzahl_blocks_old + 1 'Cursorposition bestimmen Locate 4 , C For I = C To Anzahl_blocks 'Fehlende Blocks Hinzufügen Lcd Chr(255) Next I End If If Anzahl_blocks < 20 Then 'wenn weniger als 20 Blocks, dann selbstdefiniertes Zeichen entsprechend der errechneten Zeilenanzahl anfügen C = Anzahl_blocks + 1 'Cursorposition bestimmen Locate 4 , C Lcd Chr(anzahl_zeilen) 'selbstdefiniertes Zeichen ausgeben For I = C To 20 'event. vorhandene Altzeichen überschreiben Lcd Chr(0) Next I 'selbstdefiniertes Zeichen 0 wird als Leerzeichen benutzt End If End If Adcval_old = Adcval 'neuen ADC-Wert merken Anzahl_blocks_old = Anzahl_blocks 'neue Blockanzahl merken Toggle Alive '"alive"-LED umschalten Waitms 20 ' kleine Pause Loop End |
Das Zitat stammt aus Willies Kommentar zur Umstellung des ATtiny4313; beim ATMega8(A) stellen wir wie gezeigt auf "Int. RC Osc. 8Mhz" um.Der Button "Write FS" wird erst auswählbar NACH der Änderung auf „disabled“ UND dem Anklicken eines beliebigen anderen Feldes der Maske.
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
R2 Taster err. gem. 9k.. - .. 485. 486 8k.. 9 .. 455. 456 7k.. 8 .. 422. 422 6k.. 7 .. 384. 384 5k.. 6 .. 341. 341 4k.. 5 .. 292. 291 3k.. 4 .. 236. 235 2k.. 3 .. 170. 169 1k.. 2 ... 93.. 91 0k.. 1 ... 0 ... 0 "." ist ein Trennzeichen |
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
'############################################################### '* '* WM Blinker 4 für Willie '* '############################################################### '* '* 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) '* ULN2803A an siehe LEDx Alias '* Spannungsteiler aus Festwiderständen; 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 6 Toggle Lcd_backlight Locate 1 , 1 Waitms 300 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 "Los geht's!" 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 < 470 Then ' Wert > Taster 9!! *** eigener Messwert! *** ' Waitms 20 '****** Tasterprellung? ' Adcval = Getadc(3) ' nochmals ADC-Wert holen (muss nicht...) Gosub Tasterauswertung End If 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 |
1 Besucher
Blinker, Blitzer, led, Mikrocontroller, Schrittmotor, Sensor, Servo, Sound, Soundmodul
Forensoftware: Burning Board®, entwickelt von WoltLab® GmbH