Schiebepoti Auslesen klappt nicht.

OP #4780617
Lesenswert?

Hi zusammen,

ich möchte mit einem Arduino Mega einen Schiebepoti auslesen und auf 
einem Terminal ausgeben.
Das Terminal funktioniert bereits, allerdings klappt das auslesen nicht, 
da nur 0 ankommen.
Ich möchte ausserdem keine Arduino Funktionen verwenden sondern 
"normales" C.

Hier mein Quellcode:
1
#include <avr/interrupt.h>
2
#include <avr/io.h>
3
#include <stdio.h>
4

5
#define F_CPU 16000000
6
#include <util/delay.h>
7

8

9
#define BAUD_PRESCALLER (((F_CPU / (250000 * 16UL))) - 1) // Für Terminal
10

11
volatile uint16_t adc_wert;
12

13

14
 //############################################################################
15
 //Terminal Zeug
16
void USART_printS(char* StringPtr){
17
 
18
while(*StringPtr != 0x00){
19
  while(!(UCSR0A & (1<<UDRE0)));
20
    UDR0 = *StringPtr;
21
  StringPtr++;}
22
 
23
}
24

25
void USART_printI(int16_t wert){
26
 
27
 char End[]="\n";
28
 char Ausgabe[10]={0,0,0,0,0,0,0,0,0,0};
29
 
30
 itoa(wert,Ausgabe,10);
31
 strcat(Ausgabe,End);
32
 USART_printS(Ausgabe);
33
  
34
}
35

36
ISR (ADC_vect)
37

38
{
39
  static unsigned char channel = 0;
40
 
41
  ADCSRA = 0; 
42
  
43
 adc_wert= ADC;
44
  
45
 
46
}
47

48

49
void setup() {
50
//ADC initialisieren
51
  ADMUX = (1<<REFS0); // VCC als Referenz
52
 
53
  ADCSRA = (1<<ADATE)|(1<<ADIE); // Free Running Mode
54
  ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // Prescaler 128
55
  ADCSRA |= (1<<ADEN); // ADC Aktivieren
56

57
 
58

59
      // UART TERMINAL
60

61
 UBRR0H = (uint8_t)(BAUD_PRESCALLER>>8);
62
 UBRR0L = (uint8_t)(BAUD_PRESCALLER);
63
 UCSR0B = (1<<RXEN0)|(1<<TXEN0);
64
 UCSR0C = (3<<UCSZ00);
65
}
66

67
void loop() {
68

69
   USART_printI(adc_wert);
70
    
71
    
72
     _delay_ms(5); 
73
   
74
   
75
 
76
}

Beim Auslesen mit einem Multimeter kann ich eine Spannung zwischen 0 und 
4.05V Messen. (Wieso eigentlich nur 4.05 und nicht 5?), dem entsprechend 
ist der Poti richtig verschaltet.

Anbei noch ein Bild vom Aufbau. Hat jemand eine Idee warum da nichts 
kommt?

Gruß
Angehängte Dateien:
Gast #4780693
Lesenswert?

Thgomas T. schrieb:
> Ich möchte ausserdem keine Arduino Funktionen verwenden sondern
> "normales" C.

Das würde auch den Verzicht auf "setup()" und "loop()" bedeuten :-)

Thgomas T. schrieb:
> ADCSRA = 0;

Was bezweckst Du damit? Free Running Mode mit single shot? :-)

Thgomas T. schrieb:
> ADCSRA |= (1<<ADEN); // ADC Aktivieren

Prima, und wann willst Du ihn starten?
 ADSC: ADC Start Conversion

Praktisch wäre es auch, die Interrupts mit SEI(); zu aktivieren. Ggf. 
macht das ja der Arduino-Unterbau sowieso - aber "sicher ist sicher".
OP #4780820
Lesenswert?

Dieter F. schrieb:

