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.

211

Mittwoch, 19. Oktober 2016, 20:44

Hallo Marcus,

da verstehst Du etwas falsch. Wir betreiben kein Re-Engineering (= versuchen, die Funktionen eines Produkts zu kopieren), sondern entwickeln selbst.
Daher keine Verlinkung zu Fertigplatinen: Weil wir sie nicht gekauft und getestet haben.
Natürlich kann jeder selbst entscheiden! Wir sind nicht in Nordkorea.
Wenn Du wenigstens mal eine LED zum Blinken bringst = wenn Du den Mikrocontroller programmieren kannst, dann lässt sich sicher eine Lösung für Dich finden.

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 441

Realname: Patrick

Wohnort: Sandersdorf-Brehna

  • Nachricht senden

212

Mittwoch, 19. Oktober 2016, 23:17

Hallo zusammen,

Ich denke mal Marcus meinte das eher so ob es nicht eine fertige Platine gibt wo man den Chip drauf steckt (der vielleicht schon programmiert wurde oder dieser noch Programmiert wird) und man dann sein Programm aufspielt
und dann an den Anschlüssen die zur Verfügung stehen die Led´s anlöten kann.

Diese Variante wäre für mich durchaus einfacher und schneller umzusetzen.

Eure Arbeit die ihr bisher gezeigt habt ist wirklich super und ich habe auch großen Respekt davor, denn ich weiß ja selber wie groß der Aufwand ist das ganze zu Programmieren.

Eins ist mir bisher aber aufgefallen, ihr geht bisher immer nur auf einzelne Sachen ein. Für mich wäre es wirklich intressanter wenn das Programm mehrere Dinge mit einmal kann.
Bestes Beispiel ist hier der Decoder von Ridtec, er hatte damals ja mein angefangenes Programm auf seinen Decoder angewendet und so umgesetzt das mehrere Funktion möglich waren an den Verschiedenen Ausgängen.

Mit seinemneuen Lauflicht-Decoder kann man sicherlich viele dinge Realisieren und man braucht dann hier nur noch das Programm schreiben, da der Decoder ja über einen Programmieranschluss verfügt.

es grüßt Patrick :wink:
Aktuell im Bau: HLF 20/16 Beleuchtet u. Mercedes Benz
Auf der Warteliste: Simba 8x8, TLF 16/25

213

Mittwoch, 19. Oktober 2016, 23:34

Hallo Patrick,

ich vermute, dass ich Marcus richtig verstanden habe.
OK OK OK.
Wenn er seinen Tiny überreden kann, eine LED blinken zu lassen,
bekommt er eine fertige Platine zum Selbstkostenpreis.
Mit für ihn speziell abgestimmtem Programm.

Ich finde es nur schade, dass er so schnell aufgibt.

Ja, wir gehen durchdacht einzelne Dinge an, die sich schließlich modulartig zusammensetzen lassen.
Die Grundidee. Nur das bauen, was man auch braucht. Dann aber richtig.

