Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Projektvorstellung Raumthermostat mit Grafikdisplay - Frage zu Drehgeberauswertung Kategorie: Programmierung C (von da hans mal wieder... - 8.08.2012 22:31)
Als Antwort auf Re: Projektvorstellung Raumthermostat mit Grafikdisplay - Frage zu Drehgeberauswertung von da hans mal wieder... - 8.08.2012 22:13

> > > 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....
falsch ge postet, vergiss des mit der Anleitung wieder


    Antwort schreiben


Antworten: