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
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; |
Dann verzichte auf die Arduino Komfort Funktionen und machs dir selber.
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 :-)
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); |
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;
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?
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 /
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);
im gesamten: ADMUX |= (1 << REFS0) | (1 << ADLAR); analogRead(analogPin0); ADC0 = ADCH; der compiler sagt kein fehler :) super!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.