Forum: Mikrocontroller und Digitale Elektronik ADC 8051 funktioniert nicht wie gewollt


von NiklasB (Gast)


Lesenswert?

Hallo,
habe einen IC von Silikon Labs C8051F340. Benutze das Programm Keil

Nun wollte ich den über den ADC Spannugnswerte meines Potis einlesen.

Das Problem ist allerdings Springt der Wert zwischen 0 und dem 
Maximalwert hin und her. Habe eine 8-bit Auflösung gewählt. Wenn ich Das 
Poti auf max drehe bekomme ich ca. 4 Messwerte hintereinander 255 ca. 4 
mal wieder 0 ganz komsich und Werte zwischen drin bekomme ich gar nicht.

Port ist als Analog Input intialisiert
1
P1MDIN = 0x00;
2
P1SKIP = 0x02;

Init AD
1
        AMX0P = 0x13; // Port 1.1  1 0011b
2
  AMX0N = 0x13; // Port 1.1  1 0011b 
3
  AD0CM2 = 0;  // 0 0 0 mode 0 ADBUSY
4
  AD0CM1 = 0;   // 0 0 1 mode 1 timer 0 overflow
5
  AD0CM0 = 1;  
6
  AD0TM = 1; // track-hold-mode  
7
  AD0EN = 1;
8
  ADC0CF = 0xFC;  // 1111 1100   Abtasterate und ad0ljst = 1 fuer 8-bit aufloesung
9
     EIE1 = 0xF8; // enable interrupt EADCO
10
11
12
  TMOD = 0x01;     // Mode 1: 16-Bit Timer
13
  // Timer start Wert
14
  // 48Mhz clock ~ periode 0.0208ms
15
  // 48 Perioden pro ms 
16
  // Timer 48 Zyklen fuer eine ms
17
  // 16bit 65535 - 48 -> 65487 -> 0xFFC9
18
  // gesplittet   LSB 0xC9 = 11001001b
19
  //         MSB 00xFF = 11111111b
20
  TH0 = 0xC9;   // MSB
21
  TL0 = 0xFF;   // LSB
22
23
  //pre-scaler
24
//  CKCON |= 0x00; // timer pre-scale 
25
  ET0 = 1;  /// enable interrupt
26
  EA = 1;

ADC Wandlugn start über Timer funktioniert sowie der AD Inerrupt nach 
Wandlung
1
void ISR_AD() interrupt 10
2
{
3
  gMittelwert = ADC0H;
4
  hunderter = gMittelwert/100;
5
  zehner = gMittelwert/10;
6
  einser = gMittelwert % 10;
7
  AD0INT = 0;
8
  TR0 = 1;  // start timer  
9
}
10
11
ISR_COUNTER() interrupt 1// 1 für timer 0 
12
{
13
  AD0BUSY = 1; // start adc
14
  TH0 = 0x00;   // MSB
15
  TL0 = 0x00;   // LSB
16
}
Umrechnung in Spannung habe ich rausgenommen, da ich ja noch nicht 
einmal die richtigen Werte bekomme. Weiß jemand wo mein Denkfehler ist 
was habe ich vergessen?

Habe nun alles Versucht was mir eingefallen ist jedoch kein Erfolg. ich 
hoffe mir kann jemand weiter helfen.

Vielen Dank im Voraus
Viele Grüße Niklas

von NiklasB (Gast)


Angehängte Dateien:

Lesenswert?

ADC0 Functional Block Diagram

von NiklasB (Gast)


Lesenswert?

Niemand eine Idee, wieso ich entweder 0 oder den Maximalen Wert bekomme?

von Ralf (Gast)


Lesenswert?

1. eigenes Board oder Devkit?
2. Wenn du nur ein analoges Signal messen willst, dann setze nicht den 
ganzen Port als Analogeingang
3. Deine Muxereinstellung passt nicht zum Kommentar
4. was passiert wohl durch für beide Muxer identische Porteinstellung? 
:)
5. Timer 0 hat in der 16-Bit Konfiguration keinen automatischen Reload

weiter hab ich's mir nicht angeguckt, mach mal Bugfixing nach obiger 
Liste, dann schauen wir weiter, okay? ;)

Ralf

von NiklasB (Gast)


Lesenswert?

Alles klar Danke für die Antwort.

Ich möchte nur positive Spannung an P1.1 messen. Also lass ich   AMX0N = 
0x13; // Port 1.1  1 0011b
einfach weg? Ich habe nirgends gesehen wo ich einstell ob positive oder 
negative Spannung gemessen werden soll.

von NiklasB (Gast)


Lesenswert?

AMUX0 selects the positive and negative inputs to the ADC. The positive 
input (AIN+) can be connected to
individual Port pins, the on-chip temperature sensor, or the positive 
power supply (VDD). The negative
input (AIN-) can be connected to individual Port pins, VREF, or GND.

Ok da steht es doch also sollte ich dort meine Referenzspannung anlegen.

von Ralf (Gast)


Lesenswert?

1. ist 0x13 != 0011b -> AUFPASSEN
2. willst du die Spannung gegen GND messen!!!

Ralf

von hmm (Gast)


Lesenswert?

Du liest ein 10Bit AD-Wert aus einem 8Bit. 4x8=10!

Setze das Flag auf Word und teile es / 4 dann hast Du deine 8Bit

von NiklasB (Gast)


Lesenswert?

Ok gegen GND macht Sinn... :( oh man zu Spät^^


hmm schrieb:
> Setze das Flag auf Word und teile es / 4 dann hast Du deine 8Bit

Welches Flag? Maxmimale Aufloesung, wenn ich richtig verstanden habe, 
10-bit. Und über AD0LJST wird der Wert rechts oder linksbündig in ADC0H, 
ADC0L geschrieben.

von NiklasB (Gast)


Lesenswert?

Und ich dachte eeifnach left-adjust und dann ahbe ich doch meine 
gewünschte 8-bit Auflösung oder nicht?

von Ralf (Gast)


Lesenswert?

Ja, LeftAdjust und nur Highbyte lesen sollte es tun.

Ralf

von NiklasB (Gast)


Lesenswert?

Ok funktioniert nun alles. Vielen Dank für die Hilfe.

von Ralf (Gast)


Lesenswert?

Gern geschehen.

Ralf

von Markus B (Gast)


Lesenswert?

Servus, habe glaube ich die gleiche Laboraufgabe vor mir und komme 
leider nicht weiter. Kannst du mir da ein wenig Helfen? oder vielleicht 
programmabschnitte geben ?
Mfg

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.