Forum: Mikrocontroller und Digitale Elektronik M16C + ADC


von Benedikt (Gast)


Lesenswert?

Hallo,

ich habe ein Problem mit dem ADC des M30624FGAFP.
Ich initialisiere den ADC:
    adcon1=32;
    adcon2=1;
    adcon0=8;
    adcon0=72;
und lese den Wert später in ad0 aus. Allerdings ändert sich der Wert
nicht, sondern bleibt immer gleich, obwohl sich die Spannungen am
Eingang ändern. Ich habe schon mehrere Kanäle ausprobiert, aber es geht
nicht. Der Wert in ad0-ad7 scheint zufällig zu sein, und ändert sich nur
wenn ich die Spannung abschalte.
Die Software ist OK, auf einem M30626FHPFP läuft die Problemlos und
auch der ADC funktioniert.
Laut Datenblatt gibt es keinen Unterschied zwischen den beiden uC im
Bereich des ADCs an Port 10.

von Andreas Huck (Gast)


Lesenswert?

Hi,

ich hab hier nur mal einen ADC-Ausschnitt von meinem
Bordcomputerprogramm mit dem M16c (M30624FGAFP). Benutze Kanal 4,
weitere Angaben hab ich grad nicht da...
ADC - Pins auf Eingang und sogar alle mit Pull-up sehe ich gerade bei
der Initialisierung - Naja wenns ging :-)

if (adst==0)                   // Wandlung fertig
{
  adcon1 = 0x30;                // AD-Wandler Einstellungen 8-Bit
  adcon0 = 0x04;
  if (Index_adc==0)             // Nur alle 100ms Wert nehmen
  {
     Variable = ad4;
  }
  if (y != y_alt)
  {
     adst = 1;                    // starte AD-Wandlung erneut
     Index_adc = 1;
  }
  y_alt = y;
}

Vielleicht hilft es dir ja.
Viel Spass
Andreas

von Benedikt (Gast)


Lesenswert?

Danke,
die Pullups stören nicht weiter, die haben etwa 70k.
Leider geht es auch nicht, er zeigt weiterhin konstant 16 an, obwohl 5V
am Eingang liegen. Auf dem 30626 geht es.
Ich werde mal versuchen den uC zu tauschen, allmählich vermute ich, es
liegt an einem Hardware Problem.

von Lutz (Gast)


Lesenswert?

ist das PDxx Register richtig gesetzt? PS- und PSL-Register
musste ich ja nur setzen, weil ich den ANEX0 Pin verwendet habe,
das fällt ja bei dir weg.

Lutz

von Benedikt (Gast)


Lesenswert?

Ja, ist auf Eingang, Pullups sind aktiviert, aber das ist kein Problem.
Die Software ist definitiv OK, auf dem 30626 geht es ja.

von ralf (Gast)


Lesenswert?

hast du vref auch wirklich angeschlossen?
probier mal VCUT=0

von Benedikt (Gast)


Lesenswert?

Am Vref Pin messe ich 4,97V, VCut ist auf 1 gesetzt.

von Benedikt (Gast)


Lesenswert?

Ich habe jetzt mal einen zweiten M30624FGAFP ausprobiert, mit dem selben
Ergebnis: Er liefert immer denselben Wert. Der Poti hängt an P10.0. Hier
mal der komplette Code. Dieser müsste eigentlich stimmen (hab das
Datenblatt mindestens 10x gelesen).

    char ADW,Noise=0;

    asm( "\tFCLR    I");    /* Disable interrupt */
    ifsr=192;
    int4ic=6;
    int5ic=21;

    pd1=63;
    pd0=255;
    pd10=0;
    pur0=32;
    pur2=48;
    p1=0;
    p0=0;


    adcon2=0;
    adcon1=32;
    adcon0=0;

    adst=64;

    Delay (1000);

    p1=32;
    Delay (100000);

 while (1)
 {
if (adst==0)                  // Wandlung fertig
{
  adcon1 = 32;                // AD-Wandler Einstellungen 8-Bit
  adcon0 = 0;                 // Kanal 0
  adst = 1;                   // starte AD-Wandlung erneut
}

        ADW=(ad0%256);

        adout [5]=ADW/100+48;       //Text für Display generieren
        adout [6]=(ADW/10)%10+48;
        adout [7]=ADW%10+48;

        ShowTXTMode (56, adout,3);
}

von BeRnD (Gast)


Lesenswert?

Hi Benedikt,

ich kenne dein SFR header file nicht aber es scheint mir unerklärlich
warum du einerseits adst = 64 und in dem erneuten AD Wandlungsstart
adst = 1 gesetzt wird. Ich nehme an dass, du adst als Bit vom ADCON0
Register definiert hast. Daher solltest du auch nur eine 1 zuweisen.

Bis dann
BeRnD

von Benedikt (Gast)


Lesenswert?

Stimmt, ist aber nur ein Schreibfehler, im richtigen Programm steht
adcon0=64;

von Benedikt (Gast)


Lesenswert?

Nahc einigen Stunden rumbasteln an den StarUp Files habe ich den Fehler
gefunden.
Es lag am PLL, der beim 624 nicht existiert. Eigentlich sollte das
Programm die PLL Initialisierung überspringen, aber das macht es
anscheinend nicht.
Also falls jemand das selbe Problem hat (bzw. einen M16C ohne PLL
verwendet), folgende Zeilen auf der ncrt0.a30 entfernen:

    btst    1,07h
    jne     skip_pll
    mov.b   #08h,06h        ;set clock to no division
    mov.b   #11h,1ch        ;PLL multiply by 2
    bset    0,0ah
    bset    7,1ch           ;PLL On
    mov.w   #0FFFFh,R0
stabilize:
    nop
    sub.w   #1,R0
    jne     stabilize
    bset    0,0ah
    bset    1,07h           ;PLL = main-clock

skip_pll:

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.