Forum: Mikrocontroller und Digitale Elektronik A/D-Wandler WOVERFLOW


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Moin zusammen ich krieg eine komische Fehlermeldung vom Compiler mit dem 
Atmel Studio und wenn ich Atmel Studio neustarte und nichts ändere im 
Quellcode dann ist die Fehlermeldung weg.

Fehlermeldung:

Warning  1  large integer implicitly truncated to unsigned type 
[-Woverflow]  AVR-Studio\ADC\ADC\ADC.c  36  3  ADC
Warning  2  large integer implicitly truncated to unsigned type 
[-Woverflow]  AVR-Studio\ADC\ADC\ADC.c  39  4  ADC
Warning  3  large integer implicitly truncated to unsigned type 
[-Woverflow]  AVR-Studio\ADC\ADC\ADC.c  42  6  ADC


Kann damit nicht wirklch was anfangen weil der an PORTB und Ergebnis was 
rummeckert. Vielen Dank im voraus




#include<avr/io.h>                  //Bibliotheken und Headerdateien 
einbinden, Deklarationen und Definitionen der Variablen / Konstanten 
vornehmen,
#define F_CPU 1000000                //Definition Taktfrequeznz 
µController
#include<util/delay.h>                //delay.h einbinden

1
int main(void)                    //Hauptprogramm
2
{
3
  //Initialisierung Ein und Ausgänge
4
  DDRB = 0xFF;                  //Datenrichtungsregister PortB auf Ausgang
5
  DDRA = 0x00;                  //Datenrichtungsregister PortA auf Eingang
6
  PORTB = 0xFF;                  //Ausgänge auf High
7
  uint16_t ergebnis;                //Variable zur Zwischenspeicherung des eingelesenen analogen Wertes
8
    
9
  //ADC - Konfiguration 
10
  
11
  ADMUX |= (1<<ADLAR) | (1<<MUX0) |(1<<MUX1);     // Externe Vref und Linksbündiges Ergebnis LSB werden abgeschnitten Mux0 und Mux 1 --> PortA Pin 3 
12
  ADCSRA |= (1<<ADEN)  | (1<<ADSC)  | (1<ADATE)   | (1<<ADPS2) | (1<<ADPS1);
13
  
14
  
15
  
16
  
17
    
18
    while(1)
19
    {
20
    
21
  
22
    while(  !(ADCSRA & (1<<ADIF))) {}        //Polling
23
    
24
    ergebnis = ADCH;                //Schreiben der obersten 8 Bits in Variable Ergebnis, die beiden LSB in ABCL werden "abgeschnitten"
25
    ADCSRA |= (1<<ADIF);
26
    
27
    if (ergebnis < 28)                //Abfrage der Größe von Ergebnis für lineare Ausgabe auf LEDS (verschachtelte If Schleife)
28
    {PORTB = 0b111111111;}
29
    
30
      else if (ergebnis < 56)
31
      {PORTB = 0b111111110;}
32
    
33
          else if (ergebnis < 84)    
34
          {PORTB = 0b111111100;}
35
      
36
            else if  (ergebnis < 112)
37
            {PORTB = 0b11111000;}
38
    
39
              else if (ergebnis < 140)
40
              {PORTB = 0b11110000;}
41
                
42
                else if (ergebnis < 168)
43
                {PORTB = 0b11100000;}
44
                  
45
                  else if (ergebnis < 196)
46
                  {PORTB = 0b11000000;}
47
    
48
                    else if (ergebnis < 224)
49
                    {PORTB = 0b10000000;}
50
                      
51
                      else
52
                      {PORTB = 0b0000000;}
53
    
54
    
55
    
56
    
57
  
58
     
59
     
60
    }                              //Ende Endschlossschleife
61
}                                //Ende Hauptprogramm

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Deine Fehlermeldungen sind keine Fehlermeldungen, sondern Warnungen.

Die enthalten Zeilennummern, so daß Du die korrespondierenden Stellen in 
Deinem Quelltext finden kannst.

> Kann damit nicht wirklch was anfangen weil der an PORTB und Ergebnis was
> rummeckert.

Vielleicht steht irgendwo eine 1 oder eine 0 zuviel bei Deinen 
Konstanten, die Du an PORTB zuweist?

Ich zähle die Stellen jetzt nicht nach; Du erkennst jetzt einen der 
großen "Vorteile" der Binärschreibweise.

von Thomas (Gast)


Lesenswert?

Oh man ja ich meinte natürlich Warnungen, was ein dummer Fehler ich 
hatte tatsächlich ein paar 1 zu viel angegeben

vielen Dank für die schnelle Hilfe

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Tip zur Vermeidung solcher Probleme:

Benutze #defines für solche Konstanten, definiere die alle an einem 
Stück.

Das kann dann so aussehen:
1
#define WERT_KLEINER_028 0b111111111
2
#define WERT_KLEINER_056 0b111111110
3
#define WERT_KLEINER_084 0b111111100
4
#define WERT_KLEINER_112 0b11111000
5
#define WERT_KLEINER_140 0b11110000
6
#define WERT_KLEINER_168 0b11100000
7
#define WERT_KLEINER_196 0b11000000
8
#define WERT_KLEINER_224 0b10000000
9
#define WERT_SONST       0b0000000
10
11
...
12
    if (ergebnis < 28)                //Abfrage der Größe von Ergebnis für lineare Ausgabe auf LEDS (verschachtelte If Schleife)
13
    {PORTB = WERT_KLEINER_028;}
14
    
15
      else if (ergebnis < 56)
16
      {PORTB = WERT_KLEINER_056;}
17
    
18
...


Und Du siehst das Problem Dich förmlich anspringen.

Alternative: Investiere eine Viertelstunde Zeit und lerne die 16 
Bitkombinationen, die sich hinter den Werten 0x0 bis 0xF verbergen. 
Trainier' das eine Weile lang, und Du musst nie wieder Einsen und Nullen 
zählen oder gar hinschreiben.
Das haben vor Dir ganze Generationen anderer Programmierer hinbekommen, 
denn die 0b-Schreibweise ist nicht im C-Sprachstandard enthalten, 
sondern nur eine proprietäre Erweiterung Deines C-Compilers.

von spess53 (Gast)


Lesenswert?

Hi

>PORTB = 0b111111110;

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.