Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Das Wettringer Modellbauforum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

181

Freitag, 2. September 2016, 06:02

Hallo Modellbaufreunde,

"Resultate! Dem Manne kann geholfen werden!"

Vor einiger Zeit hatten wir gefragt, welche Änderungen/Themen/Effekte Ihr Euch wünscht.
Das Feedback war ... überschaubar. :heul:
Meldungen und auch Fragen sind nach wie vor ausdrücklich erwünscht!

Weil es nach dem Exkurs so schön passt, wird Willies Wunsch als erster erfüllt.
Keine Angst, Timer, Sound, Servos etc. kommen noch!

Willie wünschte sich, die Lichteffekte einzeln an- und ausschalten zu können.

Das ginge im Falle des 8-Kanal Blinkers natürlich mit Tastern an den restlichen Pins. Wir haben aber etwas Neues vor:
Eine kabelgebundene Fernsteuerung mit LCD-Anzeige.

Dazu wechseln wir den Mikrocontroller. Der ATMega8(A) aus dem Einkaufsvorschlag kommt zum Einsatz:


Quelle: Datenblatt atmega8a.pdf

Hier ist das Kerlchen. Ein paar Pins mehr, 22 (ohne Reset) frei programmierbare I/O Pins und eine Besonderheit:
Der ATMega8(A) beherrscht A/D-Wandlung (= ADC = Analog-Digital Conversion).
Das bedeutet, dass er aus einem analogen (Spannungs-) Wert einen digitalen Wert erzeugen kann.
Mit maximal 6 Kanälen, ADCO - ADC5, entsprechend Pins 23 - 28.
Und das mit einer Auflösung von 10 Bit, ensprechend Werten von 0 bis 1023.
Diese Fähigkeit werden wir später benutzen, um Taster abzufragen.

Bevor es zum eigentlichen Projekt geht, schauen wir uns die Wirkungsweise der A/D-Wandlung genauer an.

Wir wollen nun die ADC mit einem 10 kOhm-Potentiometer testen.

Dazu machen wir einen kurzen Ausflug in die Theorie. Kurz. Versprochen!
Ein Potentiometer ist ein regelbarer Widerstand mit drei Anschlüssen. Wenn wir den Widerstand zwischen den äußeren Anschlüssen messen,
so erhalten wir den Nennwiderstand des Potentiometers, hier 10 kOhm. Der mittlere Kontakt ist der Schleifer, der durch das Drehen der Achse verstellt werden kann.
Schließen wir unser Ohmmeter an einen der äußeren Kontakte und den Schleifer an, so lässt sich der Widerstand von 0 bis (hier) 10 kOhm einstellen.
Stellen wir ihn auf 2 kOhm ein und messen dann den Widerstand zwischen Schleifer und dem anderen äußeren Kontakt, werden wir 8 kOhm erhalten (10 - 2 = 8 ).
Wir nutzen das Potentiometer als Spannungsteiler.
Es soll hier ja kurz werden; Interessierten legen wir den Artikel auf Wikipedia ans Herz.

Schließen wir die äußeren Kontakte des Potentiometers an AGND und AVcc, den Schleifer an ADC0 an, so liegt je nach Stellung des Schleifers dort eine Spannung zwischen 0 und 5 V an.
Daraus errechnet der Mega8 den entsprechenden digitalen Wert zwischen 0 und 1023, den wir in unserem Programm nutzen können.
Einfach & kurz, oder?

Ans Steckbrett:
Wir packen den Mega8 auf das Steckbrett und verbinden Reset, Resettaster, Vcc und GND so, wie wir es vom Tiny her kennen.
AUFPASSEN! Die entsprechenden Pins haben jetzt andere Zahlen und liegen an anderen Stellen! Ein Blick auf das Pinout oben hilft. Kondensator nicht vergessen!
Wir haben auch ganz neue Pins: AVcc, AGND (= GND auf der Analogseite) und ARef. Das "A" sagt uns schon, dass es sich hier um die Spannungsversorgung für den Analogteil des Mega8 handelt.
ARef ist die analoge Referenzspannung, die sich je nach verwendetem Microcontroller einstellen lässt. Wir verwenden hier ARef = AVcc = +5 V.
Wir machen es uns einfach und verbinden AVcc mit Vcc und AGND mit GND. Auch hier sollte ein 100 nF Kondensator zwischen AVcc und AGND sowie zwischen ARef und AGND verbaut werden,
sonst wackeln die Messwerte später wie ein Lämmerschwanz (siehe Hausaufgaben).
Das Potentiometer schließen wir mit den äußeren Kontakten an AGND und AVcc, den Schleifer an ADC0 an.
Und schließlich noch die "alive"-LED (dazu später mehr) mit Vorwiderstand 1 kOhm von PB1 (Pin 15) nach GND. Polung beachten.

Hier das Programm. Die Pins für Euren USBASP-Adapter entnehmt Ihr bitte der obigen Abbildung.
Nicht wundern, der Code ist noch für ein 16x2 LCD im 4-Bit Modus geschrieben, da wahrscheinlich noch nicht alle "Mitbauer" bereits den I2C-Adapter haben.
Den braucht Ihr aber spätestens ab dem nächsten Post. Wer schon einen hat, kann natürlich den Code entsprechend ändern.
Wir wollen in der ersten Zeile des Displays den aktuellen, vom Poti eingestellten ADC-Wert numerisch anzeigen lassen und in der zweiten Zeile eine dazu passende Bargraph-Anzeige haben.
Schwer? Nö! :D

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



Fortsetzung folgt

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


182

Freitag, 2. September 2016, 06:03

Fortsetzung:

Was passiert hier?

Zuerst sagen wir dem Compiler, dass wir den ATMega8(A) benutzen werden:
$regfile = "m8adef.dat"
Wer einen Atmega8 einsetzt, schreibt statt m8adef.dat m8def.dat

Die "alive"-LED: Dies ist ein sehr beliebtes Prinzip bei der Programm- und Schaltungsentwicklung, um zu testen, ob ein Programm noch läuft, ob
Unterprogramme auch angesprungen werden oder, oder, oder..
Das ist für dieses kurze Programm sicherlich übertrieben; dennoch wollten wir sie hier vorstellen. Wir definieren sie in den Zeilen 24 und 35:
Config Portb.1 = Output
Alive Alias Portb.1

und schalten sie in Zeile 43, also vor dem eigentlichen Programm, ein:
Alive = 1
Im Hauptprogramm schalten wir sie in Zeile 80 mit
Toggle Alive
um. Das bedeutet, war die Led vorher an, wird sie ausgeschaltet und umgekehrt. Wie ein Lichtschalter.
Im laufenden Programm wird die "alive"-LED also bei jedem Durchlauf der Hauptschleife umgeschaltet und blinkt damit regelmäßig.