> Thgomas T. schrieb:
>> ADCSRA = 0;
>
> Was bezweckst Du damit? Free Running Mode mit single shot? :-)
>
> Thgomas T. schrieb:
>> ADCSRA |= (1<<ADEN); // ADC Aktivieren
>
> Prima, und wann willst Du ihn starten?
>  ADSC: ADC Start Conversion
>


Ahh super danke schön :) Das waren die Fehler.

Jetzt Funktioniert es ganz gut. Allerdings schwankt der Wert noch etwas. 
Ich nehme schon nur die  8 obersten Bits, aber dennoch schwankt der Wert 
um +-1, selbst wenn ich nichts am Poti mache. Gibt da noch eine 
Möglichkeit das zu "glätten" oder so?
Gast #4780919
Lesenswert?

Thgomas T. schrieb:
> Ich nehme schon nur die  8 obersten Bits,

Hmm, ich habe nicht gesehen, dass Du

ADLAR: ADC Left Adjust Result

nutzt und nur ADCH liest :-)

Diese Schiebe-Potis "kratzen" oft. Wahrscheinlich musst Du wirklich 
gleitende Mittelwerte bilden (z.B. aus 3 ... Messungen), damit das noch 
stabiler wird.
OP #4780948
Lesenswert?

Hm, also das hier ist jetzt mein Code ( bzw Teile davon):
Einmal die ISR
1
//AD Werte einlesen
2
ISR (ADC_vect)
3

4
{
5
  if (mw_cnt >= 100){
6
    mw_cnt=0;
7
    
8
    adc_wert = mw/100;
9
    mw=0;
10
  }
11
  else{
12
    mw_cnt++;
13
    mw= mw + (ADC >>2);
14
  }
15
}

und die ADC Config.
1
//ADC initialisieren
2
  ADMUX = (1<<REFS0); // VCC als Referenz
3
 
4
  ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // Prescaler 128
5
  ADCSRA |= (1<<ADATE)|(1<<ADSC)|(1<<ADIE); //   Free Running Mode
6
  ADCSRA |= (1<<ADEN); // ADC Aktivieren

Also wenn ich einen MW über 100 Messungen bilde ist der Wert ziemlich 
stabil.
Die Frage ist klappt das auch noch so gut wenn ich da zb 16 Potis dran 
habe? Kann man das nicht irgendwie schaltungstechnisch optimieren mit 
nem dicken Kondensator irgendwo, sodass sich die Werte garnicht mehr so 
schnell ändern können?

Die Sache mit den obersten 8 MSB habe ich mit einem >> 2 gelöst. Das ist 
doch äquivalent oder?
Gast #4780968
Lesenswert?

Thgomas T. schrieb:
> Also wenn ich einen MW über 100 Messungen bilde ist der Wert ziemlich
> stabil.

Du berechnest so keinen gleitenden Mittelwert sondern alle 100 Messungen 
einen Durchschnittswert.

Schau mal da z.B.

Beitrag "Re: gleitender Mittelwert im Atmel"

das ist pfiffig.


Thgomas T. schrieb:
> Die Sache mit den obersten 8 MSB habe ich mit einem >> 2 gelöst. Das ist
> doch äquivalent oder?

Ja, ADLAR spart halt etwas Zeit :-)


Wenn Du den Kondensator zwischen Schleifer und GND hast sollte es 
eigentlich O.K. sein. Du kannst ggf. noch mit dem Wert spielen - glaube 
auber nicht, das das viel bringt.
OP #4780985
Lesenswert?

Dieter F. schrieb:
> Thgomas T. schrieb:
>
> Beitrag "Re: gleitender Mittelwert im Atmel"
>
> das ist pfiffig.

Hm, also ich hab das jetzt so:
1
ISR (ADC_vect)
2
{
3

4
avgmem -= avgmem/128;
5
avgmem += ADCH;   
6
adc_wert = avgmem/128;
7
 
8
}
Allerdings ist der Wert immernoch ziemlich am Spacken :/. Hab ich das 
falsch übernommen?