Den Decoder ?( schaue ich mir später an.

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!"


214

Donnerstag, 20. Oktober 2016, 03:07

Hallo Patrick,

ich habe mir jetzt mal die Seite mit dem "Decoder" angeschaut.
Schöne Präsentation. Die Aquarien-Beleuchtung mit YT-Film hat mich fasziniert. :thumbsup:
Es ist natürlich ein "Encoder" oder schlicht gesagt: Ein Blinkmodul.
Aber fein in SMD-Technik gemacht.
Der Nachteil: Feste Programme.
Der Vorteil: Ganz kleine Platinen, die sich fast überall unterbringen lassen.
Aber: Keine Schaltbilder und keine Codes zu finden...

Der Ansatz ist das Gegenteil dessen, was Micha und ich hier machen.
Wir legen alles offen und haben keinerlei kommerzielle Interessen.

Vielleicht werden wir irgendwann einmal unsere Module beim freundlichen Chinamann in Auftrag geben und verkaufen.
Dann aber zu einem fairen quasi-Selbstkostenpreis.

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!"


215

Donnerstag, 20. Oktober 2016, 07:36

@ Patrick: Genau das wollte ich zum Ausdruck bringen.

Warum ist die Hilfe eigentlich an eine Bedingung geknüpft, oder wie sind die Sätze zu deuten: "Wenn du wenigstens mal eine LED zum Blinken bringst, dann lässt sich sicher eine Lösung für dich finden" oder "wenn er seinen Tiny überreden kann eine LED blinken zu lassen, dann bekommt er eine fertige Platine zum Selbstkostenpreis mit speziell abgestimmten Programm"?

Bitte akzeptiert auch, dass nicht jeder die Zeit und Lust hat sich stundenlang damit zu beschäftigen.

Habt einen angehmen Arbeitstag

Beiträge: 1 441

Realname: Patrick

Wohnort: Sandersdorf-Brehna

  • Nachricht senden

216

Donnerstag, 20. Oktober 2016, 11:25

Hallo zusammen, :wink:

@ Marcus,

freut mich das ich die richtigen Worte gefunden habe und ich kann dich da voll und ganz verstehen, mir fehlt da aktuell auch die Zeit um mich mit der Programmierung zu beschäftigen. Da sind gerade andere Dinge die Vorrang haben.

@ Mathias,

Warum zum freundlichen Chinamann gehen, wenn man es auch in Deutschland machen kann??? Kennst du die Seite vom Platinenbelichter ? Dort hatte ich meine Platinen damals auch herstellen lassen für meine "Blaulicht-Steuerung" Micha kennt ja die Platinen.
Und der Marcel Richter (Ridtec) lässt seine dort ja auch Herstellen und bietet diese dann als Kostengünstige Bausätze an. Hier soll es glaube ich im November los gehen das man bei ihm die Platinen kaufen kann.

Klar bei der kleinen Platine sind die Programme fest vorgegeben. Aber bei dem Großen Lauflicht-Decoder kann man auch selber seine Programme drauf spielen und diese dann nutzen. Da ja dort die vorgesehene Schnittstelle ist.

Micha hatte auch mal einen Kontakt zu Marcel Richter und hatte die Platinen von ihm bezogen.

es grüßt Patrick :wink:
Aktuell im Bau: HLF 20/16 Beleuchtet u. Mercedes Benz
Auf der Warteliste: Simba 8x8, TLF 16/25

217

Donnerstag, 20. Oktober 2016, 19:37

Hallo Marcus, hallo Patrick,

zuerst zur "Bedingung": Ganz einfach - dann ist sichergestellt, dass das Programm jederzeit verändert und neu gebrannt werden kann.
Der Code mit "Spielwiese" wäre ja dann dabei und kleine Änderungen der Timings wären ein Klacks.

Zu den Fertigplatinen: Das ist noch in weiter Ferne - deshalb haben wir uns um potentielle Fertiger noch nicht gekümmert.

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!"


218

Freitag, 21. Oktober 2016, 19:43

Hallo Marcus,

in etwa so ? :schrei:

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!"


219

Freitag, 21. Oktober 2016, 19:53

Ja, das Beispiel kommt meiner Idee schon ganz nah

220

Freitag, 21. Oktober 2016, 19:56

Freut mich! Hast Du auch noch eine Lichthupe vorgesehen?

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!"


221

Freitag, 21. Oktober 2016, 20:27

Nein
Kein Abblendlicht, kein Fernlicht, keine Blinker, keine Lichthupe... nur die Blaulichter

222

Freitag, 21. Oktober 2016, 20:35

Marcus, Du hast E-Mail. :schrei: :wink:

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!"


223

Freitag, 21. Oktober 2016, 21:43

Dann schau' in Deine PNs :hey:

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

224

Samstag, 22. Oktober 2016, 02:25

Hallo an alle interessierten Leser ,
ich möchte heute mal mein Ergebnis der Hausaufgabe aus Post 182 vorstellen.

Ich habe trotz meiner Erfahrung aus der VBA-Makroprogrammierung schon einige Zeit benötigt, um das Ursprungsprogramm entsprechend umzubauen.
Vielleicht haben ja einige Anfänger daran verzweifelt.

Deshalb beschreibe ich mal etwas ausführlicher meine Herangehensweise und die Änderungen.

Da ich nun auch nicht gerade der Crack vorm Herrn bin, der gleich fehlerfrei im Code herumschreiben kann, benutze ich für die Umbauplanung als Hilfsmittel gern ein Flussdiagramm.
Man kann mit einem solchen Diagramm zunächst grob einen beliebigen Ablauf verständlich und übersichtlich darstellen.

Für Alle, die damit noch nicht gearbeitet haben, hier mal ein Beispiel eines Flussdiagramms für den Ablauf einer ganz profanen Tätigkeit des täglichen Lebens in groben Zügen.
Da diese Tätigkeit eigentlich jeder kennt, sollte der Aufbau selbsterklärend sein.

Ein Telefonat. :D



Und weiter geht es. :pc:

Ich habe den ATMega8 benutzt.
Die grundsätzlichen Einstellungen wurden ja schon von Matthias erläutert.
Deshalb hier im Diagramm nur der grobe Ablauf des Hauptprogramms.

An den Ja-Abzweigungen lassen sich schon jetzt die If-Then-Abfragen erkennen. :)
Sie sind im Programmablauf ähnlich eingerückt.



Mit einem solchen Bild vor Augen lassen sich die einzelnen Programmkomponenten leichter in Code umsetzen.
Immer einen Schritt nach dem Anderen.

Was habe ich nun imProgramm geändert:

Da ich meine Beschaltung des ATMega8 auch für die PWM-Demo benutze, habe ich die Alive-LED auf den Port PC3 am Pin 26 umgeschaltet.
Ich habe 8 eigene Charakter kreiert für die Darstellung der Schritte innerhalb des jeweils letzten Bargraphen.
Es kam 2 neue Variablen hinzu:
C -- für die Position des Cursors
Diff -- für die Differenz der Bargraph-Anzahl zwischen altem und neuem ADC-Wert

Nun zur Umsetzung des Diagramms in einen Code anhand der Stichworte im Diagramm:
Mit einem ausgedruckten Diagramm lässt sich der Code recht einfach nachvollziehen.

Startanzeige - Zeile 73 - 84

Beginn der Programmschleife in Zeile 88

ADC-Wert holen - Zeile 89

Wert verändert? - Zeile 91
Nein - Abfrage wird in Zeile 122 verlassen

Ja - Wert in Zeile 1 anzeigen - Zeilen 92-93 - Anzeige des neuen ADC-Wertes in LCD-Zeile 1
Graph berechnen - Zeilen 94-96 - Anzahl der vollen Bargraphblöcke sowie der Zeilen im letzten Block berechnen