Das Wichtige in diesem Programm ist die Nutzung des ADCs. Dazu sagen wir dem Compiler in Zeile 37 mit
Config Adc = Single , Prescaler = Auto , Reference = Avcc
dass wir den ADC mit der Referenzspannung = AVcc (= +5 V) nutzen wollen.
Das tun wir in erstmals in Zeile 59. Mit
Adcval = Getadc(0)
fordern wir den ADC-Wert von Kanal 0 (= Pin 23 -> Schleifer des Potis) an und schreiben ihn in die Variable Adcval.
Um nicht dauernd via Cls und das nachfolgende Neubeschreiben das Display flimmern zu lassen, ändern wir nur die Anzeigeelemente, die sich verändert haben.
Deshalb schreiben wir nach dem Begrüßungstext und anschließendem Cls in Zeile 53:
Lcd "ADC-Wert = " ; Adcval
Da beim Start des Programms oder einem Reset alle Variablen = 0 sind, steht dann in Zeile 1 des LDC "ADC-Wert = 0"
So geben wir in Zeilen 63 und 64 an Position 1,11 den aktuellen ADC-Wert aus, gefolgt von drei Leerzeichen:
Locate 1 , 11
Lcd Adcval ; Spc(3)

Der SPC(x)-Befehl gibt x Leerzeichen aus. Praktisch.
Damit bleibt "ADC-Wert= " stehen und wir überschreiben den Rest der bisherigen Zeichen. Um sicherzugehen, dass da nicht noch ein Rest der maximal vierstelligen
Zahl steht, hängen wir einfach an die aktuelle Ausgabe, die ja mindestens ein Zeichen lang ist, drei Leerzeichen an.
Mit einem alten angezeigten Wert 1023 würde ohne diese Maßnahme bei einem aktuellen ADC-Wert von 35 3523 angezeigt werden.
Die "alten Zeichen" 23 werden aber von den Leerzeichen überschrieben und wir sehen den korrekten Wert: 35
Die zweite Zeile mit dem Bargraphen machen wir ähnlich platt. :!!
Aber zuerst zur Berechnung: Wir haben einen Bereich von 0 - 1023 und 16 Zeichen Platz. Der Bargraph soll bei niedrigen Werten nichts und bei
hohen Werten 16 Zeichen anzeigen. Also 17 Zustände (max. 16 Zeichen und kein Zeichen). 1023 / 17 = 60,18.
Bei einer Ganzzahlendivision schneidet Bascom die Dezimalstellen einfach ab. Ergebnis von 1 / 2 wäre somit 0!
Um eine möglichst gleichmäßige Bargraph-Anzeige zu bekommen, benötigen wir
Werte zwischen 0 und 16. 1023 / 60 ergäbe 17 - zuviel; 1023 / 61 ergibt 16.
Wir teilen also unseren ADC-Wert durch 61 und haben die Anzahl der darzustellenden Zeichen.
Mit
Locate 2,1
LCD SPC(16)
Locate 2,1

In den Zeilen 69 und 70 setzten wir unseren unsichtbaren Cursor an den Anfang der zweiten Zeile und geben mit dem SPC(x)-Befehl 16 Leerzeichen
aus, um danach in den Zeilen 73 bis 75 mit einer Zählschleife die korrekte Anzahl von Zeichen auszugeben:
For I = 1 To Anzahl_blocks
Lcd Chr(255)
Next I

Ihr seht, dass wir anfangen, ab 1 bis zu unserem errechneten Wert zu zählen. Ist dieser Wert 0, so wird nichts ausgegeben, ansonsten das
Zeichen Nr. 255, das einem ausgefüllten Rechteck entspricht.
Dazu benutzen wir den CHR(xxx)-Befehl, den wir ja schon von unseren selbstdefinierten Sonderzeichen kennen.
Die "alive"-LED in Zeile 80 umschalten und schon geht es wieder von vorne los...

Um nicht zu häufig das LCD beschreiben zu müssen, schauen wir in Zeile 61, ob sich der ADC-Wert geändert hat:
If Adcval <> Adcval_old Then
Weicht der aktuelle Wert nicht vom alten Wert ab, so geht es direkt zur "alive"-LED in Zeile 80.
Ansonsten wird der neue ADC-Wert verarbeitet und wird mit
Adcval_old = Adcval
in Zeile 62 zum "neuen" alten Wert. Es folgt die Aktualisierung von Zeile 1 und die Neuberechnung der auzugebenden Zeichen für den Bargraphen in Zeile 2.
Auch hier prüfen wir mit
If Anzahl_blocks <> Anzahl_blocks_old Then
in Zeile 67, ob sich die Anzahl der Bargraph-Zeichen geändert hat.
Wenn ja wie oben: "neue" alte Anzahl und Zeile 2 aktualisieren.
Und weiter zur "alive"-LED in Zeile 80


Den Bargraphen könnte man eleganter aktualisieren, indem man nur die Änderungen zwischen Anzahl_blocks_old und Anzahl_blocks berücksichtigt
und mit dem Locate-Befehl entsprechend Leerzeichen oder Blocks neu schreibt. Versucht es mal!


Viel Spaß!


Hausaufgaben:

  • Ändert die kleine Pause in Zeile 82
  • Entfernt die Kondensatoren auf der Analogseite (nach dem Test wieder einbauen!)
  • Schaltet einen Festwiderstand vor oder/und nach das Potentiometer
  • Testet die ADC-Schaltung mit Festwiderständen (nicht zu kleine Widerstände (< 1 kOhm) nehmen!)
  • Schließt ein zweites Potentiometer an und wertet es aus
  • Schwere Aufgabe: "Verfeinert" die Bargraph-Anzeige mit selbstdefinierten Zeichen


Tipp für selbstdefinierte Zeichen