>
> Thgomas T. schrieb:
>> Die Sache mit den obersten 8 MSB habe ich mit einem >> 2 gelöst. Das ist
>> doch äquivalent oder?
>
> Ja, ADLAR spart halt etwas Zeit :-)
 Ist umgerüstet ;)
>
> Wenn Du den Kondensator zwischen Schleifer und GND hast sollte es
> eigentlich O.K. sein. Du kannst ggf. noch mit dem Wert spielen - glaube
> auber nicht, das das viel bringt.

Jap, grad gemerkt, der kann auch nichts reißen.
Gast #4781001
Lesenswert?

Thgomas T. schrieb:
> Hm, also ich hab das jetzt so:

Du hast die Variablen auch als long deklariert?

Schon mal über ein neues Poti nachgedacht ? :-) Welchen Wert hat das 
Poti eigentlich?

Fällt mir gerade noch so ein - hast Du mal ein leistungsfähiges 
Steckernetzteil dran gehängt? Ggf. schwächelt die USB-Versorgung - was 
Deinen Messwert von 4,05 V erklären würde (oder das Poti ist zu 
"niederohmig").
OP #4781035
Lesenswert?

Dieter F. schrieb:
> Thgomas T. schrieb:
>> Hm, also ich hab das jetzt so:
>
> Du hast die Variablen auch als long deklariert?
>
> Schon mal über ein neues Poti nachgedacht ? :-)
>
> Fällt mir gerade noch so ein - hast Du mal ein leistungsfähiges
> Steckernetzteil dran gehängt? Ggf. schwächelt die USB-Versorgung - was
> Deinen Messwert von 4,05 V erklären würde.

Wow. Das hats echt gelöst. Und schon ist der Wert auch stabil. Bis ich 
darauf gekommen wär hätts glaub ich ein Weilchen gedauert. Danke 
schonmal!

Jetzt fehlt noch ein Schritt zum Ziel.

Ich möchte einen Taster einbauen, der, wenn ich ihn drücke, den ADC Wert 
aufs Maximum (also 255) Springen lässt.
Ich hab in den Anhang die Schaltung gepackt ich die grad dafür benutze.

Ohne den Widerstand klappts nicht. Wenn der Poti auf dem geringsten Wert 
ist und ich dann auf den Knopf drück machts puff. Ich habe extra einen 
kleinen genommen, da sonst wenn ich auf den Knopf drücke, nichtmehr 255 
erreicht wird (Mit diesem Widerstand 253). Das klappt ans ich ganz gut, 
nur wenn ich den Poti in in den unteren 10% habe, dann komme ich mit dem 
Knopf nichtmehr auf 253 und der Maximalwert sinkt immer weiter mit 
sinkender Schleiferstellung, aber eben nur wenn der Schleifer fast ganz 
unten ist.  Ich denke mal da fehlt noch was, oder?

Danke
Angehängte Dateien:
OP #4781099
Lesenswert?

Dieter F. schrieb:
> Thgomas T. schrieb:
>> Ich denke mal da fehlt noch was, oder?
>
> Eine Diode?

Hmm schon versucht. Dann komm ich überhaupt garnicht auf den Wert 255 ( 
denke mal das liegt an den 0,7V Spannungsabfall an der Diode) und der 
Abfall bei niedriger Schleiferstellung ist ebenfalls da

Geht das Evtl indem ich mit einem Widerstand einen Spannungshub mache, 
sodass es zb von 5 bis 2V misst?
Dann muss ich ja dem ADC auch irgendwie sagen dass der max. Ausschlag 3V 
ist anstatt 5V. geht das über AREF?
(Firma: matzetronics) #4781284
Lesenswert?

Thgomas T. schrieb:
> tolle_idee.png

