Projektvorstellung eines µC - Anfängers
Gleich vorweg, am 02.01.2014 hielt ich zum erstenmal einen µC in der
Hand.
Und von C/C++ wußte ich lediglich, dass es sich um eine
Programmiersprache handelt. Allerdings habe ich einige
Elektronik-Erfahrungen und kann auch mit OPV umgehen.
Nun zu meinem Projekt:
µC ATmega8-16PU, Programmiersprache C, ein STK500 ist bereits in
Betrieb.
Geplant ist eine Steuer- und Regeleinheit für ein Schwimmbad mit Solar-
und Zusatzheizung, einmal direkt und einmal über einen Wärmetauscher.
Die Umsetzung stelle ich mir folgendermaßen vor:
A 01)
Eine Schaltuhr mit 4 Ein- bzw. 4 Ausschaltzeitungen (einstellbar) für
die Pumpenlaufzeiten. DCF Empfang ist nicht möglich! Ausgang PB1
A 02)
Differenztemperaturregelung. Die Becken- und die Kollektortemp. werden
mit KTY Fühlern erfaßt und über OPV´s in Spannungen umgewandelt, welche
dann an die ADC´s (PC4, PC5) des µC geführt werden. Ausgang PB2
A 03)
Temperaturregelung für Zusatzheizung, Ausgang PB2
Temp. einstellbar, Anforderung permanent ein oder permanent aus
A 04)
Ein LCD (EA W402B-NLW) dient als Temp- und Zeitanzeige.
Ein Menuführung soll realisiert werden.
A 05)
Bedient werden soll das Ganze mit insgesamt 6 Tasten :
1) (PC0 5,0V) Aus - Ein -Automatik
2) (PC0 2,5V) Setup
3) (PC1 5,0V) Enter
4) (PC1 2,5V) Info
5) (PC2 5,0V) +
6) (PC2 2,5V) -
Das Ganze werde ich in Teilprojekte unterteilen:
Timer, Schaltuhr - Menuführung, Wertübergabe - ADC-Auswertung o.dgl.,
diesbezüglich kann ich mit meinen derzeitigen Kenntnissen noch keine
genauen Aussage treffen.
Das Motto lautet LEARNING by DOING
Ich hoffe auf Unterstützung und bitte um Nachsicht, wenn ich ab- und zu
(am Anfang eher häufiger) vermeintlich unsinnige Fragen stelle.
Diesen Thread habe ich als Information für hilfsbereite User in diesem
Forum gestellt, damit ich nicht jedesmal das ganze Projekt neu erklären
muss.
mfG Kurt
Kurt W. schrieb:> Gleich vorweg, am 02.01.2014 hielt ich zum erstenmal> einen µC in der Hand.
Das Leben hält schon schöne Momente bereit :-)
Aber im Ernst.
Dein Projekt klingt intessant aber aufwändig.
Ausserdem nehme ich an, die Technik soll lange
und zuverlässig funktionieren.
Ich selbst habe sehr viel Erfahrung mit Mcs
und würde für diese Aufgabe eine der folgenden
LOGO!-Starterboxen kaufen.
(Inhalt siehe die Bilder)
SPS-Starterkit Siemens
LOGO! TD Starter Kit 0BA6
6ED1057-3BA10-0AA6
ca. 250€
SPS-Starterkit Siemens
LOGO! Starter Kit 12/24 0BA7 + KP300 Basic mono
6AV2132-0HA00-0AA0
ca. 400€
Stöhn nicht über den Preis.
Zieh erst mal die Kosten ab,
die du für deine Steuerung
incl. Gehäuse, Netzteil.... hast.
@ Reinhard
Ist mir schon klar, dass ich das auch anders lösen könnte, sowas gibts
sogar in den verschiedensten Ausführungen und Preisklassen fix fertig
... aber:
Auf diese Art werde ich nie die µ´s durchschauen und C werd ich auch
nicht lernen. Und sorry, aber die Kosten sind in diesem Fall für mich
zweitrangig.
lG Kurt
Kurt W. schrieb:> Auf diese Art werde ich nie die µ´s durchschauen und C werd ich auch> nicht lernen.
Dieses Projekt ist dafür sowieso nicht geeignet.
Viel zu umfangreich, viel zu komplex.
Fang mit C am PC an, kauf dir einen Kernighan&Ritchie und arbeite da mal
mindestens das erste Drittel durch. Danach kannst du auf den µC wechseln
und dort mit dem AVR-gcc-Tutorial deine ersten Schritte machen.
Fang am µC mit Aufgabenstellungen an, die dort sinnvoll sind. Wie das
berühmt berüchtigte LED-Blinken, Taster abfragen, mal ein Relais
schalten, etc. Dann wird irgendwann mal ein LCD kommen und die Taster
werden durch die Entprellung gehen. Dann kann man auch schon mal
kleinere Projekte machen, in denen erste Ansätze zu einem Menü zu finden
sind. Irgendwann nimmt man sich dann zb. schon auch mal den ADC vor.
Vielleicht sogar im Zusammenhang mit einer PWM. Auf jeden Fall aber ist
der sichere Umgang mit Timern auf einem µC schon mal Grundvoraussetzung.
Wenn du dann soweit bist (das kann, wenn du fleissig bist, bereits in ca
1 Jahr sein), dann bist du auch soweit, dieses Projekt angehen zu können
und hast ganz gute Chancen, dass das auch was wird.
@ Karl Heinz
Wenn ich 20 Jahre alt wäre würde ich Deinen Ratschlag befolgen. Bin ich
aber (leider) nicht mehr. Du hast natürlich recht, dass eine fundierte
Grundlage sicher der richtige Weg ist, eigenständig Programme zu
erstellen. Aber das will ich gar nicht, ich habe nicht die Absicht,
Programmierer zu werden.
Selbstverständlich habe ich mir parallel dazu einige "Lehrbücher" und
Experimentierkästen gekauft, und das "gefürchtete LED blinken" Programm
habe ich auch schon absolviert. Der Vergleich hinkt jetzt vorne und
hinten, aber sieh es mal so: Um Autofahren zu lernen, muss niemand
wissen, wie eine Pleuelstange gegossen oder ein Gummireifen hergestellt
wird, aber jeder sollte wissen, wo der Ölstand oder der Luftdruck
kontrolliert wird.
Es ist mir vollkommen klar, dass ich ohne Hilfe da nicht sehr weit
kommen werde, aber genaugenommen habe ich schon ziemlich sämtliche
Einzelteile zusammen, mein LCD zeigt bereits die "Uhrzeit" an
(einstellen kann ich es noch nicht), ein ADC schaltet bereits tadellos
(noch ohne Hysterese) usw.
Selbstverständlich gehören diese Codeschnipsel noch optimiert und
angepasst, und als nächstes, und das ist vielleicht für mich der
schwierigste Teil, zusammengeführt.
Anbei hänge ich noch den Code meines 4 x 20 LCD´s ( EA W204B-NLW )an.
Diverse (Anfänger!) Kommentare habe ich hinzugefügt.
Also wie gesagt, ich ersuche um Nachsicht und bitte trotzdem um Hilfe
...
Hallo,
nach lesen Deiner Ziele bezweifele ich, dass der ATmega8 dafür genügend
Flashspeicher hat.
Gerade Menüs mit ihren Texten verschlingen sehr sehr viel davon.
Dabei ist es fast egal, ob man das Menü Funktional oder
Tabellengesteuert programmiert.
Sorry, ich vergaß, die Datei anzuhängen und hole dies hiermit nach.
@ Uwe:
Schön langsam fürchte ich das auch, aber einen größeren µC
einsetzten kann ich ja dann immer noch ...
und ja, er lebt, ggg ... und wenn er nicht gestorben ist, dann ....
PS:
Die angehängte Datei Main.c ist für das LCD W204B-NLW von EA in
Verbinung mit einem ATmega8. Ebenfalls angehängt habe ich den
derzeitigen Schaltplan sowie ein Foto des Versuchsaufbaus.
muss aus der ISR raus.
In einer ISR dauern Ausgaben zum einen viel zu lange.
Das ist das eine 'Problem', mit dem man eventuell sogar noch leben
könnte. Das viel schwerwiegendere Problem ist aber
* wer sagt, dass die Uhrzeit immer und überall anzuzeigen ist? Kein
Mensch sagt das. Gerade, wenn da ein Menü angezeigt wird, über welches
zb irgendwelche Einstellungen gemacht werden, brauchst du den Menüplatz
* am schwerwiegensten ist aber: das wird nicht die einzige Stelle im
Programm sein, an der Ausgaben gemacht werden. Hast du eine Idee, was
passiert, wenn gerade im Hauptprogramm eine Ausgabe gemacht wird,
währenddessen ein Timer-Interrupt kommt der nichts besseres zu tun hat,
als selbst eine Ausgabe zu machen? Da kann dir alles mögliche passieren,
angefangen von "einer normalen Textausgabe wird plötzlich der Cursor
unter dem Hintern weggezogen" bis hin zu "das LCD hängt sich komplett
auf, weil sich die Hardware-Ansteuerungen gegenseitig in die Haare
kommen".
Bedient werden soll das Ganze mit insgesamt 6 Tasten :
3
1) (PC0 5,0V) Aus - Ein -Automatik
4
2) (PC0 2,5V) Setup
5
3) (PC1 5,0V) Enter
6
4) (PC1 2,5V) Info
7
5) (PC2 5,0V) +
8
6) (PC2 2,5V) -
Das bedeutet du willst die Tasten mit dem ADC abfragen?
Finde ich keine gute Idee.
Mach dir mal einen Überblick, welche Pins du eigentlich frei hast. Zur
Not kommt man auch mit 3 Tasten durch (jeder Drehencoder hat im Prinzip
nur 3 Tasten) und gerade bei Einstellungen will ich mir das eigentlich
nicht antun, auf einen Autorepeat verzichten zu müssen. D.h. da kommt
die PeDa Entprellung in die ISR mit dazu und du hast im Prinzip deine
Tasten damit hardware-abfragemässig schon erledigt und bereit zur
Verwendung.
Auf meiner Heitungssteiuerung hab ich das zb so gemacht:
3 Tasten (eigentlich ein Drehencoder mit Drucktaster, spielt aber keine
Rolle. Für deine Zwecke sind das einfach nur 3 Tasten: '+', '-' und
'Enter')
Es gibt einen 'Hauptbildschirm' (4-zeiliges LCD)
Auf dem werden die wichtigsten aktuellen Werte angezeigt.
Mit '+' bzw '-' kann ich zwischen den Operationsmodi wechseln. Bei dir
ist das 'Steuerung ein', 'Steuerung aus', 'Steuerung automatic'.
Ein Druck auf 'Enter' bringt mich ins Menüsystem.
Da gibt es für die einzelnen Bereiche jeweils eigene Submenüs. MIttels
'+' bzw '-' kann ich zwischen den Menüpunkten wechseln. Ein Druck auf
'Enter' löst die jeweilige Operation aus. In jedem Menü gibt es einen
Punkt 'Exit', der mich wieder eine Menüebene höher bringt bzw. dann
wieder zurück zum Hauptbildschirm.
Einzelne Menüpunkte können auch so sein, dass sie nicht in ein Submenü
weiter verzweigen, sondern in eine Einstellmaske um zb die Uhrzeit
numerisch einzustellen. Die Tasten '+' bzw '-' dienen dann dazu, den
jeweiligen numerischen Wert zu verändern, mittels 'Enter' geht es weiter
zum nächsten Wert bzw. wenn das bereits der letzte Wert für diese
Eingabe war, wieder zurück zum aufrufenden Menü.
PS: wenn dein LCD Code bereits korrekt funktioniert, dann lagere ihn aus
in ein eigenes C-File, so dass du dir den Hauptcode möglichst kurz und
übersichtlich hältst. Das hat ja auch keinen Sinn, wenn dein
Programm-Text in ein einziges C-File gequetscht ist und das so lang ist,
dass du dir einen Wolf scrollst, wenn du irgendwas suchst. Gerade
Funktionalität wie LCD ist sauber in sich geschlossen, so dass man das
gut in eine eigene C-Datei auslagern kann.
> @ Uwe: Schön langsam fürchte ich das auch
Keine Sorge. Bei deinen Anforderungen ist der Mega8 groß genug. So
umfangreich ist das Programm auch wieder nicht. Da sind ja kaum Daten zu
verarbeiten. Und mit 8Kb kommst du locker über die Runden.
Darüber
> Aber das will ich gar nicht, ich habe nicht die Absicht,> Programmierer zu werden.
sag ich nicht viel. Denn ein gewisses Mindestmass an Wissen braucht man
nun mal. Selbst wenn man kein professioneller Programmierer werden
möchte. Wer Schach spielen will, muss nun mal die Möglichkeiten aller
Figuren kennen und nicht nur wissen wie Bauer und Dame ziehen können.
Das du die Feinheiten der sizilianischen Eröffnungen als Hobby-Spieler
nicht kennen musst, ist schon ok. Aber ein gewisses Mindestmass braucht
es eben. Sonst spielt man nicht Schach, sondern hampelt herum. In der
Programmierung ist das nicht anders.
> Es ist mir vollkommen klar, dass ich ohne Hilfe da nicht sehr weit kommen werde
Das Problem ist nämlich: Wie soll man jemandem helfen, der bei jedem
2-ten Wort ein 'Hä' gepaart mit einem Schulterzucken von sich gibt, weil
er die Worte nicht versteht bzw. den Sinn von Sätzen nicht versteht, in
denen der Helfer eine Grundidee skizziert und erwartet, dass der
Hobbyprogrammierer in der Lage ist, diese Idee auch umzusetzen, weil das
eigentlich eine Basistechnik ist.
Oder auf Deutsch: Wer in einem Installateurforum nachfrägt, wie man
einen Dichtungssitz im Wasserhahn nachfräst, aber nicht mehr kann als
mit dem Hammer auf Rohre einzudreschen, sollte besser die Finger davon
lassen. Nur mit dem Unterschied, dass man das eine in einer halben
STunde zeigen kann, während Basis-Programmierung lernen ein ganz klein
wenig länger dauert.
Und da ist es mir auch wurscht, dass du keine 20 mehr bist.
@ Karl Heinz
Danke für die zahlreichen Hinweise.
Allerdings habe ich die 6 Tasten nicht grundlos gewählt. Ich sagte ja
schon, dass es vergleichbare Lösungen bereits fix und fertig in diversen
Preisklassen zu kaufen gibt. Ob ich nun die ADC´s für die Tasten
verwende oder nicht, möchte ich mir vorläufig noch offen lassen. V
Ich möchte das Projekt jedoch so bedienerfreundlich wie möglich
gestalten, so dass nicht nur ich es bedienen kann sondern dass es nahezu
selbsterklärend ist. Derzeit habe ich einen (kommerziel hergestellten)
Regler einer auch in diesem Forum bekannten Firma in Bertieb, ein wahres
Wunderwerk an Technik und Einstellmöglichkeiten. Nur eine einfache
Bedienung ist was anderes - wenn da irgendwie an der Anlage hantiert
werden muss, wird einfach der Stecker gezogen ...
Deinem Vorschlag, bestimmte Programmteile auslagern, kann ich nur
kommentarlos zustimmen, das ist sowieso geplant. Wie gesagt, die hier
vorliegende Version ist der Anfang.
mfG Kurt
Kurt W. schrieb:> Allerdings habe ich die 6 Tasten nicht grundlos gewählt.
Drum sagte ich ja auch, erst mal einen Überblick verschaffen, welche I/O
benötigt werden und unabdingbar sind. Wenn du 6 Tasten willst, dann
benutz auch 6 I/O dafür (mit einer Matrix käme man noch auf 4 I/O
runter, bringt also so gesehen nicht so wahnsinnig viel).
> Ich sagte ja> schon, dass es vergleichbare Lösungen bereits fix und fertig in diversen> Preisklassen zu kaufen gibt.
Das heisst ja nicht, dass man nicht seine eigene Lösung dafür machen
darf. Die kann von der Benutzerfreundlichkeit genausogut sein, wie die
gekaufte. Man muss sich nur trauen, die Benutzung auch mal anders zu
machen.
> Ob ich nun die ADC´s für die Tasten> verwende oder nicht, möchte ich mir vorläufig noch offen lassen. V
Das kannst du aber nicht. Mit der Vorgabe
1
1)(PC05,0V)Aus-Ein-Automatik
2
2)(PC02,5V)Setup
3
3)(PC15,0V)Enter
4
4)(PC12,5V)Info
5
5)(PC25,0V)+
6
6)(PC22,5V)-
ist durch die unterschiedlichen Spannungslevel (wenn ich die richtig
interpretiere), der Einsatz des ADC ein muss. Anders kannst du nun mal
5.0V nicht von 2.5V unterscheiden.
> Ich möchte das Projekt jedoch so bedienerfreundlich wie möglich> gestalten, so dass nicht nur ich es bedienen kann sondern dass es nahezu> selbsterklärend ist.
Ja. Das bedeutet aber noch lange nicht, dass man für jeden Pfurz eine
eigene Taste braucht.
Die Kernaussage um die es mir geht lautet:
Wenn du die Sache mit den Spannungen bei den Tasten nur deswegen gemacht
hast, weil du sonst zu wenige I/O hast, dann überleg dir mal, ob du
nicht mit einer geänderten Bedienerführung und weniger Tasten auch über
die Runden kommst. Es gibt Möglichkeiten dazu.
Wenn du aber sowieso genügend I/O Pins hast, so dass du deine Tasten
alle direkt anschliessen kannst, dann ist das Thema sowieso gestorben.
Aber die Krücke mit unterschiedlichen Spannungen würde ich nicht
akzeptieren. Dann schon lieber eine geänderte Bedienerführung.
> Aber die Krücke mit unterschiedlichen Spannungen würde ich nicht> akzeptieren.
Ups .... das war jetzt eindeutig.
Eigentlich dachte ich, es wäre eine durchaus übliche Methode, mehrere
Eingänge zu schaffen - ein Beitrag aus dem Forum hier brachte mich auf
diese Idee.
Nun, es ist wie gesagt auch anders möglich, ich wollte mir nur als
Reserve einige PIN´s freilassen. Im schlechtesten Fall wechsle ich dann
halt auf einen anderen µC. Danke jedenfalls für den Hinweis.
mfG Kurt
Ich finds ja auch schön, das du das Rad neu erfinden willst, aber ich
kann dir nur raten, für bekannte Komponenten wie z.B. das LCD, einfach
auf gut funktionierende und verlässliche Bilbliotheken zurückzugreifen.
Die LCD Behandlung hat Peter Fleury mit seiner Lib so gut erschlagen,
das du die Funktionen einfach benutzen kannst...
http://homepage.hispeed.ch/peterfleury/
Du hast dann mehr Zeit, um dich auf die anderen Sachen zu konzentrieren,
ich sage nur Zeitschaltuhr, Regler für Temperatur usw...
http://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC
Von wegen Krücke mit Tasten an einem A/D-Eingang. Das ist durchaus
gängige Praxis und unter Umständen sehr effizient. Wenn man eh genug
I/Os frei hat und sich Taster und MC auf einer Platine befinden, macht
es wenig Sinn - sonst aber schon.
Beispiel Porsche-Lenkrad: 8 Tasten an einer Leitung (flexible Platine,
die um die Lenksäule geht als Leitung zu Steuergerät. Funktioniert
perfekt und mit minimalem Aufwand.
Immer diese Fundamentalisten :D
Habe C eigentlich erst auf dem µC intensiver verwendet. Am Rechner kommt
man mit Java oder auch Perl viel schneller ans Ziel, daher bin ich da
eigentlich nie richtig mit C in Berührung gekommen. Wenn du Verständnis
für Elektronik mitbringst und dir binäre Operatoren vertraut sind
(setzen/lesen von Registern, Bitshiften, etc.) dann ist C auf dem µC
wirklich kein so großes Hexenwerk. Aufpassen muss man eben bei den
Interrupts, da man sich da schnell Variablen verbiegen kann und am Ende
nix sinnvolles mehr drin steht. Aber du brauchst auf alle Fälle nicht
vorher Solitär in C nachprogrammieren, bevor du dich an nen µC wagst.
Für das Abfragen von vielen Tastern kann man das natürlich durchaus über
einen ADC machen, zuverlässiger finde ich aber eher das Multiplexen. Für
Taster braucht man da auch gar keine große Sample-Rate und ist mit 3 IOs
auch recht "günstig" dabei.
Für das LCD würde ich dir wohl auch die Lib von Peter Fleury anraten.
Überhaupt gibt es einen ganzen haufen nützlicher Bibliotheken im Netz...