Der Rechenwert für die Darstellung des Wertebereiches 0-1023 in 16 Graphen wäre 1023 : 16 = 63,94.
Der Wert für die 8 Zeilen innerhalb des letzten Graphen 63,93 : 8 = 7,99.
Die gerundeten Werte 63 und 7,9 haben sich beim Testlauf ergeben.

Neuer ADC < - Zeile 99-101
Da der Graph kleiner wird, wird nur die Differenz ADC Alt/Neu ermittelt und in Diff für die Curserpositionierung gespeichert.
Überzählige Zeichen werden später überschrieben.

Neuer ADC > - Zeile 104-112
Die Differenz ADC Alt/Neu wird ermittelt und in Diff für die Curserpositionierung gespeichert.
Fehlende Graphen werden hinzugefügt.


Eig. Charakter einfügen - Zeilen 115-117

Alte Zeilen löschen - Zeile 118

Neuen ADC-Wert merken - Zeile 120

Toggle Alive - Zeile 124 - Alive-LED umschalten

Mit Loop geht es wieder an den Anfang der Programmschleife in Zeile 88.

Wenn man das System Flussdiagramm ein paar Mal angewendet hat, wird die Erstellung des Codes immer einfacher.

Und so sieht dann das Ergebnis in der Anzeige aus.









Ich hoffe, die Erklärung hat keinen erschlagen, sondern einige Programmabläufe etwas verständlicher nähergebracht.

Im nächsten Post ist dann der dazugehörige Programmcode.
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!

Beiträge: 1 183

Realname: Wilfried Hoffmann

Wohnort: Braunschweig

  • Nachricht senden

225

Samstag, 22. Oktober 2016, 02:27

Hier nun der dazugehörige Programmcode:

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
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!

226

Samstag, 22. Oktober 2016, 10:06

Hallo Willie,

:respekt: :respekt: :respekt:

das war eine superschwere Aufgabe, die Du gemeistert hast!

Liebe 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

227

Donnerstag, 27. Oktober 2016, 22:46

Hallo Freunde des µC,
beim Umschreiben des vorgestellten Codes ADC-Test3 für das LCD 16x2 auf eine Ausgabe auf dem LCD 20x4 bin ich auf einige Probleme mit dem Zeilenüberlauf gestoßen.
Eine telefonische Besprechung des Codes mit Mathias hat das Programm zwar zum Laufen gebracht, aber einige Eigenheiten der beiden LCDs blieben uns doch unklar.

Deshalb haben wir abgesprochen, daß ich mal einige Versuche mit den LCDs durchführe.

Hier möchte ich nun das recht unerwartete Ergebnis vorstellen.

Wir waren bisher davon ausgegangen, das bei der Ausgabe von mehr Zeichen als die Zeile anzeigen kann, die überzähligen Zeichen im Nirvana verschwinden.