Da bin ich mir nicht so sicher. Wenn der Fader auf 0 steht und du den 
Taster drückst, fliessen etwa 250mA durch Taster, Widerstand und Fader - 
das stinkt mit Sicherheit und zerstört die Kohlebahn.
Also erstmal:

avr schrieb:
> Besser mit einem Widerstand das Poti entkoppeln. Z.B. 10k zwischen
> Abgriff und Kondensator+Taster.

Oder auch 1k. Irgendwas muss den Strom durch den Fader begrenzen.

Thgomas T. schrieb:
> Dann muss ich ja dem ADC auch irgendwie sagen dass der max. Ausschlag 3V
> ist anstatt 5V. geht das über AREF?

Da kannst über die Spannung an AREF innerhalb der Grenzen des 
Datenblatts den Vollausschlag des ADC einstellen (min. 2V). Aber die 
Entkopplung mit Widerstand ist einfacher, wie von avr vorgeschlagen.
Gast #4781365
Lesenswert?

avr schrieb:
> Besser mit einem Widerstand das Poti entkoppeln. Z.B. 10k zwischen
> Abgriff und Kondensator+Taster.

Dann macht es zwar trotzdem "puff", weil beim Drücken des Tasters der 
Kondensator kurz geschlossen wird, aber nicht mehr so doll ;-)

Es gibt nur Brandspuren auf den Tasterkontakten.
#4781366
Lesenswert?

Matthias S. schrieb:
> Wenn der Fader auf 0 steht und du den
> Taster drückst, fliessen etwa 250mA durch Taster, Widerstand und Fader -
> das stinkt mit Sicherheit und zerstört die Kohlebahn.

Matthias S. schrieb:
> Oder auch 1k. Irgendwas muss den Strom durch den Fader begrenzen.

genau 1k zwischen Schleifer und ADC Eingang, Taster mit 470 Ohm nach 
+VCC am ADC sollte auch besser sein.
Gast #4781457
Lesenswert?

Ja das gäbe einen schönen Spannungsteiler ;)

Was mir so einfällt:
1. Einen Taster nehmen der einen Wechselkontakt hat, damit schalten ob 
GND oder VCC unten an das Poti geht, dann bekommst du auch 255 weil dann 
egal in welcher Position das Poti ist 5V anliegen wenn der Taster 
gedrückt ist.

oder

2. Den Taster an einen zweiten Pin vom AVR anschließen und den Wert 
einlesen. Wenn Taster gedrückt dann einfach den Wert des Potis 
"überschreiben*
OP #4781934
Lesenswert?

mork schrieb:
> Thgomas T. schrieb:
>> Ich hab in den Anhang die Schaltung gepackt ich die grad dafür benutze.
>
> Warum ist da Avcc als Versorgung für den ADC/PortC nicht beschaltet?

Ist es. Ich benutze (noch) einen Arduino Mega. Habs nur nicht da 
eingezeichnet.


Also ich habs jetzt so gelöst wie im Anhang zu sehen ist. So scheint 
alles zu gehen. Nichts scheint warum zu werden und die Frische Bergluft 
in meinem Zimmer wird durch keinen verschmorten Kohlegestank gestört. :)
Ich komme auf den Wert 255 und der Knopf ist unabhängig von der 
Faderposition.

Jetzt ist nur noch eine Sache. Wenn den Knopf wieder loslas braucht der 
Kondensator zu lange um sich zu entladen. Dh der Wert spring nicht mehr 
schnell genug auf den alten zurück. Nehme ich einen kleineren C, so 
kommt das zittern wieder. Ich benutze 10nF.
Spricht vll sonst noch was anderes was ich jetzt nicht sehe dagegen das 
so zu betreiben?

Gruß
Angehängte Dateien:
(Firma: matzetronics) #4782020
Lesenswert?

Thgomas T. schrieb:
> Also ich habs jetzt so gelöst wie im Anhang zu sehen ist. So scheint
> alles zu gehen.

