mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von NiklasB (Gast)


Bewertung
-1 lesenswert
nicht 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
P1MDIN = 0x00;
P1SKIP = 0x02;

Init AD
        AMX0P = 0x13; // Port 1.1  1 0011b
  AMX0N = 0x13; // Port 1.1  1 0011b 
  AD0CM2 = 0;  // 0 0 0 mode 0 ADBUSY
  AD0CM1 = 0;   // 0 0 1 mode 1 timer 0 overflow
  AD0CM0 = 1;  
  AD0TM = 1; // track-hold-mode  
  AD0EN = 1;
  ADC0CF = 0xFC;  // 1111 1100   Abtasterate und ad0ljst = 1 fuer 8-bit aufloesung
     EIE1 = 0xF8; // enable interrupt EADCO


  TMOD = 0x01;     // Mode 1: 16-Bit Timer
  // Timer start Wert
  // 48Mhz clock ~ periode 0.0208ms
  // 48 Perioden pro ms 
  // Timer 48 Zyklen fuer eine ms
  // 16bit 65535 - 48 -> 65487 -> 0xFFC9
  // gesplittet   LSB 0xC9 = 11001001b
  //         MSB 00xFF = 11111111b
  TH0 = 0xC9;   // MSB
  TL0 = 0xFF;   // LSB

  //pre-scaler
//  CKCON |= 0x00; // timer pre-scale 
  ET0 = 1;  /// enable interrupt
  EA = 1;

ADC Wandlugn start über Timer funktioniert sowie der AD Inerrupt nach 
Wandlung
void ISR_AD() interrupt 10
{
  gMittelwert = ADC0H;
  hunderter = gMittelwert/100;
  zehner = gMittelwert/10;
  einser = gMittelwert % 10;
  AD0INT = 0;
  TR0 = 1;  // start timer  
}

ISR_COUNTER() interrupt 1// 1 für timer 0 
{
  AD0BUSY = 1; // start adc
  TH0 = 0x00;   // MSB
  TL0 = 0x00;   // LSB
}
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:

Bewertung
0 lesenswert
nicht lesenswert
ADC0 Functional Block Diagram

von NiklasB (Gast)


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

von Ralf (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

Ralf

von hmm (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Ralf (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ja, LeftAdjust und nur Highbyte lesen sollte es tun.

Ralf

von NiklasB (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ok funktioniert nun alles. Vielen Dank für die Hilfe.

von Ralf (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gern geschehen.

Ralf

von Markus B (Gast)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.