Dem ist nicht so! :(

Mit dem folgenden Code kann für beide LCDs das Ergebnis nachvollzogen werden.
Er muss nur mit der jeweiligen Auskommentierung durch „Config Lcd = 16x2“ oder „Config Lcd = 20x4“ an das verwendete LCD angepasst werden.

Erklärung nachfolgend!

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

******


Der erste Teil des Codes ist die übliche Konfigurationsroutine mit hier nur 2 Variablen fürs Zählen und die Anzeige eines Zeichens.

Um den Überblick zu behalten habe ich die Zeichenfolge des LCD lt. Datenblatt benutzt.
ABCDEFGH…….
Das A hat den Wert CHR(65)

Im Hauptprogrammteil sind 2 Schleifen enthalten.
Die 1. Schleife habe ich benutzt, um einfach mal eine endlose Zeichenfolge ablaufen zu lassen. Die 2. Schleife auskommentiert.

Mal sehen, was passiert.

Start in Zeile 1 Position 1.
Das LCD hat irgendwann in der 2. Zeile weitergeschrieben.

Da in der 2. Zeile an Position 1 ein „i“ stand, war nur Rechnen nötig.
i=Chr(105) – A = Chr(65) = ergibt einen Abstand von 40.

Es werden also, obwohl nur 16 Zeichen angezeigt werden, 40 Zeichen in die 1. Zeile geschrieben.
Dann erfolgt der Überlauf in die 2. Zeile.


Die Überprüfung erfolgte in der 2. Schleife des Hauptprogramms.
1. Schleife auskommentieren – 2. Schleife freigeben.
Die Zählschleife auf 41 Durchläufe einstellen.

Ende ist mit der Anzeige des letzten Zeichen in der Zeile 2, Position 1.
PASST!

Eine Änderung der Cursorstartposition in die 2. Zeile (Locate 2,1) bestätigte die Verhaltensweise.

Ende ist dann mit der Anzeige des letzten Zeichen in der Zeile 1, Position 1.


ERGEBNIS Anzeige LCD 16x2 bei fortlaufender Zeichenfolge:

Zeichen 1-16 -> Anzeige in Zeile 1
Zeichen 17-40 -> keine Anzeige
Zeichen 41-56 -> Anzeige in Zeile 2
Zeichen 57-80 -> keine Anzeige
und fortlaufend . . . . .

Die gleiche Prozedur mit dem LCD 20x4 hat dann die Überraschung gebracht. 8o

ERGEBNIS Anzeige LCD 20x4 bei fortlaufender Zeichenfolge:
Zeichen 1-20 -> Anzeige in Zeile 1
Zeichen 21-40 -> Anzeige in Zeile 3
Zeichen 41-60 -> Anzeige in Zeile 2
Zeichen 61-80 -> Anzeige in Zeile 4
und fortlaufend . . . . .

Das heißt, das LCD 16x2 ist nur eine abgespeckte Anzeigeversion des LCD 20x4!

Gut zu wissen!
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!

228

Donnerstag, 27. Oktober 2016, 22:57

Das heißt, das LCD 16x2 ist nur eine abgespeckte Anzeigeversion des LCD 20x4!

Prima gemacht, Willie!

:respekt:

Dann pack' ich demnächst das 40x2 aus und schaue mal...

LG
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!"


Hubra

Moderator

Beiträge: 11 439

Realname: Michael

Wohnort: Niederdürenbach-Hain

  • Nachricht senden

229

Freitag, 28. Oktober 2016, 17:12

Hallo liebe Bastelgemeinde. :wink:

Heute möchte ich Euch mal ein Video von der "PWM Übung" zeigen.

An dieser Stelle möchte ich mich zuerst einmal bei Willie bedanken :hand: , der mir diese Ausführung des Programms zur Verfügung gestellt hat.
Wie man sehen kann, schwellen die LED's im Wechsel an und aus.

Damit die Präsentation des Videos nicht zu eintönig wird, habe ich es dieses mal ein wenig bearbeitet und hoffe das Euch diese Art gefällt. :nixweis:


Da ich mir die Arbeit auch gerne mal erleichtere, :lol: habe ich den folgenden Adapter für den Atmega 8 benutzt.
Diesen habe ich mir natürlich als Bausatz gekauft.


Das so genannte "ATmega8 Development Board" gibt es zum einen als Bausatz, sowie bereits fertig, zum günstigen Preis.
Dadurch erspart man sich alle Bauteile die für den Atmega 8 benötigt werden und man braucht diesen lediglich mit den passenden Steckbrücken mit dem Steckboard zu verbinden.

Das war es dann auch schon wieder.

Gruß Micha und Mathias.


Inhaltsverzeichnis aller Projekt-Posts in Post 1

Beiträge: 1 183

Realname: Wilfried Hoffmann

Wohnort: Braunschweig

  • Nachricht senden

230

Montag, 31. Oktober 2016, 22:48

Hallo Mitstreiter,
ich habe ja zu Anfang des Treads schon einmal erwähnt, dass ich schon einige Programmiererfahrung in BASIC und VBA habe.
Da ich daher weiß, wie schwer es ist, sich in diese Materie einzuarbeiten, möchte ich nun mal meinen Code für die Änderung der Anzeige auf 20x4 etwas ausführlicher erläutern.

Dazu ist es für die Leser wieder vorteilhaft, sich zunächst den Code auszudrucken und dann mit dem Beschreibungstext zu vergleichen.
Das Nachvollziehen der Erklärung ist dann einfacher, als ständig am Bildschirm herumzuscrollen.

Hier nun also die Code-Erklärung ADC-Test 3 für LCD 20x4

1-70 --- Hier stehen wieder die üblichen Konfigurationen für die grundlegende Funktion.
43 --- Hier ist der neue LCD-Typ eingetragen.
66-67 --- In den Zeilen sind 2 neue Variablen hinzugefügt worden.
L für die Anzahl der anzufügenden Leerzeichen
Diff für die Differenz der anzuzeigenden Blöcke alt/neu

73-84 --- Der Name des Programms und die feste Anzeige für den ADC-Wert werden in die Zeilen 1-3 geschrieben und nicht mehr verändert bzw. überschrieben.

Das Hauptprogramm besteht zuerst aus der Do-Loop-Schleife ( 88-139 ), die fortwährend durchlaufen wird, bis Schaltung ausgeschaltet wird.

Zunächst wird der ADC-Wert am Analogeingang abgefragt.

Dann werden einige verschachtelte If-Then-Abfragen durchlaufen.

Die äußere Abfrage ( 91-130 ) wird nur dann durchlaufen, wenn sich am ADC-Wert etwas geändert hat.
Hier wird dann die Anzahl der neuen Blocks und Zeilen ermitttelt.
Die Teilerwerte mussten natürlich an die 20 Zeichen pro Zeile angepasst werden.
Im Vorfeld für die nächste Änderung der Ansteuerung über I2C ist der SPC()-Befehl ersetzt wurden durch einen Zeichenstring.

In der 2. If-Then-Ebene ( 99-128 ) gibt es 3 Abfragen.

Die 1. Abfrage ( 99-101 ) wird nur durchlaufen, wenn der neue ADC-Wert kleiner als der alte Wert ist.
Hier wird jetzt die Differenz ermittelt.

Die 2. Abfrage ( 103-111 ) wird nur durchlaufen, wenn der neue ADC-Wert größer als der alte Wert ist.
Hier wird jetzt die Differenz ermittelt, die Cursorposition bestimmt und fehlende Blocks hinzugefügt.
Mit C wird der Cursor in das nächste Feld hinter dem letzten alten Block gestellt.
Mit der Zählschleife werden die fehlenden Blocks entsprechend der neuen Anzahl angefügt.

Bei der 3. Abfrage wird es etwas kniffeliger.
Die Abfrage ( 113-128 ) wird nur durchlaufen, wenn die Anzahl der Blocks kleiner als 20 ist.
Bei 20 anzuzeigenden Blocks wäre ja der Maximalwert schon erreicht und es würde kein selbstdefiniertes Zeichen benötigt werden.
Bei weniger als 20 Blocks wird mit C der Cursor in das nächste Feld hinter dem letzten neuen Block gestellt.
Nun das selbstdefinierte zeichen entsprechend der ermittelten Zeilenanzahl angefügt.

Nun kommt die 3. If-Then-Ebene.
Hier ( 118-126 ) wird mit die Anzahl der event. notwendigen Leerzeichen ermittelt, um noch vorhandene Altanzeigen zu löschen.
Der Cursor wird mit C auf das 2. Feld hinter dem letzten neuen Block gestellt (direkt dahinter befindet sich ja das selbsterstellte Zeichen).
Mit L wird die Anzahl der notwendigen Leerstellen ermittelt.
Mit der Zählschleife werden die fehlenden Leerstellen angefügt.
Da nach dem letzten angefügten Zeichen auf Feld 20 der Cursor in die 1. Zeile gesprungen ist, wird er mit Locate wieder in die 4. Zeile gestellt.

Danach die neuen Werte merken und wieder von vorn.

Jetzt der dazugehörige Code.

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
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!

Beiträge: 1 183

Realname: Wilfried Hoffmann

Wohnort: Braunschweig

  • Nachricht senden

231

Montag, 31. Oktober 2016, 22:49

Bei dem in Post 227 erwähnten Gespräch mit Mathias haben wir dann auch mal meinen Code durchgesprochen und einige Änderungen durchgeführt.
Hier die Beschreibung einer etwas eleganteren Programmierung mit dem gleichen Ergebnis.
Das Hauptprogramm ist deutlich schlanker geworden.

Der Code heißt durch die Änderung jetzt ADC-Test 4 für LCD 20x4.

Die Konfigurationen im Kopf des Programms sind gleich geblieben, bis auf die beiden wieder weggefallenen Variablen L und Diff.
Sie werden gar nicht benötigt.

72-83 --- Programmname und feste Anzeige ADC-Wert

87-126 --- Do-Loop-Schleife

90-117 --- Die äußere Abfrage ist kleiner geworden, aber die Berechnung der Blocks und Zeilen blieb unverändert.

In der 2. If-Then-Ebene ( 97-115 ) gibt es nur noch 2 Abfragen.

Die alte Abfrage, ob kleiner, war überflüssig, da im Test 3 der ermittelte Diff-Wert für NICHTS benutzt wurde.


Die nun 1. Abfrage ( 97-104 ) wird nur durchlaufen, wenn der neue ADC-Wert größer als der alte Wert ist.
Hier wird jetzt die Differenz ermittelt, die Cursorposition bestimmt und fehlende Blocks hinzugefügt.
Mit die Cursorposition bestimmt und der Cursor in das nächste Feld hinter dem letzten alten Block gestellt.
Mit der Zählschleife werden die fehlenden Blocks entsprechend der neuen Anzahl angefügt.
Dazu bildet C den Startpunkt und Anzahl_Blocks den Endpunkt der Schleife.
Es wird also gar keine extra Differenzvariable gebraucht.


Die nun 2. Abfrage ( 106-115 ) wird nur durchlaufen, wenn die Anzahl der Blocks kleiner als 20 ist.
Bei 20 anzuzeigenden Blocks wäre ja der Maximalwert schon erreicht und es würde kein selbstdefiniertes Zeichen benötigt werden.
Bei weniger als 20 Blocks wird mit C der Cursor in das nächste Feld hinter dem letzten neuen Block gestellt.
Nun das selbstdefinierte zeichen entsprechend der ermittelten Zeilenanzahl angefügt.
Mit der Zählschleife werden die fehlenden Leerzeichen entsprechend der neuen Anzahl angefügt.
Dazu bildet C den Startpunkt und 20 den Endpunkt der Schleife.
Es wird also wieder keine extra Differenzvariable gebraucht.


ACHTUNG: Für die Zählschleife ist C der Startpunkt für die Berechnung der Anzahl der Leerstellen, NICHT die Cursorposition.

Beispiel:
Anzahl-Blocks = 15
Position des Cursors = C = Anzahl-Blocks + 1 = 16
Einfügen des Sonderzeichens an Position 16
Notwendige Leerzeichen zum Auffüllen der Zeile = 4
Zählschleife C to 20 = 16 to 20 = 4 Durchläufe
Nun steht der Cursor durch den Überlauf in Zeile 1, Feld 1.
Da er dort NICHT angezeigt wird und auch nichts überschreibt, kann er dort genauso gut stehen, wie in Zeile 4,1.
Deshalb ist der letzte Locate-Befehl auch ersatzlos gestrichen worden.

Hier nun der neue schlanke Code.

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


Sollten hierzu irgendwelche Fragen auftauchen, dann bitte raus damit.
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!

232

Montag, 31. Oktober 2016, 23:00

Dumdum dumdum dumdum dumdum dumdum dumdum.... <hier wird's gleich spannend!> :thumbup:

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

233

Donnerstag, 3. November 2016, 20:54

Hallo Modellbaufreunde,
Ich habe nun erfolgreich die Umstellung auf I2C, wie im Post 183 beschrieben, fertig durchgeführt.

Für eine saubere Anzeige war beim 16x2 ein Delaywert von 5 notwendig.
Beim 20x4 hat ein Delaywert von 1 gereicht.

Einzig beim 20x4 ist mir aufgefallen, dass eine Umprogrammierung zu völlig konfusen Anzeigen geführt hat.
Hier war die alte AEG-Funktion hilfreich --> Ausschalten - Einschalten - Geht wieder!

d.h. einmal vom USB-Port abziehen, wieder anstecken und der Fehler war verschwunden.
Warum auch immer ?( ?( ?( :nixweis:
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!

234

Donnerstag, 3. November 2016, 21:02

Prima, Willie :ok:

stimmt, an den Delay-Wert muss man sich ggf. herantasten.
beim 20x4er hilft eventuell ein:

Initlcd
Waitms 300

vor dem Cls

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!"


235

Sonntag, 6. November 2016, 19:50

Hallo Modellbaufreunde,

"Resultate! Dem Manne kann geholfen werden! Jetzt aber!"

Willie, jetzt bist Du dran! :thumbsup:

Nach dem letzten Post, der Euch mit Spannungsteilern vertraut machen sollte, erfüllen wir hier - mit etwas Verspätung - Willies Wunsch:

Effekte am Modell mit einer (noch kabelgebundenen) Fernbedienung einzeln schalten zu können.
In diesem Beispiel 8 Kanäle (Taster) mit LCD-Anzeige. Mehr ist natürlich möglich - fragen kostet hier nix! Ist sogar erwünscht! :ok:

Wie gehen wir vor?
Das Verbindungskabel zwischen Modell und Steuerung soll möglichst wenige Adern haben (= dünn sein).
Mit dem I2C-Display haben wir schon mal die Anzahl der Adern von 8 auf 4 gesenkt: SCL, SDA, Vcc und GND.
Kommen wir zu den Tastern: 8 Stück wären 9 Leitungen. Die verringern wir auf 3: ADC(X), aVcc und aGND.
Summe: 3 + 4 = 7 Adern. Da aber am Mikrocontroller Vcc und aVcc sowie GND und aGND direkt verbunden sind,
können wir auf 2 Adern verzichten. Jetzt nur noch 5 Adern statt 17: ADC(X), SCL, SDA, Vcc und GND.

Nun zu den Tastern:



Bitte verzeiht die Qualität des Schaltplans, er ist mein (Mathias) "Erstlingswerk" mit Eagle. R1 (= Widerstand 1) hat 10 kOhm,
die restlichen 1 kOhm (Einkaufslisten-kompatibel :D ).
Ein neunter Taster ist schon eingeplant - den brauchen wir im nächsten offiziellen Post.

Wir haben hier einen Spannungsteiler mit Festwiderständen, dessen Teilungsverhältnis mit Tastern verändert werden kann.
Dadurch bekommen wir mit der ADC aus dem letzten ADC-Post ziemlich genaue ADC-Werte, die uns auf den betätigten Taster schließen lassen.
Das müssen wir aber zuerst testen, da viele Faktoren wie Bauteiltoleranz, Temperatur, Stabilität der Spannungsversorgung,
Mondphase - nee, letzeres nicht - den ADC-Wert beeinflussen können.

Flugs ans Steckbrett:
Wir bauen zuerst die Taster mit den Widerständen auf. Wer mag, kann die Funktion der Taster mit einem Ohmmeter an den Anschlüssen
GND und ADC(X) bzw. Vcc (dann 10 kOhm mehr) testen.

Es ist auch eine gute Idee, eine kleine Punkt- oder Streifenrasterplatine mit 9 Tastern und den Widerständen anzufertigen;
drei Strippen dran (Vcc, GND und ADC(X)) und fertsch. :ok:

Danach die Schaltung des ATMega8(A) wie im letzten ADC-Post aufbauen - mit I2C-LCD.
SDA und SCL befinden sich an Pins 27 und 28 des Megas. Pullup-Widerstände nicht vergessen!
An Stelle des Potis aus dem letzten ADC-Post schließen wir jetzt unsere Taster an.

Wer es bisher noch nicht gemacht oder übersehen hat:
$crystal = 8000000 ' auf 8 MHz eingestellt (Fuse-Bits!)
Ich (Mathias) hätte wohl noch deutlicher darauf hinweisen müssen; die Kommentare im Code übersieht man leicht...
Ein Dankeschön an Willie!

So stellt Ihr den Mega8(A) auf "8 MHz interner Oszillator" um:
Das Programm "ADC-Test" (mit I2C-LCD) in Bascom laden, kompilieren und auf Programmieren gehen.
Im Programmier-Fenster den Reiter "Fuse Bits" aufrufen und folgende Einstellung vornehmen:


Danach den Button "Write FS" anklicken. Mit dem Button "Refresh" checken, ob die Änderung übernommen wurde.

Wie Willie herausfand, nimmt die Demo-Version das Kommando "Write FS" nur mit einem kleinen Umweg:
Der Button "Write FS" wird erst auswählbar NACH der Änderung auf „disabled“ UND dem Anklicken eines beliebigen anderen Feldes der Maske.
Das Zitat stammt aus Willies Kommentar zur Umstellung des ATtiny4313; beim ATMega8(A) stellen wir wie gezeigt auf "Int. RC Osc. 8Mhz" um.

Es ist ratsam, in Zeile 98 die Wartezeit von 200 auf 50 ms zu verkürzen -> kürzere ADC-Messintervalle.
Also: Ändern, kompilieren, brennen.

Schappt Euch Block & Schreiberling und notiert Euch die angezeigten Werte für Taster 1 - 9 und auch die ohne Tasterbedienung.
Spielen! Drückt mal 2 oder mehr Taster gleichzeitig! Es kann nichts kaputt gehen.
Jetzt habt Ihr ADC-Werte ohne das Betätigten der Taster und für die einzelnen Taster. Die Werte brauchen wir noch!

Die ADC-Werte lassen sich auch berechnen:

Wir haben einen Spannungsteiler mit Festwiderständen:

Vcc---R1---+---R2---GND
.............I
...........ADC

R1 = 10k
R2 = 0 - 9k, je nach gedrücktem Taster; daher:
Rgesamt = R1 + R2 = 10 bis 19k
U2 = (U / Rgesamt) * R2
U entspricht einem ADC-Wert von 1023 (+1 (Nullwert), da 2^10), daher
ADC = (1024 / Rges) * R2


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

Die errechneten Werte (err.) passen schön zu den gemessenen (gem.) :tanz:

Nun zu Willie's Programm: WM Blinker 4.

Es baut auf WM Blinker 3 auf.
Wir definieren jetzt aber ein neues Array: LED_aktiv(8 )
Darin sind die jeweils aktiven Blink- oder Dauerlichtsequenzen zu finden, die in LED_Sequenz(8 ) in der Spielwiese definiert werden.
Anfangs ist alles inaktiv.
Und noch ein Array: LED_Name$(8 )*13
Darin sind die Texte hinterlegt, die die Funktion beschreiben, z. B. "Standlicht "
Dazu noch eine Konstante Leer$, die aus 12 Leerzeichen besteht, und uns als "Radiergummi" für unerwünschte Zeichen dient.
Wir benötigen auch eine Variable, die bitweise zeigt, welche der 8 Funktionen aktiv sind: Tasterflags heißt sie und ist von Beruf Byte.
Und noch ein Byte namens Flag. Unschön aber notwendig. Wahrscheinlich ein Fehler im Compiler. Egal. Wir haben ausreichend Platz.


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!"


236

Sonntag, 6. November 2016, 19:51

Fortsetzung:

Jetzt der neue Code für WM Blinker 4:

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


Was passiert hier?

Wir legen fest, an welchen Portpins die LEDs bzw. der ULN2303A angeschlossen werden und geben ihnen Namen; LED0 - LED7 - dazu später mehr. (Zeilen 27 - 39)
Dann konfigurieren wir ADC, I2C und LCD (Zeilen 41 - 55)
Jetzt definieren wir die benötigten Variablen und Arrays. (Zeilen 57 - 70)
Hier sei besonders auf den Befehl in Zeile 67 hingewiesen:
Config Base = 0
Bei Arrays geht Bascom standardmäßig davon aus, dass das erste Arrayelement die Nummer 1 hat.
Mit Config Base = 0 hat es die Nummer 0!
Bei 8er-Arrays, wie wir sie hier verwenden, also von 0 - 7.

Mit den Tastern könnt Ihr später die LEDs jeweils ein- oder ausschalten.
Um das auch visuell auf dem LCD darzustellen, definieren wir zwei Sonderzeichen:
Eines für Aus und eines für Ein. (Zeilen 72 - 74)

Es folgt die Spielwiese (Zeilen 78 - 109)
Bekanntes.
Arrays fangen jetzt mit 0 an (s. o.)
Das Array Led_sequenz mit den Blinksequenzen und neu:
Im Array Led_name$ liegen die zu den LED-Sequenzen passenden Bezeichnungen.

Nun schalten wir unser Display zur Begrüßung an (Zeilen 111 - 125) und generieren unsere Startanzeige:
1. Zeile: 8 Aus-Sonderzeichen, je von einem Leerzeichen getrennt (ist ja noch nichts an :) )
2. Zeile: Los geht's! (aber bald... :lol: )

Jetzt zum Hauptprogramm (Zeilen 136 - 158 ):

Was wir hier machen, ist, die in der Spielwiese festgelegten Sequenzen einzeln an- und auszuschalten.
Das geht einfach: Wir haben ein Array, Led_aktiv, das wie gewohnt abgearbeitet wird.
Nur: Das Array ist anfangs leer; bei Programmstart oder Reset ist jede Variable = 0.
Nix passiert.
Bis einer der Taster gedrückt wird. Aber dann!

In Zeile 148 holen wir in jedem For-Next-Schleifendurchlauf mit
Adcval = Getadc(3)
den aktuellen ADC-Wert unseres Spannungsteilers ab.
Im Normalfall liegt dieser Wert bei ca. 485. Ist der Wert deutlich kleiner, z. B.:
If Adcval < 470 Then
bedeutet das, dass ein Taster gedrückt wurde und wir gehen mit
Gosub Tasterauswertung
in das entsprechende Unterprogramm (Zeilen 161 - 206)

Dort beginnen wir mit einer Select Case-Struktur (Zeilen 163 - 180):
Wir untesuchen den gemessenen ADC-Wert (Adcval) und ordnen verschiedene Fälle (Cases) zu.
Dazu nehmen wir unsere aufgeschriebenen Messwerte der verschiedenen Taster und geben noch etwas Toleranz hinzu.
Sobald ein Fall zutrifft, wird der Variablen I ein Wert zwischen 0 und 7 zugewiesen, und die Select Case-Struktur wird verlassen.
Jetzt kommt unsere Variable Tasterflags zum Einsatz. Sie ist ein Byte und besteht aus Bit0 - Bit7. Mit
Toggle Tasterflags.i
schalten wir das I-te Bit von Tasterflags um: aus 0 wird 1 oder aus 1 wird 0.
diesen Wert schreiben wir in die Variable Flag:
Flag = Tasterflags.i

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!"


237

Sonntag, 6. November 2016, 19:51

Fortsetzung:

Finger noch auf dem Taster?
In Zeile 186 - 189 warten wir sicherheitshalber in einer Schleife, bis ein ADC-Wert erreicht ist, der keinem betätigten Taster entspricht.

Jetzt zeigen wir auf dem LCD, was sich geändert hat. Zuerst das Sonderzeichen für Ein oder Aus.
Die Sonderzeichen stehen in der ersten LCD-Zeile auf Position 1, 3, 5,..., 15
Wir errechnen die richtige Spalte, indem wir der gleichnamigen Variablen das 2-fache von I zuweisen.
Das ergäbe Werte von 0, 2, 4,..., 14
Also noch 1 addiert (Befehl incr) und Spalte hat die richtige Position. Cursor dorthin:
Locate 1 , Spalte
und das Sonderzeichen 0 oder 1 mit
LCD Chr(flag)
ausgeben. Die Variable Flag brauchten wir, weil Bascom den Befehl
Lcd Chr(Tasterflags.i)
nicht ausführt. Seltsam. ?(
In Zeile 2 des LCDs geben wir die geschaltete Aktion aus:
Locate 2 , 1
Lcd Led_name$(i)

Ein oder Aus?
In der If-Schleife (197 - 203) fragen wir zuerst, ob eingeschaltet wurde, also Flag = 1 ist.
Wenn ja, bekommt Led_aktiv(i) die Sequenz von Led_sequenz(i)
Dann hängen wir in Zeile 2 des LCDs noch ein " Ein" an und löschen eventuelle Restzeichen mit unserem Radiergummi Leer$
Wenn nein (Else), löschen wir den Inhalt von Led_aktiv(i) und schreiben entsprechend " Aus".
Noch schnell I auf 0 gesetzt und es geht zurück ins Hauptprogramm.

Dort landen wir, wo wir gestartet sind - jedoch mit einer Neu-Abarbeitung (I = 0) der acht Sequenzen und mit einer geänderten Sequenz, die entweder aktiviert oder deaktiviert wurde.


Viel Spaß beim Daddeln! & Sorry wegen der verspäteten Erklärung :motz:


Schalten Sie auch nächstes Mal wieder ein, wenn sie die M&Ms sagen hören: "Auto-Mode? Wo fahren wir denn hin?"

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

238

Samstag, 12. November 2016, 17:53

Hallo Modellbaukollegen,
der neue Code ist ausprobiert und läuft prima.

Für alle stillen Mitleser, die vielleicht nicht ganz so aufmerksam die Beschreibung, sowie die Kommentierungen im Code gelesen haben, hier noch einmal die wichtigsten Anpassungen, falls irgendetwas nicht funktioniert.

Hardwareumstellung auf 8MHz in Fusebits
Zeile 49 -- Adresse des LCD einstellen
Zeile 53 -- Delaywert für LCD einstellen
Zeile 149 -- Maximalwert der eigenen ADC-Meßwerte anpassen
Zeilen 164-179 -- eigene ADC-Meßwerte anpassen

Zum Ausprobieren habe ich, um mir die Steckerei zu ersparen, eine Schalterplatine zusammengelötet.
Für die Kabelzuführung habe ich die Löcher etwas aufgebohrt und damit eine einfache Zugentlastung erreicht.







Ich habe die ersten SMD-LEDs bekommen.
Da man nur 2 Hände hat und selbst die kleinen Krokoklemmen der helfenden Hand deutlich zu groß für die SMDs sind, habe ich mir aus einem Stück Federdraht, einem
Reinigungsstäbchen und Holzresten mal eben einen Löthalter für SMDs zusammengeklöppelt.
Das Holzstäbchen an der Spitze ist austauschbar.





Bis bald! :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!

239

Samstag, 12. November 2016, 23:33

Klasse Willie,

Danke für die zusätzlichen Erläuterungen.
Deine Tasterplatine ist wie aus dem Bilderbuch!

Die SMD-Löthilfe baue ich nach. Brilliant einfach und einfach brilliant. :ok:
Ade, doppelseitiges Klebeband (zumindest für Einzel-Leds).

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!"


Beiträge: 1 183

Realname: Wilfried Hoffmann

Wohnort: Braunschweig

  • Nachricht senden

240

Montag, 28. November 2016, 08:08

Hallo Mathias,
ich habe jetzt mal eine, bzw. aufbauend, mehrere Fragen zu Post 163 (I2C-Slave), die vielleicht auch die anderen Leser interessieren dürfte.

Ich kann ja mehrere Slaves an den Bus anschließen, die sich jedoch in der Hex- Adresse unterscheiden müssen, damit sie eindeutig ansteuerbar sind.

Kann ich im Programm auch einen Ausführungsbefehl gleichzeitig (oder eben ganz kurz kurz hintereinander) an 2 verschiedene Slaves schicken, damit beide das Gleiche machen?
z.B. 2 Displays, die an verschiedenen Orten eingebaut sind, aber gleiche Inhalte anzeigen sollen?

Was passiert, wenn eines der beiden anzusteuernden Displays ausgeschaltet ist?
Gar nichts oder muss eine Fehlermeldung abgefangen werden?

Und letztendlich - Wie sage ich das meinem Programm? ?( ?( ?( ?( ?( ?( ?( ?(
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!

Werbung