Ich hoffe, das es sich um einen Zeichenfehler handelt. Wenn der Fader 
auf 0 steht und du den Taster drückst, schliesst du die Betriebsspannung 
kurz.
Der Taster muss ans ADC-seitige Ende des 10k Widerstandes.
Allerdings hast du noch so viele Ports frei, das ich den Taster an einen 
freien Pin anschliessen und den Rest per Software lösen würde.

Thgomas T. schrieb:
> Nehme ich einen kleineren C, so
> kommt das zittern wieder. Ich benutze 10nF.

Beachte bitte auch die Siebung von AVCC nach Datenblatt. Atmel empfiehlt 
eine Drossel (10µH-100µH, aber 470µH gehen auch) zwischen VCC und AVCC 
und einen extra 100nF an AVCC gegen Masse.
Gast #4782048
Lesenswert?

Matthias S. schrieb:
> Der Taster muss ans ADC-seitige Ende des 10k Widerstandes.

Ja, sonst riecht's elektronisch :-)

Thgomas T. schrieb:
> Jetzt ist nur noch eine Sache. Wenn den Knopf wieder loslas braucht der
> Kondensator zu lange um sich zu entladen.

Nicht, wenn Du richtig verbindest - aber schon ein wenig :-) so ist es 
halt - außer Du nimmst (wie viele andere auch) einen extra 
Taster-Eingangs-Pin.
OP #4782106
Lesenswert?

Hm okay. Es war kein Zeichenfehler, aber selbst wenn ich den Taster ans 
andere Ende des Widerstands packe verändert sich nichts. Ich denke mal 
irgendwas im Arudio hat das Abfackeln verhindert. Jedenfalls lief alles.

Ich denke ich werde es nun doch Softwareseitig lösen, sprich mit nem 
extra Pin für den Knopf.

Danke an alle die geholfen haben.
Gast #4782121
Lesenswert?

Thgomas T. schrieb:
> Ich denke ich werde es nun doch Softwareseitig lösen, sprich mit nem
> extra Pin für den Knopf.

Dann schau Dir bitte Peter Danneggers Entprellroutine an -> 
Tastenentprellung bei den Artikeln. Ist nicht leicht zu verstehen, aber 
wirklich gut - ich verwende die immer, wenn ich Tasten oder 
Drehimpulsgeber abfrage.
#4782302
Lesenswert?

Dieter F. schrieb:
> Häh?

wie bitte?

ist Häh jetzt eine qualifizierte Frage oder nur ein Ausdruck von Lese 
und Verständnisschwäche?

Thgomas T. schrieb:
> Jetzt fehlt noch ein Schritt zum Ziel.
>
> Ich möchte einen Taster einbauen, der, wenn ich ihn drücke, den ADC Wert
> aufs Maximum (also 255) Springen lässt.

OK, noch mal langsam für die mit der längeren Laufzeit:

Er möchte einen Taster der den ADC Wert auf 255 springen lässt.

Warum er das möchte ist mir unklar, der ADC Wert ist zu keiner Zeit 
sichtbar!
Er ist auch nicht 255 beim Maximum sondern 1023, aber nun gut, 
angenommen er verwirft 2 Bit, dann ist 255 das maximum von ADC, das wird 
aber niemand sehen der es nicht sehen soll, will sagen es wird irgendwo 
ausgegeben.
Nun kann man auch 255 ausgeben wenn der Taster gedrückt wird, das ist 
keine Magie sondern nur Software, wo der ADC dann zur Zeit aktuell steht 
ist doch Schnuppe oder sowas von egal denn er will eine Ausgabe von 255 
bekommen auf Tasterdruck.

Es wäre auch möglich das ein Servo auf Tasterdruck das Poti an den 
oberen Anschlag zu 255 fährt, aber das wurde nicht verlangt, jedenfalls 
lese ich das nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren