Forum: Mikrocontroller und Digitale Elektronik 2x16 Anzeige


von Andy (Gast)


Lesenswert?

Hallo

hab mal ne Frage zur anzeige von Zahlen in einem Display.

Ich messe über den ADC einen Wert und will diesen als Zahl über die 
Anzeige darstellen, funktioniert auch soweit.
Nur wenn der Wert z.B. zwischen 0 und 1 ist springt die Anzeige zwischen 
den Zahlen hin und her.
Wie kann ich das am besten machen dass entweder 0 oder 1 angezeigt wird.
Hier mal die Funktion zur Zahl
1
void lcd_zahl(uint16_t zahl)
2
{
3
  uint8_t ziffer1=0;
4
  uint8_t ziffer2=0;
5
  uint8_t ziffer3=0;
6
  uint8_t ziffer4=0;
7
  
8
    while(zahl>=1000)
9
    {
10
      ziffer1+=1;
11
      zahl+=-1000;
12
    }
13
    while(zahl>=100)
14
    {
15
      ziffer2+=1;
16
      zahl+=-100;
17
    }
18
    while(zahl>=10)
19
    {
20
      ziffer3+=1;
21
      zahl+=-10;
22
    }
23
    ziffer1+=0x30;
24
    ziffer2+=0x30;
25
    ziffer3+=0x30;
26
    ziffer4=zahl+0x30;
27
    
28
    lcd_data(ziffer1);
29
    lcd_data(ziffer2);
30
    lcd_data(ziffer3);
31
    lcd_data(ziffer4);
32
33
}

von Uwe (de0508)


Lesenswert?

Wenn dein ADC Messwert springt, versuche mal einen Mittelwert über 8 
Messwerte zu bilden.

Die Schreibweise ist unorthodox aber die Berechnung ist richtig.
1
zahl+=-1000;

Es gäbe auch noch
1
zahl-=1000;

von Andy (Gast)


Lesenswert?

Ok werd ich mal versuchen

von Andy (Gast)


Lesenswert?

Immernoch der gleiche Effekt.
Ich glaub ich hab da ein Fehler in der Messung
1
uint16_t ADC_Read( uint8_t channel )
2
{
3
4
uint16_t  AdcValue=0;
5
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);   
6
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
7
8
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
9
  while ( ADCSRA & (1<<ADSC) ) {
10
     ;     // auf Abschluss der Konvertierung warten 
11
  }
12
  AdcValue = ADCW; 
13
  AdcValue = 0; 
14
  
15
  for(int i=0; i<8; i++ )
16
  {
17
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
18
    while ( ADCSRA & (1<<ADSC) ) {
19
      ;   // auf Abschluss der Konvertierung warten
20
    }
21
    AdcValue += ADCW;        // Wandlungsergebnisse aufaddieren
22
  }
23
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
24
 
25
 AdcValue /= 8;                     
26
27
return AdcValue;
28
29
}

von Karl H. (kbuchegg)


Lesenswert?

Das passt schon.

Allerdings bist du an einem Punkt angelangt, an dem dein Hardwareaufbau 
schon recht gut sein muss, damit die letzte Stelle im ADC-Ergebnis wie 
festgenagelt steht. Dazu gehört auch die Qualität der Referenzspannung. 
Dazu gehört auch, dass es von nirgendwo anders Einstreuungen gibt, dass 
dein Neztteil eine absolut saubere Spannung liefert, etc.

Immerhin bist du bei einer 5V Referenzspannung in einem Bereich, dass 4 
Millivolt Differenz ausreichen um am ADC feststellbar zu sein. Und das 
ist schon gar nicht mehr so viel. Überhaupt bei einem eher 
'hausbackenem' Hardware-Aufbau.

Fazit: Die letzte binäre Stelle in einem ADC ist meistens nicht 
besonders aussagekräftig, weil sie in vielen Fällen nur mehr das 
unvermeidliche Rauschen des Messaufbaus anzeigt. Ein guter Messaufbau 
rauscht weniger, ein schlechter rauscht mehr. Für den Hausgebrauch ist 
das aber recht unerheblich, denn ob du 4.875 oder 4.879 Volt an der 
Anzeige heist, spielt tatsächlich meistens keine wirkliche Rolle.

Anstatt über 8 Messungen zu mitteln, könntest du über 16 mitteln. Aber: 
Das ändert nichts am grundsätzlichen Problem, du kaschierst es nur ein 
bißchen besser.

von Andy (Gast)


Lesenswert?

OK danke, dann weiß ich mal Bescheid.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Anstatt über 8 Messungen zu mitteln, könntest du über 16 mitteln. Aber:
> Das ändert nichts am grundsätzlichen Problem, du kaschierst es nur ein
> bißchen besser.

Bei etwas mehr Aufwand seitens der Firmware zur Bildung eines gleitenden 
Mittelwerts steht nicht nur die letzte Stelle auf dem Display, sondern 
man kann auch noch die Auflösung des ADC steigern. Das Rauschen der 
Schaltung ist hier sogar nützlich. Das geht zwar auf Kosten der 
Bandbreite, was bei einem Voltmeter aber eher kein Problem darstellt.

von Andy (Gast)


Lesenswert?

Wie?

von batman (Gast)


Lesenswert?

Andy schrieb:
> Wie kann ich das am besten machen dass entweder 0 oder 1 angezeigt wird.

Tja was soll bei welchem Wert angezeigt werden? Wer soll das 
entscheiden. ;)

von Andy (Gast)


Lesenswert?

Das ist egal ob z.B. 51 oder 52, die Zahlen sollen nur nicht hin und her 
springen.

von Dietrich L. (dietrichl)


Lesenswert?

Andy schrieb:
> Das ist egal ob z.B. 51 oder 52, die Zahlen sollen nur nicht hin und her
> springen.

Möglichkeiten:
1. Pausen zwischen 2 Anzeigen größer machen. Das "springt" dann zwar 
noch, fällt aber nicht mehr so auf ;-)
2. Hysterese einbauen: alten Wert merken; erst wenn der neue Wert mehr 
als z.B. 2 Schritte vom alten abweicht, wird er angezeigt (Nachteil: 
schlechtere Auflösung)
3. Variante 2 kann man so verbessern, das man die Abweichung vom Altwert 
bei jeder Messung aufaddiert und erst bei überschreiten einer Schwelle 
den neuen Wert anzeigt (ich glaube, das heißt "kumulierter Mittelwert").
4. über "normale" Mittelwertsbildung wurde ja schon geredet.
5. ...

Gruß Dietrich

von batman (Gast)


Lesenswert?

Du könntest mal den Hersteller meines Multimeters beraten.

Andy schrieb:
> Das ist egal ob z.B. 51 oder 52, die Zahlen sollen nur nicht hin und her
> springen.

Was glaubst du denn, warum sie das tun. Problemlösung ohne 
Ursachenkenntnis geht meist schief.

von Andy (Gast)


Lesenswert?

@Dietrich L.
Danke für die Antwort das versuch ich mal.

@batman
Die Antwort kannst dir schenken wenn ich es wüste würde ich nicht 
fragen.

von Spess53 (Gast)


Lesenswert?

Hi

>Die Antwort kannst dir schenken wenn ich es wüste würde ich nicht
>fragen.

Dann überlege doch mal. Wenn der Mittelwert deines Eingangssignals 
zwischen zwei Quantisierungsstufen des AD-Wandlers liegt, dann bewirkt 
das Rauschen auf dem Signal das mal der größere und mal der kleinere 
Wert gemessen wird. Dadurch 'hüpft' dein Wert halt.

MfG Spess

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.