Forum: Mikrocontroller und Digitale Elektronik Display löscht Anzeige nicht


von Christoph H. (christoph_b)


Lesenswert?

Hallo

Ich programmiere mit dem MK3 von myavr.de.

Habe eine Einfaches Programm welches bei zuwenig Licht einen Text auf 
dem Display ausgeben soll. Das Problem ist das jedes angezeigte Zeichen 
erhalten bleibt. Das heißt aus "OK" und wird "OKCH OK" da davor "NOCH 
OK" angezeigt wurde.

Auserdem wieso gibt das Display einen ad_wert von bis zu 9XXX aus. 
Minimum ist bei ca 0400

1
/*
2
 * Lichtsteuerung.c
3
 *
4
 * Created: 05.07.2011 17:28:08
5
 *  Author: Christoph
6
 */ 
7
8
9
typedef enum {
10
  false = 0,
11
  true
12
}bool;
13
14
#define F_CPU 16000000
15
#include <avr\io.h>
16
#include <avr\MK3_2560_LED.h>  //von www.mikrocontroller-4u.de
17
#include <avr\MK3_2560_ADC.h>  //von www.mikrocontroller-4u.de
18
#include <avr/MK3_2560_LCD.h>  //von www.mikrocontroller-4u.de
19
#include <avr/delay.h>
20
21
22
int main (void)
23
{
24
  unsigned int ad_wert;
25
  
26
27
  MK3_INIT_LED();          // init der LEDs
28
  MK3_INIT_ADC();          // init des ADC
29
  MK3_INIT_LCD();          // init des LCD
30
  MK3_LCD_CLEAR();        // LCD loeschen
31
  DDRD = 0xFF;          //PORT D auf Ausgang
32
  
33
  MK3_ADC_CHANNEL(ADC1);      // Kanal 1 einstellen
34
  
35
36
  while (true)
37
  {
38
    ad_wert=MK3_ADC_MITTEL_CH(ADC1, MW_8);    // AD-Wert lesen mittelwert aus 8 Messungen
39
    if (ad_wert > 768)
40
    {
41
      PORTD=0b00000001;
42
      MK3_LCD_SETCURSOR(20,16);
43
      MK3_LCD_PRINT_STRING("OK");
44
      
45
    } 
46
    else
47
    {
48
      if (ad_wert >512)
49
      {
50
        PORTD=0b00000010;
51
        MK3_LCD_SETCURSOR(20,16);
52
        MK3_LCD_PRINT_STRING("NOCH OK");
53
        
54
      } 
55
      else
56
      {
57
      if (ad_wert > 256)
58
      {
59
        PORTD=0b00000100;
60
        MK3_LCD_SETCURSOR(20,16);
61
        MK3_LCD_PRINT_STRING("zu dunkel");
62
      } 
63
64
      }
65
    }
66
    
67
    if ((PINH & (1 << PH0)) == 1)
68
    {
69
      MK3_LCD_UINT_AT(4,6,ad_wert);  
70
    }
71
  }
72
  return 0;
73
}

MFG Christoph

von Karl H. (kbuchegg)


Lesenswert?

Christoph B. schrieb:
> Hallo
>
> Ich programmiere mit dem MK3 von myavr.de.
>
> Habe eine Einfaches Programm welches bei zuwenig Licht einen Text auf
> dem Display ausgeben soll. Das Problem ist das jedes angezeigte Zeichen
> erhalten bleibt.

Ja klar.

Nur weil du 2 Zeichen ausgibst, verschwinden ja nicht die restlichen 
Zeichen auf dem LCD irgendwie magisch.

Der längste Text, den du ausgibst lautet "zu dunkel". Das sind 9 
Zeichen. Gib also nach dem "OK" noch 7 Leerzeichen aus "OK       " und 
die Leerzeichn überschreiben das, was von einem eventuellen "zu dunkel" 
noch auf dem LCD steht.


> Auserdem wieso gibt das Display einen ad_wert von bis zu 9XXX aus.
> Minimum ist bei ca 0400

