![]() |
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 |
'*************************** '* '* ADC-Test '* '*************************** '* '* 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 Portb.1 (Pin 15) und GND '* Spannungsteiler Poti 10k; Schaltung:: '* '* AVcc---Poti---Schleifer Poti---Poti---AGND '* l '* ADC0 (Pin23) '* '***************************************************************************************************** $regfile = "m8adef.dat" ' ATMega8A; Stacks etc.automatisch aus Bascom übernommen $crystal = 8000000 ' auf 8 MHz eingestellt (Fuse-Bits!) $hwstack = 40 $swstack = 16 $framesize = 32 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 Config Portb.1 = Output ' "alive"-LED (läuft das Programm noch?) Alive Alias Portb.1 '***** 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 Alive = 1 ' "alive"-LED einschalten Cls ' LCD leeren/initialisieren und schon mal "festen" Text ausgeben Cursor Off Noblink Locate 1 , 4 Lcd "ADC-Test" Locate 2 , 5 Wait 3 Lcd "by M&Ms" Wait 10 Cls Lcd "ADC-Wert = " ; Adcval Do Adcval = Getadc(0) ' ADC-Wert holen If Adcval <> Adcval_old Then ' nur rechnen, wenn neuer ADC-Wert vorliegt Adcval_old = Adcval Locate 1 , 12 Lcd Adcval ; Spc(3) ' Ausgabe des ADC-Werts in der erstn Zeile,gefolgt von 3 Leerzeichen Anzahl_blocks = Adcval / 61 ' Anzahl der Bargraph-Zeichen berechnen If Anzahl_blocks <> Anzahl_blocks_old Then ' nur bei Änderung neuen Bargraph zeichnen Anzahl_blocks_old = Anzahl_blocks Locate 2 , 1 Lcd Spc(16) ' Zeile löschen Locate 2 , 1 For I = 1 To Anzahl_blocks Lcd Chr(255) ' Block ausgeben Next I End If End If Toggle Alive '"alive"-LED umschalten Waitms 200 ' 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 |
Unser LCD stellt einzelne Zeichen in einer 5x8-Matrix dar. Die unterste Reihe ist normalerweise für den Cursor, den wir aber hier nicht benutzen, gedacht. Mit dem LDC-Designer aus Bascom können wir beliebige Sonderzeichen erstellen. Unser Zeichen Chr(255) sieht so aus ("X" entspricht einem gesetzten, "." einem nicht gesetzten Punkt, "_" dient als Abstandshalter): _12345 1XXXXX 2XXXXX 3XXXXX 4XXXXX 5XXXXX 6XXXXX 7XXXXX 8XXXXX Es liegt also nahe, für die "Verfeinerung" z. B. 4 oder 7 Sonderzeichen mit unterschiedlicher Spalten- oder Zeilenanzahl zu definieren: _12345_______12345 1X....______1XX... 2X....______2XX... 3X....______3XX... 4X....______4XX... 5X....______5XX... 6X....______6XX... 7X....______7XX... 8X....______8XX... usw. oder _12345_______12345 1.....______1..... 2.....______2..... 3.....______3..... 4.....______4..... 5.....______5..... 6.....______6..... 7.....______7XXXXX 8XXXXX______8XXXXX usw. |
![]() |
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 |
'*************************** '* '* ADC-Test '* '*************************** '* '* Schaltung: LCD 16x2 mit I2C-Adapter '* Vcc und AVcc auf +5V; Pins 8 & 22 auf GND; 100nF Kerkos zwischen Vcc, ARef, AVcc und GND bzw.AGND '* ca. 1nF zwischen ADC1 und AGND (geplant) '* "alive"-LED mit Vorwiderstand 1k zwischen Portc.0 (Pin 23) und GND '* Spannungsteiler Poti 10k; Schaltung:: '* '* ARef---Poti---Schleifer Poti---Poti---AGND '* l '* ADC1 (Pin24) '* '***************************************************************************************************** $regfile = "m8adef.dat" ' ATMega8A; Stacks etc.automatisch aus Bascom übernommen $crystal = 8000000 ' auf 8 MHz eingestellt (Fuse-Bits!) $hwstack = 40 $swstack = 16 $framesize = 32 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 Config Portc.0 = Output ' "alive"-LED (läuft das Programm noch?) Alive Alias Portc.0 '***** 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! Alive = 1 ' "alive"-LED einschalten Lcd_backlight = 1 Cls ' LCD leeren/initialisieren und schon mal "festen" Text ausgeben Cursor Off Noblink Locate 1 , 4 Lcd "ADC-Test" Locate 2 , 5 Wait 3 Lcd "by M&Ms" Wait 1 For I = 1 To 30 Toggle Lcd_backlight Locate 1 , 1 Waitms 100 Next I Cls Lcd "ADC-Wert = " ; Adcval Do Adcval = Getadc(1) ' ADC-Wert holen If Adcval <> Adcval_old Then ' nur rechnen, wenn neuer ADC-Wert vorliegt Adcval_old = Adcval Locate 1 , 12 Lcd Adcval ; " " ' Ausgabe des ADC-Werts in der erstn Zeile,gefolgt von 3 Leerzeichen Anzahl_blocks = Adcval / 61 ' Anzahl der Bargraph-Zeichen berechnen If Anzahl_blocks <> Anzahl_blocks_old Then ' nur bei Änderung neuen Bargraph zeichnen Anzahl_blocks_old = Anzahl_blocks Locate 2 , 1 Lcd " " ' Zeile löschen Locate 2 , 1 For I = 1 To Anzahl_blocks Lcd Chr(255) ' Block ausgeben Next I End If End If Toggle Alive '"alive"-LED umschalten Waitms 200 ' 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 |
'############################################################### ' Blinker (16-Kanal) ' ' Betrieb mit nachgeschalteten ULN2803A an 5V ' Portx.x -- ULN2803A -- 1k -- Kathode LED -- Anode LED -- +5V. '############################################################### '***** Genutzter Microcontroller, Takt in Hz, Stacks & Framesize $regfile = "attiny4313.dat" $crystal = 8000000 $hwstack = 40 $swstack = 16 $framesize = 32 '***** Portpin-Configs & Interrupts Config Portb = Output Config Porta.0 = Output Config Porta.1 = Output Config Portd.0 = Output Config Portd.1 = Output Config Portd.2 = Output Config Portd.3 = Output Config Portd.4 = Output Config Portd.5 = Output '***** Aliaszuweisungen Led1 Alias Portb.0 Led2 Alias Portb.1 Led3 Alias Portb.2 Led4 Alias Portb.3 Led5 Alias Portb.4 Led6 Alias Portb.5 Led7 Alias Portb.6 Led8 Alias Portb.7 Led9 Alias Porta.0 Led10 Alias Porta.1 Led11 Alias Portd.0 Led12 Alias Portd.1 Led13 Alias Portd.2 Led14 Alias Portd.3 Led15 Alias Portd.4 Led16 Alias Portd.5 '***** Variablen und weitere Grundeinstellungen Dim I As Byte ' Standard-Zählvariable Dim Led_sequenz(16) As Word ' 16 LED-Sequenzen à 16 Schaltzustände Dim Impuls As Byte ' legt die Impulsdauer fest Dim Sequenz As Byte ' Länge der Sequenz Werte 0 - 15 entsprechen 1 - 16 Sequenzbits '########################################### ' Spielwiese für persönliche Lichtmuster '########################################### Impuls = 150 ' Impulsdauer in Millisekunden Sequenz = 15 ' s. o. Led_sequenz(1) = &B0000000000000001 ' Sequenz wird von hinten nach vorne abgearbeitet 1 = an, 0 = aus Led_sequenz(2) = &B0000000000000010 Led_sequenz(3) = &B0000000000000100 Led_sequenz(4) = &B0000000000001000 Led_sequenz(5) = &B0000000000010000 Led_sequenz(6) = &B0000000000100000 Led_sequenz(7) = &B0000000001000000 Led_sequenz(8) = &B0000000010000000 Led_sequenz(9) = &B0000000100000000 Led_sequenz(10) = &B0000001000000000 Led_sequenz(11) = &B0000010000000000 Led_sequenz(12) = &B0000100000000000 Led_sequenz(13) = &B0001000000000000 Led_sequenz(14) = &B0010000000000000 Led_sequenz(15) = &B0100000000000000 Led_sequenz(16) = &B1000000000000000 '########################################### ' Ende Spielwiese für persönliche Lichtmuster '########################################### ' '***** Testprogramm (Einmaliger Kontrolldurchlauf beim Start, ob das Programm sauber im korrekten 4 x 1-Sekunden-Takt startet) For I = 1 To 4 Led1 = 1 Wait 1 Led1 = 0 Wait 1 Next I '***** Hauptprogramm Do For I = 0 To Sequenz Led1 = Led_sequenz(1).i Led2 = Led_sequenz(2).i Led3 = Led_sequenz(3).i Led4 = Led_sequenz(4).i Led5 = Led_sequenz(5).i Led6 = Led_sequenz(6).i Led7 = Led_sequenz(7).i Led8 = Led_sequenz(8).i Led9 = Led_sequenz(9).i Led10 = Led_sequenz(10).i Led11 = Led_sequenz(11).i Led12 = Led_sequenz(12).i Led13 = Led_sequenz(13).i Led14 = Led_sequenz(14).i Led15 = Led_sequenz(15).i Led16 = Led_sequenz(16).i Waitms Impuls Next I Loop End |
2 Besucher
Blinker, Blitzer, led, Mikrocontroller, Schrittmotor, Sensor, Servo, Sound, Soundmodul
Forensoftware: Burning Board®, entwickelt von WoltLab® GmbH