Wir haben ja schon unseren selbstgebastelten Smiley vorgestellt.
Mit bis zu 8 (CHR(0) - CHR(7) selbstdefinierten Zeichen kann man aber auch etwas Sinnvolleres anstellen:
Verzeiht bitte die Darstellung in Code-Form; nur so können wir uns gewiss sein, dass die Zeichenabstände konstant sind.

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.



Und noch ein Tipp:
Für die spätere Berechnung braucht Ihr den Modulo-Befehl mit folgender Syntax:
var1 = var2 MOD var3
Bei der Ganzzahlendivision verlieren wir ja die Nachkommastellen:
Variable = 54 / 5 -> Variable = 10
Mit dem Modulo-Befehl erhalten wir den nicht mehr teilbaren Rest einer Division:
Variable = 54 MOD 5 -> Variable = 4 (= 54 - 5*10)
Damit könnt Ihr berechnen, welches Sonderzeichen ausgegeben werden soll.
Nicht vegessen: Variablen müssen deklariert werden! (DIM-Befehl)


Das war jetzt viel Neues und auch Eure Hausaufgaben sind umfangreich.
Willie muss sich noch bis zum nächsten offiziellen Post gedulden. Sorry, Willie! :trost:


Schalten Sie auch nächstes Mal wieder ein, wenn sie die M&Ms sagen hören: "Dem Manne kann geholfen werden! Jetzt aber!"

Viele Grüße
Mathias & Micha

Inhaltsverzeichnis aller Projekt-Posts in Post 1
»mac5150« hat folgende Datei angehängt:
  • atmega8a.pdf (5,05 MB - 580 mal heruntergeladen - zuletzt: 14. April 2024, 23:57)

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


183

Dienstag, 6. September 2016, 10:41

Hallo Modellbaufreunde,

"Resultate! Dem Manne kann geholfen werden!" Reloaded

Um Euch einen ganzen Tag Frust zu ersparen, wollen wir hier das letzte Programm mit I2C-LCD-Unterstützung vorstellen.
Ich (Mathias) möchte mich an dieser Stelle ganz herzlich für die Hilfe der Kollegen aus dem Offiziellen Deutschen Bascom Forum bedanken, besonders bei ftelektro!

Zusammenfassung:
  • Wir haben nun eine neue, wesentlich einfacher einzubindende Library für unser I2C-LCD.
  • Sowohl die bisherige als auch die neue Library vertragen den Befehl SPC(x) nicht! Absturz!

Die neue Library namens "YwRobot_Lcd_i2c.lib" könnt Ihr hier ganz unten auf der Seite herunterladen.
Die Lib bitte entpacken und in das Verzeichnis
<Laufwerk>:\Program Files (x86)\MCS Electronics\BASCOM-AVR\LIB
kopieren.


Wie bisher müsst Ihr darauf achten, auf welchem Chip Euer LDC-Adapter basiert:
Die Slave-Adresse ist beim
PCF8574 = 78 = &H4E
PCF8574A = 126 = &H7E

Entweder den I2C-Scanner benutzen oder einfach ausprobieren.

Die Slave-Adresse wird in Zeile 43 des Programms in die Konstante Pcf8574_lcd geschrieben:
Const Pcf8574_lcd = 126

SCL und SDA liegen beim ATMega8(A) auf Pins 28 und 27.
Den Schleifer des Potis schließen wir an ADC1 (Pin 24) an und die "alive"-LED an PC0 (Pin 23).
PC0 könnte auch als ADC0, also ADC-Eingang verwendet werden. Trotz Nutzung der ADC-Funktionalität (Poti an ADC1) können wir PC0 als Ausgang betreiben.

Hier das Programm:

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


I2C und LCD sind jetzt einfacher zu konfigurieren (siehe Zeilen 38 - 49).
Mit der Variablen Lcd_backlight könnt Ihr die Hintergrundbeleuchtung schalten. 1 = an; 0 = aus.
Das wird aber erst durch einen nachfolgenden LCD-Befehl wie z. B. Locate umgesetzt! Siehe Zelen 64 - 68.

Und naturlich wurden alle SPC(x) :!! durch die entsprechende Anzahl von Leerzeichen in Anführungszeichen ersetzt (Zeilen 80 und 86).

Viel Spaß!


Schalten Sie auch nächstes Mal wieder ein, wenn sie die M&Ms sagen hören: "Dem Manne kann geholfen werden! Jetzt aber!"

Viele Grüße
Mathias & Micha

Inhaltsverzeichnis aller Projekt-Posts in Post 1

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


Hubra

Moderator

Beiträge: 11 439

Realname: Michael

Wohnort: Niederdürenbach-Hain

  • Nachricht senden

184

Samstag, 10. September 2016, 20:42

Hallo liebe Bastelgemeinde. :wink:

Ich habe die aktuelle Schaltung auf meinem Steckbrett aufgebaut und ein wenig Farbig markiert.


Den Nullkraftsockel habe ich verwendet, weil wir im Vorfeld den Mikrocontroller des öfteren vom Bord nehmen müssen.

Mit dem Poti kann man die Bargraphanzeige verändern.


Und so sieht die Anzeige davon aus.


Die nachfolgenden Bilder habe ich mit einer anderen Kamera gemacht, dadurch sieht die Farbe vom Display ein wenig anders aus.










Beim nächsten Mal werde ich dann den Aufbau mit 8 Tastern und Festwiderständen vorstellen. :)

Gruß Micha und Mathias.


Inhaltsverzeichnis aller Projekt-Posts in Post 1

Hubra

Moderator

Beiträge: 11 439

Realname: Michael

Wohnort: Niederdürenbach-Hain

  • Nachricht senden

185

Donnerstag, 15. September 2016, 19:11

Hallo liebe Bastelgemeinde. :wink:

Heute gibt es nur ein kleines Update, aber dafür ist es für mich ein Erfolgreiches. :tanz:
Endlich habe ich den ATtiny 4313 mit den 16 Ausgängen zu meiner Zufriedenheit in Betrieb genommen.
Ich habe die Schaltung ohne die ULN 2803 aufgebaut, da es mir nur um die Ausgänge ging.


Aussage kräftiger ist natürlich das nachfolgende Video.
Leider ist es etwas unscharf geworden, aber es geht in diesem Fall ja um den Lichteffekt.



Als nächstes wird es dann wieder um den Atmega 8 mit einer Tastenbelegung gehen.

Gruß Micha und Mathias.


Inhaltsverzeichnis aller Projekt-Posts in Post 1

186

Donnerstag, 15. September 2016, 19:22

Klasse, Micha!

:ok: :ok: :ok:

LG
Mathias

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


Hubra

Moderator

Beiträge: 11 439

Realname: Michael

Wohnort: Niederdürenbach-Hain

  • Nachricht senden

187

Freitag, 16. September 2016, 20:31

Hallo liebe Bastelgemeinde. :wink:

Heute möchte ich Euch mein neues Blaulicht vorstellen, dass von einem ATtiny 4313 angesteuert wird.
Dafür habe ich lediglich 4 von 16 möglichen Ausgängen benutzt.
So bleiben mir immer noch 12 Ausgänge für andere Lichteffekte. :lol:



Weitere Spielereien werden noch folgen. :)

Gruß Micha und Mathias.


