Re: Projektvorstellung Raumthermostat mit Grafikdisplay - Frage zu Drehgeberauswertung Kategorie: Programmierung C (von da hans mal wieder... - 8.08.2012 22:13) | |
Als Antwort auf Re: Projektvorstellung Raumthermostat mit Grafikdisplay - Frage zu Drehgeberauswertung von da hans mal wieder... - 8.08.2012 22:05
| |
> > Moin! > > > > > > Ich lese hier schon lange gelegentlich mit, habe aber nicht so viel Zeit zum > > Basteln, wie ich gerne hätte. > > Jetzt bin ich aber gerade schwer dabei, ein kleines Projekt umzusetzen: > > Einen Raumthermostat für meine Fu�bodenheizung. > > Die am Markt befindlichen Modelle sind mir in der Bedienung entweder zu > > unübersichtlich oder von den Funktionen her zu beschränkt. > > Ich möchte für jeden Tag ein Profil mit 4 Zeitpunkten definieren können. > > Im Endausbau sollen die Profile über meinen Webserver bequem per Browser > > gepflegt werden können. Aber das ist noch Zukunftsmusik... > > > > > > Zunächst bin ich beim Prototypen des einzelnen Themostaten. Folgende > > Hardware habe ich mir überlegt: > > - C-Control Pro Mega32 > > - Grafikdisplay 128 x 64 Pixel (Controller KS0107, Conrad Best-Nr. 181677 - 62) > > - Temperatursensor DS 18S20 > > - Inkrementaldrehgeber mit Tastfunktion zur Bedienung (evtl. auch Scrollrad > > aus einer Maus) > > - RGB-LED zur Statusanzeige > > - Piezo-Schallwandler für z.B. Tastenclick > > - RS-485/RS-422 für spätere Vernetzung > > - Relais für Ventilansteuerung > > optional: > > - Lichtsensor TSL 2561 D zur dynamischen Regelung der LCD-Beleuchtung > > > > > > Den Prototypen baue ich gerade auf dem Project-Board auf und bin zunächst > > dabei, das Display zum Laufen zu bekommen. > > Da ich reichlich Ports habe, habe ich das Display direkt angeschlossen: > > Datenbus ist Port A, Steuersignale kommen von einzelnen Bits von Port C. > > Das klappt auch soweit sehr gut. Leider habe ich dafür nirgends eine Lib > > gefunden, so dass ich selber eine mache. > > Die ist noch im Aufbau und nicht reif zur Veröffentlichung, aber später > > kann man darüber vielleicht nachdenken. > > > > Folgende Funktionen habe ich schon umgesetzt: > > - Display initialisieren, löschen > > - Setzen der Zeile im Ram, die als oberste Zeile auf dem Display angezeigt > > werden soll (man kann damit z.B. den Displayinhalt Zeilenweise hoch- oder > > runterscrollen) > > - Datenbyte an beliebiger Adresse schreiben/lesen > > - Setzten oder Löschen eines beliebigen Pixels > > - Schreiben von Text: Der Controller hat keinen Text "eingebaut" und ist > > wirklich dumm: > > Das Display besteht eigentlich aus zwei Displays (2 Controller), mit > > 64 x 64 Pixeln. > > Jede Spalte ist in 8 Bytes eingeteilt. Jeder Controller besitzt somit einen > > Speicher von 8x64 Byte. > > Jeder Pixel auf dem LCD entspricht einem Bit im Speicher. > > Um nun Text darzustellen, habe ich einfach ein Byte-Array der Grö�e 128 x 5 > > angelegt. Jeder Buchstabe besteht aus 5 x 7 Pixeln, genau wie bei den > > Alphanumerischen LCDs. > > > > Pro Buchstabe benötige ich also 5 Byte. Mit einem Pixel Abstand kann man > > also 21 Zeichen pro Zeile darstellen. Also insgesamt 21 x 8 Zeichen. > > Ich habe die ersten 128 Zeichen des alphanumerischen Displays "nachgebaut". > > Die interessanten Zeichen oberhalb von 128 (z.B. kleine Umlaute) habe ich an > > den Anfang (<31) gesetzt. > > > > Somit stellt sich dieses Display als gute Alternative zu den > > alphanumerischen Displays dar, weil man für weniger Geld statt 4 x 20 glatte > > 8 x 21 Zeichen bekommt + die grafischen Funktionen. :-) > > - Von der Wikipedia habe ich noch Funktionen für beliebige Linien und Kreise > > übernommen (Bresenham-Algorithmus), die ich nicht wirklich verstanden habe, > > aber sie funktionieren. ;-) > > > > Es fehlt noch: > > - Rechtecke (mit unterschiedlicher Rahmenstärke oder gefüllt) > > - Verschiedene Verknüpfungen mit dem bestehenden "Bild": überschreiben, > > invertiert, xor, or für alle Funktionen. > > - Darstellung von grö�eren Ziffern (z.B. 24 Pixel hoch - für den > > Temperatur-Istwert) > > > > > > Nachdem ich das Display soweit im Griff habe, habe ich mich dem Drehgeber > > zugewandt: > > Ich werte ihn in einem externen Interrupt aus: > > void INT_Inc(void) > > { > > Inc_Dir=Port_ReadBit(IN_D); > > AbsDelay(1); //entprellen > > Irq_GetCount(INT_1); > > } > > > > ich starte die Auswertung mit > > Irq_SetVect(INT_1,INT_Inc); > > Ext_IntEnable(1,2); > > > > und meine Schleife sieht so aus: > > while(1) > > { > > if (Inc_Dir==0) > > { > > Inc_Dir=2; > > if (i<127) > > i++; > > } > > else if (Inc_Dir==1) > > { > > Inc_Dir=2; > > if (i>0) > > i--; > > } > > if (j!=i) > > { > > WertAnzeigen(i); > > j=i; > > //Timer_T0PWM(i*2+1,PS0_8); <- hiermit hakt es > > } > > } > > > > So wie es oben steht funktioniert es ganz OK. Gibt es bessere Ideen? Ich > > habe nämlich das Problem, dass die Auswertung hakt, wenn ich den PWM- > > Ausgang mit dem Wert beschicke (oben auskommentiert), um die LED-Beleuchtung > > des Displays zu dimmen, dann reagiert das Programm nicht mehr gut auf den > > Drehimpulsgeber. (Der ist angeschlossen, wie im Datenblatt beschrieben mit > > 4 x 10 kOhm Widerständen und 10nF Kondensatoren.) > > > > > > Nun die Fragen: > > 1. Haltet Ihr meine Hardware-Auswahl für geeignet? > > 2. Wenn nein, was gibt es besseres? > > 3. Gibt es vielleicht einen Temperatursensor mit höherer Auflösung? > > 4. Warum hakt die Auswertung des Drehgebers bei gleichzeitiger Verwendung > > von PWM? > > 5. Kann ich da etwas optimieren, oder ist die Mega32 dafür zu langsam? > > 6. Weitere Ideen, Anregungen? ;-) > > > > Vielen Dank schon einmal. Es werden wohl im Verlauf des Projektes weitere > > Fragen kommen... > > > > Gru� von der Küste > > > > Jan > > wenn du extra zu Conrad fährst um die Teile zu kaufen, warum nimmst du dann eine Mega32 und > keine 128er? und wer hat diese anleitung überhaupt "geschrieben" oder ge PDF t.... | |
Antwort schreiben Antworten: Re: Projektvorstellung Raumthermostat mit Grafikdisplay - Frage zu Drehgeberauswertung (von da hans mal wieder... - 8.08.2012 22:31) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum