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.
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
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.
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
Ja, ist auf Eingang, Pullups sind aktiviert, aber das ist kein Problem. Die Software ist definitiv OK, auf dem 30626 geht es ja.
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); }
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.