Inhaltsverzeichnis aller Projekt-Posts in Post 1

188

Freitag, 30. September 2016, 05:31

WOW!

"Turn on the Love Lights":

Micha hat mit PWM experimentiert und gleichzeitig seine Messgeräte getestet.
Macht Euch schon mal für einen tollen Beitrag bereit. :thumbsup:

Viele Grüße
Mathias

Edit 01.10.2016: Zur Erklärung: PWM ist die Abkürzung für Pulsweitenmodulation. Bisher hatten wir nur LEDs ein- und ausgeschaltet; als Blitzer oder Blinker.
Wenn Ein- und Ausschaltevorgänge sehr schnell hintereinander ausgeführt werden, so nimmt unser Auge dies nicht mehr explizit wahr, sondern sieht eine LED, die einfach nicht so hell wie gewohnt leuchtet.
Gedimmt.Das bedeutet, dass wir bei schnellen Schaltfrequenzen die Helligkeit praktisch von 0 - 100% regeln können. Mit seinen Messgeräten kann Micha das prima zeigen. :ok: :respekt:

Inhaltsverzeichnis aller Projekt-Posts in Post 1

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


Hubra

Moderator

Beiträge: 11 439

Realname: Michael

Wohnort: Niederdürenbach-Hain

  • Nachricht senden

189

Sonntag, 2. Oktober 2016, 15:25

Hallo liebe Bastelgemeinde. :wink:

Wie es Mathias bereits angedroht hat, :lol: möchte ich Euch meine ersten Ergebnisse mit PWM vorstellen.

Im Gegensatz zu den bisherigen Schaltungen bei denen die LED's nur an oder aus geschaltet wurden, werden diese langsam heller oder dunkler.
In diesem Beispiel kann man zwei LED's sehen, die im Wechsel auf und ab schwellen.
Anwenden könnte man den Effekt z.B. bei den älteren Amerikanischen Feuerwehrfahrzeugen oder auch bei der Modelleisenbahn an den Andreaskreuzen am Bahnübergang.

Der Aufbau mit meinen Messgeräten sieht so aus.


Hier sind die beiden LED's zu sehen, die Versorgungsspannung beträgt wie zu sehen 5.0 Volt.


Das Oszilloskop zeigt eine ganze Reihe von Informationen an und ich habe es aus einem günstigen Bausatz zusammen gebaut. :)
Den Staub auf der Scheibe habe ich mittlerweile auch entfernt. :pfeif:


Mit dem Frequenzmesser kann ich auch noch Quarze prüfen.


Damit Ihr das ganze auch in Funktion betrachten könnt, gibt es natürlich auch davon wieder ein Video.


Vielleicht hat ja jemand von Euch auch an dieser Variante Interesse?
Ihr könnt uns gerne auch Fragen dazu in diesem Beitrag stellen. :)

Viel Spaß beim Experimentieren und bis zum nächsten mal.

Gruß Micha und Mathias.


Inhaltsverzeichnis aller Projekt-Posts in Post 1

190

Montag, 3. Oktober 2016, 21:08

Hallo Modellbaufreunde,

"Turn on the Love Lights"

Um es vorweg zu sagen: Ihr braucht Michas Messgerätepark nicht, um im Projekt weiterzukommen!
Natürlich nutzen wir unsere Möglichkeiten aus, um Dinge anschaulich zu erklären. Wer sich das Video angeschaut hat, weiß jetzt genau,
wie PWM grundsätzlich funktioniert.

PWM kann man mit allen ATMEL-Mikrocontrollern realisieren; der ATtiny4313 und der ATMega8(A), die wir für dieses Projekt ausgewählt haben,
unterstützen Hardware-PWM. Dies bedeutet, dass sowohl ein Timer als auch zwei vordefinierte Ausgänge benutzt werden.
Vorteil: Wenig Programmieraufwand und sehr robust. Belastet den Prozessor nicht.
Nachteil: Der Timer ist belegt und eine freie Zuordnung zu anderen Ausgängen ist (fast) nicht möglich.
Der goldene Mittelweg wäre eine Software-PWM, bei der Ihr aber alle Rechenoperationen des µCs beachten müsstet.
Momentan noch zu schwierig - wir kommen aber bald auf dieses Thema zurück.

Also HW-PWM: Ein Timer und zwei vordefinierte (Hardware-) Ausgänge werden benutzt.
Die Qual der Wahl: Nehmen wir den 16-Bit- oder den 8-Bit-Timer?
Mit dem 8-Bit-Timer lassen sich 256 Helligkeitszustände realisieren: 0=Aus, 255=volle Lichtstärke.
Hört sich erst mal gut an, jedoch sind Kennlinie der verwendeten LED und unser Auge eventuell Probleme.
Gerade bei niedrigen, also wenig hellen Lichtintensitätswechseln (ca. < 30 PWM) nehmen wir das als "Stufen" wahr. Unschön.
Unproblematisch ist dagegen ein Lichtintensitätswechsel von mittelhell nach hell. Muss man ausprobieren.
Aber da gibt es noch den 16-Bit-Timer, den wir auf 8, 9 oder 10 Bit (0-1023) einstellen können.
Im "Dunkelbereich" keine "Stufen" mehr zu erkennen. Aber: Der Timer ist nur damit beschäftigt.
Später brauchen wir den 16-Bit-Timer für andere Dinge. Momentan aber nicht. Also gehen wir "'ran an den Speck!"

Wir müssen zuerst den 16-Bit-Timer (Timer 1) für PWM konfigurieren:

Config Timer1 = Pwm , Pwm = 10 , Prescale = 8 , Compare_a_pwm = Clear_up , Compare_b_pwm = Clear_down

Hier sagen wir dem Timer, dass er im PWM-Modus laufen soll (Config Timer1 = Pwm). Und dass er eine 10-Bit-Auflösung haben soll (, Pwm = 10).
Und dass er gewerkschaftsgemäß (nicht zu schnell :D ) arbeiten soll: , Prescale = 8 : Bedeutet, dass Timer 1 nur jeden achten Takt eins hochzählt,
um bei Erreichen der 1023 wierder herunterzuzählen.
Bsirske oder ein anderer Gewernerschafts-Knilch freuen sich, und wir können schon mal die PWM-Frequenz ausrechnen. Augenkrebs oder nicht, das sagt uns:

Mikrocontrollertakt / Prescaler / 10 Bit / 2 (hoch- und runterzählen) =
(8MHz=) 8.000.000Hz/8/1024/2 ~ 489Hz


