schaue ich mir später an.
|
|
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!
, der mir diese Ausführung des Programms zur Verfügung gestellt hat.
habe ich den folgenden Adapter für den Atmega 8 benutzt.

|
|
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
|
)
)
2 Besucher
Blinker, Blitzer, led, Mikrocontroller, Schrittmotor, Sensor, Servo, Sound, Soundmodul
Forensoftware: Burning Board®, entwickelt von WoltLab® GmbH