M16C + ADC

Gast #115197
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.
Gast #115198
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
Gast #115199
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.
Gast #115204
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);
}
Gast #115205
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
Gast #115207
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:

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