Ziemlich sicher das gleiche Problem.
Wenn du einen Wert von 98 am LCD stehen hast, und du überschreibst den 
mit 4, dann steht danach 48 am LCD. Denn die 8 sind durch das jetzige 
1-stellige Ergebnis nie überschrieben worden.


Dein µC macht genau das was du ihm sagst. Nicht mehr und nicht weniger. 
WEnn du 2 Zeichen ausgibst, dann werden auch nur 2 Zeichen ausgegeben.

von spess53 (Gast)


Lesenswert?

Hi

> Das Problem ist das jedes angezeigte Zeichen
>erhalten bleibt. Das heißt aus "OK" und wird "OKCH OK" da davor "NOCH
>OK" angezeigt wurde.

Dann fülle die kürzeren Strings mit Leerzeichen auf.

MfG Spess

von ... (Gast)


Lesenswert?

Warum sollte sich das Display selber löschen? Überschreib den Rest doch 
einfach mit Leerzeichen.
Das Thema gabs doch grad schonmal:
Beitrag "Frage zu Bascom Programierstil"
Ok, ist BASCOM. Aber das Prinzip ist das Gleiche.

von Christoph H. (christoph_b)


Lesenswert?

hallo

was komisch ist das ich wenn ich das erste mal beim "Hochdrehen" vom ADC 
Werte von 0-1023 bekomme. Beim zweiten mal habe ich am anfang 04XX 
(0V)und bei 4.8V 9XXX stehen. Bei 5V zeigt es wieder 1023 an. ( XX steht 
für eine belibige Zahl)

Da nützen mich auch die Leerzeichen nichts.

MFG Christoph

von Karl H. (kbuchegg)


Lesenswert?

Christoph B. schrieb:
> hallo
>
> was komisch ist das ich wenn ich das erste mal beim "Hochdrehen" vom ADC
> Werte von 0-1023 bekomme. Beim zweiten mal habe ich am anfang 04XX
> (0V)

Du hast nicht 04XX sondern du hast dort 0XXX stehen. Die 0 stammt von 
der Zahl, die XXX von dem was vorher dort stand. Bei dir ist halt das 
erste X zufällig eine 4

> und bei 4.8V 9XXX stehen.

dann steht da etwas in der Größenordnung von 980X
Die 980 sind real und der Messwert. Die X stehen immer noch von vorher 
dort (als dein Messwert irgendwann größer als 999 war)

> Bei 5V zeigt es wieder 1023 an.

logisch. größer als 4 Stellen kannst du nicht kommen. Und wenn 1023 
ausgegeben wird, hast du wieder alle 4 Stellen überschrieben.

> Da nützen mich auch die Leerzeichen nichts.

Doch das tun sie. Du musst nur nach deiner Zahl ein paar Leerzeichen 
ausgeben, die dafür sorgen, dass nach einer Ausgabe von zb 4 (also einer 
einstelligen Zahl) eventuelle Reste von 15 (also einer zweistelligen 
Zahl) überschrieben werden. Denn sonst steht auf deinem Display nicht 4 
sondern 45.


Wie schon gesagt: Es wird genau das ausgegeben, was du angibst, dass 
ausgegeben werden soll. Nicht mehr und nicht weniger. Es liegt an dir, 
das so zu programmieren, dass beim Überschreiben Teile die nicht mehr 
gebraucht werden auch tatsächlich 'weggelöscht' (in Form von 'mit 
Leerzeichen überschrieben') werden. Deine Ausgabetreiber führen da nicht 
Buch darüber, was an welcher Stelle ausgegben wurde und löschen das 
Überzählige bei Bedarf. Wenn du eine 4 stellige Zahl 1023 mit einer 
3-stelligen Zahl 876 überschreibst, dann bleibt die 3 von 1023 am LCD 
stehen, denn durch 876 ist die ja nie überschrieben worden. Am LCD steht 
dann 8763. Gibst du aber nach der Zahl 876 noch zusätzlich (mindestens) 
1 Leerzeichen aus, dann überschreibt dir dieses Leerzeichen auch noch 
die 3 und am LCD steht dann tatsächlich 876, so wie es sein soll.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.