Die PWM-Frequenz ist also mit dem menschlichen Auge nicht wahrnehmbar (manche Leute sehen bei 60Hz noch ein Flimmern - darum gab es schon früh Fernsehgeräte mit 100 bzw. 120Hz).
OK so. Was nun mit den Ausgängen? Im PWM-Modus von Timer1 werden die Pins 15 und 16 genutzt: OC1A und OC1B (OC steht für Output Compare).
Geben wir den Registern Compare1A und Compare1B (man kann auch pwm1a und pwm1b schreiben) z. B. den Wert 800 vor.
Mit der Einstellung
, Compare_a_pwm = Clear_up , Compare_b_pwm = Clear_down
zählt Timer1 los. Die LED an OC1A leuchtet, bis der Zähler 800 erreicht hat, danach geht sie aus. Der Zähler macht weiter bis 1023 und zählt dann zurück.
Wird wieder die 800 erreicht, leuchtet die LED wieder. Also ca. 80% an und 20% aus. Ziemlich hell.
der Befehl Clear_up ist für dieses Verhalten verantwortlich.
Die LED an OC1B verhält sich aufgrund des Befehls Clear_down invertiert: Also ca. 20% an und 80% aus. Ziemlich dunkel.

Micha hat nun in einer Schleife von 0 - 1023 gezählt und diesen Wert in Compare1A und Compare1B geschrieben.
Die Folge: Die LED an OC1A startet dunkel und wird heller; die LED an OC1B startet hell und wird dunkler.
Das in einer Endlosschleife.

Das Signal von Pin 15 = OC1A (-> Compare1A) hat Micha nun abgegriffen und mit seinen selbstgebauten :respekt: Messgeräten, einem Oszilloskop und einem Frequenzzähler ausgewertet.
Was sehen wir?
Zuerst fällt auf, dass unsere oben berechnete PWM-Frequenz von ca. 489Hz ziemlich exakt gemessen wird. Wir arbeiten ja mit dem internen Oszillator des Tinys, der Toleranzen aufweist
aber genau genug für unsere Zwecke ist. Den kleinen Unterschied in der Anzeige von Oszilloskop und Frequenzzähler führe ich darauf zurück, dass letzterer eigentlich für viel höhere Frequenzen gedacht ist.
Weiterhin sehen wir saubere Rechtecksignale, die der jeweiligen Tastrate (Compare1A) entsprechen.

Und dann das geniale Video :ok: :ok: :ok:
Besser kann man PWM nicht visualisieren!
Ausgehend von der Baseline (GND) sehen wir das Entstehen eines Rechtecksignals, das immer breiter wird, bis die Maximalbreite (entspricht Compare1A=1023 = maximale Helligkeit) erreicht ist.
Und dann wieder von vorn.
Klasse, Micha!


Noch ein Exkurs... Sorry, Willie! :trost:





Schalten Sie auch nächstes Mal wieder ein, wenn sie die M&Ms sagen hören: "Dem Manne kann geholfen werden! Jetzt aber!"



Viele Grüße

Mathias & Micha


Inhaltsverzeichnis aller Projekt-Posts in Post 1

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


Beiträge: 1 183

Realname: Wilfried Hoffmann

Wohnort: Braunschweig

  • Nachricht senden

191

Montag, 3. Oktober 2016, 22:59

Hallo Mitstreiter,
in der letzten Zeit hatte ich aus familiären Gründen leider keine Zeit, weder irgendwelche Modellbauaktivitäten durchzuführen, noch hier den Fortgang im Thread nachzuvollziehen.
Deshalb habe ich noch einmal von Anfang an den Thread durchgearbeitet.

