Re: Projektvorstellung Raumthermostat mit Grafikdisplay - Frage zu Drehgeberauswertung Kategorie: Programmierung C (von da hans mal wieder... - 8.08.2012 22:05) | |
Als Antwort auf Projektvorstellung Raumthermostat mit Grafikdisplay - Frage zu Drehgeberauswertung von Seeman - 8.08.2012 21:42
| |
> 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? | |
Antwort schreiben Antworten: Darum keine Mega128 - oder doch? (von Seeman - 8.08.2012 22:19) Re: Darum keine Mega128 - oder doch? (von da hans mal wieder... - 8.08.2012 22:59) Re: Darum keine Mega128 - oder doch? (von da Hans schon wieder - 9.08.2012 18:39) Re: Projektvorstellung Raumthermostat mit Grafikdisplay - Frage zu Drehgeberauswertung (von da hans mal wieder... - 8.08.2012 22:13) 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