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

Projektvorstellung Raumthermostat mit Grafikdisplay - Frage zu Drehgeberauswertung Kategorie: Programmierung C (von Seeman - 8.08.2012 21:42)
Ich nutze:
C-Control Pro Mega32
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


    Antwort schreiben


Antworten:

Re: Projektvorstellung Raumthermostat mit Grafikdisplay - Frage zu Drehgeberauswertung (von Torsten - 11.08.2012 11:58)
    Re: Projektvorstellung Raumthermostat mit Grafikdisplay - Frage zu Drehgeberauswertung (von Seeman - 14.08.2012 19:45)
Hardware reicht aus (von Montelucon - 9.08.2012 17:03)
    Re: Hardware reicht aus (von Seeman - 9.08.2012 20:14)
        Nur noch so... (von Montelucon - 11.08.2012 1:29)
Re: Projektvorstellung Raumthermostat mit Grafikdisplay - Frage zu Drehgeberauswertung (von da hans mal wieder... - 8.08.2012 22:05)
    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)