Dabei ist mir bei der Hausaufgabe aus dem Thread 71 (Baut mit einem zweiten ULN einen 16-Kanal Blinker!) ein Fehler aufgefallen. ?( ?( ?(

Die LEDs der Kanäle 9-16 waren in Gegensatz zu den Kanälen 1-8 deutlich dunkler.
Auf der Suche nach der Ursache habe ich LEDs, ULN, Kabel und sogar den Tiny getauscht.
Hat aber Alles nichts gebracht. :(

Nach dem Messen der Spannungen am Ausgang des Tinys fiel mir bei mir der Groschen --> AUSGANG!!!!!!!!!

Ich Blödmann habe im Code die entsprechenden Zeilen der LED-Sequenzen und Alias hinzugefügt, aber vergessen, die entsprechenden Ports als Ausgang zu konfigurieren. :bang: :bang: :bang: :bang:

Dabei fiel mir auch die etwas ungewohnte Reihenfolge des Codeaufbaus auf.
Deshalb hier mal ein Vorschlag zur Strukturierung des Codes:

Programmbenennungen und Hinweise dazu mit #### eindeutig abgrenzen
Die Spielwiese für persönliche Einstellungen auch mit #### eindeutig kennzeichnen
Überschriften der einzelnen Programm und Definitionsbereiche mit **** kennzeichnen
Darüberhinaus im Codeablauf

1. Hardwareeinstellungen (Configs + Alias)
2. Softwareeinstellungen (Variablen)
3. das eigentliche Programm.

Das könnte z.B. so aussehen:

'###############################################################
'Name des Programms mit eventuellen Zusatzinformationen
'###############################################################

'***** Genutzter Microcontroller, Takt in Hz, Stacks & Framesize

'***** Portpin-Configs & Interrupts

'***** Aliaszuweisungen

'***** Variablen und weitere Grundeinstellungen

'***** Testprogramm für optische Programmstartanzeige

'***** Hauptprogramm

Den Bereich für persönliche Einstellungen der Lichtmuster eindeutig kennzeichnen

'############################################
' Spielwiese für persönliche Lichtmuster
'############################################

'############################################
' Ende Spielwiese für persönliche Lichtmuster
'############################################

Im kompletten Code würde es am Beispiel des 16-Kanal-Blinkers (bei mir für die bessere Übersicht ein Lauflicht) dann so aussehen:

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
Viele Grüße
Willie

Man ist niemals zu alt, um Neues zu lernen.
Es gibt keine dummen Fragen, nur dumme Antworten.

Fertig:

VW Bus T3 – Mein erster Tourbus

In Bearbeitung:
Chevy G20 Van in 1:25 nach realem Vorbild

Fertige Projekte im Portfolio!

192

Dienstag, 4. Oktober 2016, 00:18

Klasse Vorschlag, Willie, :ok:

das werden wir künftig so umsetzen.
Nur, um es zu klären: Die Reihenfolge der Einstellungen im Code macht keinen Unterschied.
Aber: Willie's Vorschlag führt zu besserem Verständnis. Daher besser und daher in Umsetzung.
Das Bessere ist der Feind des Guten.
Die "alten" Programme werden wir nicht nachträglich ändern - die neuen werden entsprechend erscheinen. :dafür:

Viele Grüße
Mathias & Micha

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


Beiträge: 1 183

Realname: Wilfried Hoffmann

Wohnort: Braunschweig

  • Nachricht senden

193

Mittwoch, 5. Oktober 2016, 21:01

Hallo Mitstreiter,
ich mache mir zwar immer Kopien von Bildern der Projektschritte auf meine Festplatte, bin aber auf Grund dringender familiärer Umstände nur bis Post 20 gekommen.
Beim Nachholen der einzelnen Projektschritte ist mir aufgefallen, das der User Elektron die Schaltung, die er für mich eingestellt hatte und für die ich mich im Post 102 noch bedankt habe, nachträglich entfernt hat (siehe Post 1). ;(

Deshalb meine Frage an alle Mitstreiter:
Hat vielleicht jemand diese Schaltung auf seine Festplatte kopiert und könnte sie mir zur Verfügung stellen.
Um ggf. Probleme mit dem Urheberrecht zur Veröffentlichung zu vermeinden, bitte nur per PN.
Viele Grüße
Willie

Man ist niemals zu alt, um Neues zu lernen.
Es gibt keine dummen Fragen, nur dumme Antworten.

Fertig:

VW Bus T3 – Mein erster Tourbus

In Bearbeitung:
Chevy G20 Van in 1:25 nach realem Vorbild

Fertige Projekte im Portfolio!

194

Donnerstag, 6. Oktober 2016, 00:13

In eigener Sache:

Ich habe leider erst jetzt den Post 190 zu Michas PWM-Experiment fertiggestellt. :bang:

Viele Grüße
Mathias

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


Beiträge: 1 183

Realname: Wilfried Hoffmann

Wohnort: Braunschweig

  • Nachricht senden

195

Freitag, 7. Oktober 2016, 18:52

Hallo alle zusammen,
ich habe heute die LCD-Schaltung aus Post 130/131 auf Anhieb ans Laufen bekommen. :ok:
Auch die Hausaufgaben waren problemlos umzusetzen.

Einzig der wait-Befehl nach dem "Lcd Modustext" erschließt sich mir nicht so ganz.
Eine Verringerung des Wertes hat offensichtlich keine Auswirkung.
Eine Erhöhung des Wertes bremst nur den weiteren Programmablauf.
Warum also wird der Befehl benötigt???? ?(

:!: 2 Tips noch meinerseits:
Ich habe zu Beginn des Programms nach den Definitionsblöcken bei mir immer den Testblinker als Startinfo eingesetzt.
Es empfiehlt sich, vor dem Testprogramm immer einen "CLS - Cursor Off" zu setzen, da man nun während des Testblinkens ein sauberes Display angezeigt bekommt.

Andernfalls erscheinen bis zum Start des Hauptprogramms etwas merkwürdige und unvollständige Anzeigen auf dem Display.
Macht nichts kaputt, aber sieht nicht sonderlich schön aus. :(

Beim Erstellen eines Sonderzeichens aufpassen!
Der LCD-Designer fügt beim OK die die Datenzeile "Deflcdchar ....." immer an der Stelle ins Programm ein, an der sich gerade der Cursor befand!
Also immer zuerst den Cursor in die Zeile, wo die Daten des neuen Sonderzeichens eingefügt werden sollen und dann das Umbenennen (0-7) nicht vergessen.
Viele Grüße
Willie

Man ist niemals zu alt, um Neues zu lernen.
Es gibt keine dummen Fragen, nur dumme Antworten.

Fertig:

VW Bus T3 – Mein erster Tourbus

In Bearbeitung:
Chevy G20 Van in 1:25 nach realem Vorbild

Fertige Projekte im Portfolio!

196

Freitag, 7. Oktober 2016, 20:26

Hallo Willie,

prima! :ok: :ok:

Eine der Hausaufgaben war, die Wartezeit nach der LDC-Ausgabe (da gibt's zwei Ausgaben; Die erste und die im Unterprogramm) zu ändern.
Der Hintergrund: Es gibt/gab LCDs, die einfach etwas Zeit brauchten, um ihre Befehle umzusetzen.
Ich habe noch ein 24x4, das eine gewisse Zeit tatsächlich benötigt. Auch nach dem Initialisieren (das habe Ich im Code weggelassen).
Daher diese Faustregel: Mit langer Wartezeit anfangen und solange verkürzen, dass alles immer noch funktioniert.
Bei meinem Display am Steckbrett geht's ohne Wartezeit.

Gute Tipps! :ok: :ok:
Wie Du schon richtig schriebst, ist der Testblinker als Testprogramm Teil des Programmablaufs, auch wenn er vor der Do - Loop - Schleife steht.
Dann macht das LCD ohne Initialisierung (Teil des CLS-Befehls), was es will.
Bezüglich des Testblinkers wird Dich mit Sicherheit das Prinzip der "Alive"-LED aus Post 181 interessieren.

LG & weiter so!

Mathias

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


Beiträge: 1 183

Realname: Wilfried Hoffmann

Wohnort: Braunschweig

  • Nachricht senden

197

Freitag, 14. Oktober 2016, 22:02

Hallo alle zusammen,
heute möchte ich mal meine Erfahrungen mit dem Umbau auf I2C-LCD mitteilen.

Zunächst erstmal der Hinweis, dass es auf meinem Steckbrett etwas wuseliger aussieht, als auf den aufgeräumten Platinen von Micha. :rolleyes:
Er baut sich aber auch gern für jede Anwendung eine eigene Platine.
Ich nutze die ohnehin knappe Zeit lieber für meine anderen Baustellen.
Jeder wie er mag! :)

Da ich mir für die Mitarbeit erst einmal nur jeweils einen LCD, sowie einen I2C-Adapter zugelegt habe, wollte ich nicht den Adapter fest mit dem LCD verbinden.
Deshalb habe ich mir ein Anschlußkabel für den Adapter gebaut.
Dafür habe ich aus der Grabbelkiste ein altes Speakeranschlußkabel aus einem alten PC hervorgeholt.
Die Kabelenden wurden wieder mit 0,6er Draht (alte Widerstände) bestückt.
Der Stecker und die Kabelenden wurden entsprechend beschriftet.





Damit mir die Anschlußkabel nicht außerhalb des Steckbretts herumliegen, wurden sie durch die Ausparung unter dem Adapter hindurchgeführt.

Hier sieht man oberhalb auch noch die beiden geparkten Anschlüsse für SDA und SCL.



Das Scannen der Adresse war problemlos durchzuführen.

Somit konnte das LCD seinen Platz an der Seite des Adapters einnehmen.
Das Testprogramm wollte nicht auf Anhieb funktionieren.
Mir ist der gleiche Fehler wie bei Micha unterlaufen.
Die Hexadresse des Adapters im Programm nicht richtig kontrolliert und dabei übersehen, dass dort &H7E und nicht wie erforderlich &H4E eingetragen war. :bang:

Auch nach der Änderung auf den richtigen Wert bekam ich noch keine Anzeige auf dem LCD.
Hierfür musste noch der Kontrast mit dem Poti auf dem Adapter eingestellt werden.
Nun hat es funktioniert!



Auf dem Steckbrett kann man erkennen, dass die vollständige Verkabelung für die 4Bit-Ansteuerung des LCD noch gesteckt war.
Also wieder zurück mit dem LCD auf den alten Platz.



Ich musste für die Hausaufgabe erst noch die richtige Datei für die 4Bit-Ansteuerung heraussuchen, da ich in einigen Kopien davon recht heftig mit den Variablen herumkariolt habe.
Nach dem ich die richtige Datei gefunden hatte, wurde sie mit den Anpassungen für die I2C-Ansteuerung versehen.

Dazu mussten die alten Pin-Definitionen der 4Bit-Ansteuerung herausgeworfen und die Einstellungen für den Adapter eingefügt werden.

:!: An der Stelle kam nun die Erkenntnis, dass die Syntax des Programms durchaus in Ordnung sein kann, aber die Schaltung dennoch nicht funktioniert. :!:

Die Anzeige blieb hängen und die LEDs zeigten auch nur noch Müll an.

Als Ursache habe ich die gleichzeitige Ansteuerung der LEDs 1 und 3, sowie der Anschlüsse LDA und SCL an den Ports B5 und B7 ausgemacht.
Nachdem ich bei LDA und SCL einen Portwechsel auf D0 und D1 durchgeführt hatte, lief alles zur vollsten Zufriedenheit. ^^



Jetzt kann der ATMega8(A) in Angriff genommen werden.

Bis dann. :wink:
Viele Grüße
Willie

Man ist niemals zu alt, um Neues zu lernen.
Es gibt keine dummen Fragen, nur dumme Antworten.

Fertig:

VW Bus T3 – Mein erster Tourbus

In Bearbeitung:
Chevy G20 Van in 1:25 nach realem Vorbild

Fertige Projekte im Portfolio!

198

Samstag, 15. Oktober 2016, 19:45

Sehr interessant was hier abläuft! :ok:

Hat sich eine von euch vielleicht schon die TFT Module (um die 2"-3") mit Touchscreen und SD Karte die auf Ebay angeboten werden angeschaut? Kann eine etwas dazu sagen?

Merci!
Cristian
Ich arbeite noch an meinem Deutsch! Bitte um Geduld und Nachsicht! :P

Blog: http://armored76.wordpress.com

199

Samstag, 15. Oktober 2016, 19:58

Hallo Cristian,

Du Gedankenleser!
Wir haben gerade diese Touchscreen-LCDs bestellt.
Laufen mit Bascom und werden in einem der kommenden Projekte eingesetzt.

Viele Grüße
Mathias

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


200

Samstag, 15. Oktober 2016, 20:11

Super! Danke für die Zeit die Ihr hier investiert!!!

Darf ich mal nach dem "Einsatzgebiet" fragen?
Ich arbeite noch an meinem Deutsch! Bitte um Geduld und Nachsicht! :P

Blog: http://armored76.wordpress.com

201

Samstag, 15. Oktober 2016, 20:25

Hallo Cristian,

Dankeschön für Dein Lob!
Unser Ziel ist es, jedem interessierten Modellbauer tolle Effekte für kleines Geld zu ermöglichen.
Nicht nur Beleuchtung - das ist erst der Anfang :D

Das Touchscreen-LCD wird in einer Weiterentwicklung des nächsten offiziellen Posts genutzt werden - mehr sage ich noch nicht :baeh:

Das Thema des nächsten Posts müsstest Du schon kennen...

Viele Grüße
Mathias & Micha

P.S.:
Was wäre denn Dein Wunsch für Beleuchtung & Effekte?
Wenn irgend möglich, werden wir ihn erfüllen! :idee:

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


202

Samstag, 15. Oktober 2016, 21:05

Hallo Willie,

klasse Beitrag :ok:

Im Gegensatz zu meinem sieht Dein Steckbrett richtig aufgeräumt aus! :pfeif:

Ja, ja, zuerst die Slave-Adresse scannen und dann im Testprogramm nicht überprüfen :schrei: :bang:
Der Lerneffekt dabei: Passiert Dir nie wieder und es konnte ja nichts kaputtgehen.

Prima, dass Du das Programm und die Hardware umstellen konntest!

Der Mega wartet schon...

LG
Mathias

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


203

Sonntag, 16. Oktober 2016, 07:00

Mein Anwendungsfall muss noch konkretisiert werden. Ich habe an eine kleine Präsentation gedacht wo JPGs mit Modell- und Vorbilddaten nacheinander gezeigt werden eventuell kombiniert mit eine Minibedienoberfläche für z.B. Beleuchtung ein/aus, Sound ein/aus.

Ich komme jetzt nicht auf das Thema euren nächsten Projektes, ich werde eure Beiträge aber weiterhin mit Interesse lesen :)
Ich arbeite noch an meinem Deutsch! Bitte um Geduld und Nachsicht! :P

Blog: http://armored76.wordpress.com

204

Sonntag, 16. Oktober 2016, 20:26

Hallo Cristian,

schöner Blog :ok:

Wir hatten es mehrfach geschrieben und auch mehrfach aufgeschoben: Das nächste Thema ist Willies Wunsch:
Effekte einzeln schalten. Wir machen das dann mit I2C-LCD-Unterstützung und Tastern mit dem ATMega8(A).

Programmierst Du auch in Bascom?
Auf jeden Fall hast Du Dir ein feines Projekt vorgenommen! :respekt:
Das ist machbar und Deine Drehscheibe wird gebraucht werden :thumbsup:

Viele Grüße
Mathias & Micha

P.S. Zu Deiner Drehscheibe haben wir auch schon einen Plan zur Optimierung 8)

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


205

Montag, 17. Oktober 2016, 07:43

Danke, Mathias! So gut ist mein Blog aber leider nicht :S Mir fehlt einfach die Zeit dafür...

Die Drehplatte habe ich mir für mein Photo Setup gebaut, findet aber mittlerweile selten Anwendung. Wenn Ihr es "aufpeppen" könnt, dann hier mit eure Ideen! :ok:

Was das programmieren angeht, hier bin ich eher der C und Assembler Typ.

Ich bleibe auf jedem Fall dran! Vielleicht kann ich auch etwas dazu beitragen und nicht still folgen.

:respekt: :respekt: :respekt:
Ich arbeite noch an meinem Deutsch! Bitte um Geduld und Nachsicht! :P

Blog: http://armored76.wordpress.com

206

Dienstag, 18. Oktober 2016, 21:33

Hallo Zusammen,

ich habe endlich die Zeit gefunden mich an der Schaltung aus Beitrag 18 zu versuchen.

Der Aufbau sieht wie folgt aus:


Beim Identifizieren des CHip bekomme ich diese Fehlermeldung und dann geht es nicht mehr weiter:


Wahrscheinlich ist irgendwo etwas falsch gesteckt, ich finde aber den Fehler nicht. Sieht ihr den Fehler?

Danke für eure Hilfe
Marcus


P.S.: Kann der Programmcode eigentlich auch problemlos mit einem Arduino genutzt werden?

Hubra

Moderator

Beiträge: 11 439

Realname: Michael

Wohnort: Niederdürenbach-Hain

  • Nachricht senden

207

Dienstag, 18. Oktober 2016, 22:01

Hallo Marcus. :wink:

Wenn ich das richtig sehe, vermisse ich den Anschluß "Mosi" bei deiner Schaltung.

Sieh dir das nochmal genau an.




Gruß Micha.

208

Dienstag, 18. Oktober 2016, 22:21

Hallo Micha,

ich guck mir das nochmal an und werde euch berichten, aber irgendwie erscheint mir das für Laien wie mich recht kompliziert. Gibt es keine Möglichkeit auf fertige Boards zurück zu greifen? Mir fehtl einfach die Zeit stundenlang irgendwas zusammenzulöten um dann am Ende festzustellen, dass es doch nicht geht.
In einem anderen Forum schwören viele Leute auf die Boards von Arduino. Dort ist doch alles schon passend verlötet und an die Ausgänge kommen LED oder Sensoren oder was auch immer ... Code draufladen und dann geht es.

Für meinen Anwendungsfallreicht die Ansteuerung von 12 LEDs völlig aus:
- 4 LED an der Front des PKW, die als 2er Pärchen abwechselnd "blitzen" und das dann auch am Heck, fast so wie hier
- und dann noch 4 LED auf dem Dach, die mit einer anderen Frequenz blitzen

Das Ganze orientiert sich an keinem realen Vorbild und zum Einsatz werden SMD LED kommen. Inspiriert hat mich ein BB hier im Forum, aber leider sind die Videos nicht mehr verfügbar.

209

Mittwoch, 19. Oktober 2016, 01:16

Hallo Marcus,

lies Dir bitte nochmals Post 1 durch.
Es geht hier nicht um fertige Boards, sondern um ein Angebot, zu lernen, selbst solche Effektboards bauen und programmieren zu können.
Ich (Mathias) kenne beide Welten: Bascom und C (Arduino). Bascom ist m. E. einfacher zu erlernen.
Für ein anderes Projekt habe ich gerade ein paar Arduino-Boards gekauft - die mit Bascom programmiert werden.
Der Vorteil: kleiner dank SMD-Technik und die Grundbeschaltung schon drauf.
Der Nachteil: etwas teurer und weniger Arbeit mit und damit auch weniger Verständnis des Mikrocontrollers. Ihr sollt aber verstehen!
Die Grundbeschaltung meiner Arduino-Boards enthält - wie hier auf dem Steckbrett gezeigt - Reset-Taster mit Pull-Up, Kondensatoren, leider
einen externen Quarz (der kostet zwei I/O Pins) sowie eine LED und einen Spannungswandler, den ich nicht brauche.

12 LEDs mit je 20 mA Betriebsstromstärke kannst Du weder an unsere Grundschaltung noch an das o. g. Arduino-Board anschließen.
Warum?
Weil es sich um die gleichen Controller handelt - nur in verschiedener Bauform.
Bei Deiner geplanten Anwendung sind mindestens 6 LEDs gleichzeitig an. Macht 120 mA. Für den Dauerbetrieb zu viel.
Also: Verstärkung via ULN. Iiiih! Löten!
Ja.

In diesem Thread wird niemand, der sich bemüht, alleine gelassen!
Du hast ja schon erste Hilfestellung erhalten.
Wenn Deine Schaltung auf dem Steckbrett funktioniert, wird Dich Micha garantiert bei der Erstellung der Platine beraten.

Wenn Du aber grundsätzlich nach einer vergessenen Strippe die Flinte ins Korn wirfst, bist Du vielleicht mit einer kommerziellen
und teuren Blinkplatine besser bedient. Die blinkt dann auch wahrscheinlich nicht wie ein reales Vorbild.

Viele Grüße
Mathias & Micha

Zu Hülf' - meine Kugel ist umgefallen!

Heisenberg bei einer Radarkontrolle:
Polizist: "Wissen Sie, wie schnell Sie waren?"
Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"


210

Mittwoch, 19. Oktober 2016, 07:33

Hallo Mathias,

was ihr beide mit dem Thema erreichen wollt hast ja schon mehr fach erwähnt und verfolge auch jeden Beitrag mit Interesse. Trotzdem sollte es doch die Möglichkeit geben auf fertige Platinen wenigstens zu verlinken und dann kann jeder selber entscheiden, ob man sich hinsetzt und alles nach euren Beiträgen nachbaut oder auf eine fertige Platine ausweicht, die dann ggf. aber in den Funktionen limitiert ist.
Und wenn ich eine fertige Platine, wie die von digital-bahnen.de oder so ähnlich nutzen möchte, dann müsst ihr das akzeptieren. Und wenn eine fertige Platine mehr kostet als die ganzen Einzelteile, dann ist es eben so. Die Entscheidung liegt bei jedem persönlich.
Mein Anwendungsfall orientiert sich an keinen realen Vorbild, deswegen bin ich auch bereit die Funktionen an die Möglichkeiten einer fertigen Platine anzupassen.

Am Ende ist es für mich wichtig, dass es ordentlich funktioniert und möglichst nicht Monate dauert. Wenn sich mein Projekt mit einer fertigen Platine schneller umsetzen lässt, dann gehe ich gerne diesen Weg. Oder wenn sich jemand im Forum bereiterklärt das für mich zusammenzulöten, dann bin mehr als dankbar und werde die Arbeit entsprechend finanziell entlohnen. Anders war es bei dem Beitrag hier im Forum, der mich inspiriert hat, auch nicht.

Gruß
Marcus

Werbung