Forum: Mikrocontroller und Digitale Elektronik Arduino 10Bit ADC in 8Bit umwandeln


von Stefan S. (buffalochill)


Lesenswert?

Hallo,

ich hab jetzt angefangen mein erstes C Projekt auf Arduino mega (avr) 
2560 zu programmieren.
Es gibt eine Funktion mit der man dem Arduino sagt, dass er 8bit ADC 
lesen kann statt der standart 10bit:
--------------------------------------------
analogReadResolution(8)

analogReadResolution() is an extension of the Analog API for the Arduino 
Due and Zero.

---------------------------------------------

Geht aber nur bei Due und Zero, also nicht auf meinem Board. Das ist 
etwas doof, weil ich schon viel in Assembler gemacht habe weiss ich, 
dass es auch in 8 bit geht beim 2560. Wie erklär ich das meinem Arduino 
dass er das machen soll was der AVR auch kann:

; ADC-Konfiguration
ldi  temp, 0b01100000  ; ADC einstellen - Aref = AVCC | Linksbündig | 
ADC0
out  ADMUX, temp


im grunde macht die analogReadResolution(8) des Arduino Due Zero genau 
das was mein Assembler Code macht.

Oder hat vielleicht jemand ein bischen Code für Arduino da um die int 
10bit in ein byte 8bit zumzuwandeln :) ?

vielen Dank!

gruß
Stefan

von Peter II (Gast)


Lesenswert?

Stefan S. schrieb:
> Oder hat vielleicht jemand ein bischen Code für Arduino da um die int
> 10bit in ein byte 8bit zumzuwandeln :) ?
1
uint16_t wert10bit = ReadAnalog();
2
uint8_t wert8bit = wert10bit >> 2;

von Einer K. (Gast)


Lesenswert?

Dann verzichte auf die Arduino Komfort Funktionen und machs dir selber.

von Stefan S. (buffalochill)


Lesenswert?

Arduino F. schrieb:
> Dann verzichte auf die Arduino Komfort Funktionen und machs dir selber.

deshalb frag ich ja, ist mein erstes projekt in C und dementsprechend 
würde ich ja nicht fragen wenn ichs selbst einfach so könnte :-)

von Thomas E. (thomase)


Lesenswert?

Stefan S. schrieb:
> ; ADC-Konfiguration
> ldi  temp, 0b01100000  ; ADC einstellen - Aref = AVCC | Linksbündig |
> ADC0
> out  ADMUX, temp
Aber das kannst du? in C schreibst du:
1
ADMUX |= (1 << ADLAR) | (1 << NOCH_EIN_BIT);

von Stefan S. (buffalochill)


Lesenswert?

Peter II schrieb:
> Stefan S. schrieb:
>> Oder hat vielleicht jemand ein bischen Code für Arduino da um die int
>> 10bit in ein byte 8bit zumzuwandeln :) ?

> uint16_t wert10bit = ReadAnalog();
> uint8_t wert8bit = wert10bit >> 2;

also den 10bit Wert einfach durch 2 teilen um 8bit zu bekommen hab ich 
das richtig verstanden ?

    AnalogInput0 = analogRead(analogPin0);
    ADC0 = AnalogInput0 / 2;

von Einer K. (Gast)


Lesenswert?

Stefan S. schrieb:
> ist mein erstes projekt in C

Stefan S. schrieb:
> ; ADC-Konfiguration
> ldi  temp, 0b01100000  ; ADC einstellen - Aref = AVCC | Linksbündig |
> ADC0
> out  ADMUX, temp
1
ADMUX =  0b01100000;
Oder?

von gunner (Gast)


Lesenswert?

Stefan S. schrieb:
> also den 10bit Wert einfach durch 2 teilen um 8bit zu bekommen hab ich
> das richtig verstanden ?

Falsch verstanden. der Operator ist >> und nicht /

von Stefan S. (buffalochill)


Lesenswert?

Thomas E. schrieb:
> Stefan S. schrieb:
>> ; ADC-Konfiguration
>> ldi  temp, 0b01100000  ; ADC einstellen - Aref = AVCC | Linksbündig |
>> ADC0
>> out  ADMUX, temp
> Aber das kannst du? in C schreibst du:
> ADMUX |= (1 << ADLAR) | (1 << NOCH_EIN_BIT);

das scheint wirklich zu gehen .. TOLL danke

    ADMUX |= (1 <<  REFS0) | (1 << ADLAR);

von Stefan S. (buffalochill)


Lesenswert?

im gesamten:

    ADMUX |= (1 <<  REFS0) | (1 << ADLAR);

    analogRead(analogPin0);
    ADC0 = ADCH;

der compiler sagt kein fehler :) super!

von Stefan S. (buffalochill)


Lesenswert?

so geht's :

byte ADC0;

ADCSRA |= (1<< ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);   // ADC 
einschalten Prescaler auf 128

ADMUX |= (1 <<  REFS0) | (1 << ADLAR); // ADC linksbündig / referenz = 
VCC / ADC= 0

ADCSRA |=(1<< ADSC);                             // starte AD convention

while (ADCSRA & (1<<ADSC) ) {     // auf Abschluss der Konvertierung 
warten
    }

   ADC0 = ADCH;
   Serial.println(ADC0);


und so geht's auch:


int AnalogInput0 = analogRead(analogPin0);
byte ADC0 = AnalogInput0 >> 2;
Serial.println(ADC0);

DANKE !

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.