Autor Thema: Probleme bei A/D-Wandlung mit PIC12F683  (Gelesen 6483 mal)

Offline Fraeo09

  • Newbie
  • *
  • Beiträge: 31
    • Profil anzeigen
Probleme bei A/D-Wandlung mit PIC12F683
« am: Januar 04, 2013, 12:35:46 Nachmittag »
Hallo zusammen,

ich brüte seit einiger Zeit über einem Problem mit der A/D-Wandlung.

Mit Hilfe von MPLABX v1.40 und XC8 v1.11 versuche ich eine ganz einfache Standard-Wandlung mit meinem PIC12F683
umzusetzen.

Bei der Simulation des Codes mit dem Simulator, sowie mit einer Testschaltung wird das GO/-DONE-Bit nicht gesetzt, so dass die Konversion trotz aktivem Modul nicht startet...
Die Versuche die Konfigurationsreihenfolge entsprechend der Vorgabe aus dem Datenblatt umzusetzten, sowie diese experimentell zu variieren haben keine Erfolge gebracht.

Ich bin jetzt mit meinem Latein am Ende und habe das Gefühl einen wesentlichen Fehler zu übersehen.

Kann mir jemand weiterhelfen(Code Siehe unten)?
#include <pic12f683.h>
#include "stdio.h"
#include <stdint.h>
#include <xc.h>
int __CONFIG,   FOSC_INTOSCIO,\
                WDTE_ON,\
                PWRTE_ON,\
                MCLRE_ON,\
                CP_OFF,\
                CPD_OFF,\
                BOREN_ON,\
                IESO_ON,\
                FCMEN_ON;

////////EIGENE-HEADER//////////
#define SET 1;
#define CLEAR 0;
void main()
{
    IRCF2   =   SET;
    IRCF1   =   CLEAR;
    IRCF0   =   CLEAR;
    OSTS    =   CLEAR;
    HTS     =   CLEAR;
    LTS     =   SET;
    SCS     =   SET;

    COUT    =   CLEAR;
    CINV    =   CLEAR;
    CIS     =   CLEAR;
    CM2     =   SET;
    CM1     =   SET;
    CM0     =   SET;

    TRISIO5 =   CLEAR;
    TRISIO4 =   SET;
    TRISIO3 =   CLEAR;
    TRISIO2 =   CLEAR;
    TRISIO1 =   CLEAR;
    TRISIO0 =   CLEAR;

    ADCS2   =   CLEAR;
    ADCS1   =   CLEAR;
    ADCS0   =   CLEAR;
    ANS3    =   SET;
    ANS2    =   CLEAR;
    ANS1    =   CLEAR;
    ANS0    =   CLEAR;

    ADIF    =   CLEAR;
    ADIE    =   SET;

    ADFM    =   CLEAR;
    VCFG    =   CLEAR;
    CHS1    =   SET;
    CHS0    =   SET;
    GO      =   CLEAR;
    ADON    =   SET;

    ADIF    =   CLEAR;
    ADIE    =   SET;
   
    SLEEP();
    SLEEP();
    SLEEP();
    SLEEP();
    SLEEP();
   
    GO      =   SET;

    if (GO == 1)
    {
        GO  =   CLEAR;
        while (1)
        {
            GP0 = SET;
        }
    }
    else if (GO == 0)
    {
        while (1)
        {
            GP1 = SET;
        }
    }

}
Verrückt!
Kaum macht mans richtig, schon funktionierts.

Offline Stampede

  • Hero Member
  • *****
  • Beiträge: 1026
    • Profil anzeigen
    • PicPlayer.de
Re:Probleme bei A/D-Wandlung mit PIC12F683
« Antwort #1 am: Januar 04, 2013, 20:03:49 Nachmittag »
Hallo,

Was erwartest du von dem Code? Egal ob GO 0 oder 1 ist, der Controller verreckt nach der Abfrage in der endlosen while-Schleife.

Beispiel Code:

/******************************************************************************
 * Function:        WORD ReadPOT(BYTE CH)
 *
 * PreCondition:    None
 *
 * Input:           None
 *
 * Output:          WORD - the 10-bit right justified POT value
 *
 * Side Effects:    ADC buffer value updated
 *
 * Overview:        This function reads the POT and leaves the value in the
 *                  ADC buffer register
 *
 * Note:            None
 *****************************************************************************/
WORD ReadPOT(BYTE CH)
{
#define ADC_TAD_DELAY 5
BYTE i, Delay;
    WORD_VAL w;
WORD Pot;
BYTE AnChannel;
AnChannel = CH;
switch(CH)
{
default:
case 0:
ADCON0=0x01;
break;
case 1:
ADCON0=0x05;
break;
}
TRISAbits.TRISA1=1;
ADCON2=0xBE; // ADCON2bits.ADFM = 1;
Pot = 0;
for(i=0; i<4; i++) // Use 4x Oversampling
{
ADCON0bits.GO = 1;              // Start AD conversion
Delay = ADC_TAD_DELAY;
    while(ADCON0bits.GO == 1);      // Wait for conversion
w.v[0] = ADRESL;
w.v[1] = ADRESH;
Pot += w.Val;
while(Delay--);
}
Pot = Pot>>2; // 10 Bit value

    return Pot;
}//end ReadPOT

Grüße
Stefan

Offline Fraeo09

  • Newbie
  • *
  • Beiträge: 31
    • Profil anzeigen
Re:Probleme bei A/D-Wandlung mit PIC12F683
« Antwort #2 am: Januar 04, 2013, 20:35:19 Nachmittag »
Hallo Stefan,

danke für die Rückmeldung. Dass der Code in einer der beiden Endlosschleifen hängen bleibt ist gewollt, innerhalb der Testschaltung wird der jeweils eintretende Fall über je eine LED sichtbar gemacht.

Das Problem vor dem ich stehe, ist dass das GO/-DONE-Bit des ADCON0-Regs trotz Anweisung eben nicht gesetzt wird, so dass erst gar keine Konversion stattfindet.

Mit dem angeführten Code und der aufgebauten Testschaltung wollte ich kontrollieren ob der Fehler eventuell beim Simulator liegt, oder in der Programmierung.

Da sowohl bei Ausführung der Simulation in MPLABX als auch bei der Ausführung des Codes innerhalb der Hardware der gleiche Fehler auftritt, scheint das Problem offensichtlich beim Code zu liegen.

Allerdings weiß ich nicht wo.. Greife ich falsch auf das Register zu, oder warum lässt sich das besagte Startbit für die Konversion nicht setzen?

Gruß


Frank
Verrückt!
Kaum macht mans richtig, schon funktionierts.

Offline Stampede

  • Hero Member
  • *****
  • Beiträge: 1026
    • Profil anzeigen
    • PicPlayer.de
Re:Probleme bei A/D-Wandlung mit PIC12F683
« Antwort #3 am: Januar 04, 2013, 21:39:07 Nachmittag »
Hallo,

ich nutze das neue MPLAB X noch nicht. Aber ich ehrlich gesagt kommen mir diese Zuordnungen der Art

ADCS2   =   CLEAR;
sehr komisch vor.
Wenn du einen Debugger hast, dann schau doch mal ob, wenn du durch den Code gehst, die Register auch entsprechend gesetzt werden.

Dann ist das CONFIG FOSC_INTOSCIO hier auch fragwürdig. Hätte hier sowas wie INTRC_OSC_NOCLKOUT erwartet.
Und was mir gerade erst auffällt: Du hast den Watchdog an, mit WDTE_ON. Ich gehe davon aus, dass der ADC die Wandlung startet, der WDT den PIC aber schon vor Ende der Wandlung zurücksetzt und es daher so aussieht als würde die Wandlung nie zu Ende gehen. Also mal den WDT ausschalten!

Grüße
Stefan

Offline Fraeo09

  • Newbie
  • *
  • Beiträge: 31
    • Profil anzeigen
Re:Probleme bei A/D-Wandlung mit PIC12F683
« Antwort #4 am: Januar 05, 2013, 19:54:59 Nachmittag »
Hallo Stefan,

die Zuordnung basiert auf den "#define-Anweisungen" vor dem eigentlichen Code, welche die literalen Variablen CLEAR und SET definieren --> die Zuweisung ist dazu gedacht den Code etwas lesbarer zu machen..

Die Festlegung des Konfigurationswortes ist so wie beschrieben OK, die vorgenommene Konfiguration der Systemtaktquelle ermöglicht die Anwendung der internen Taktquellen (hier 1MHz-Takt, Siehe OSCCON-Konfiguration), sowie der I/O-Funktionen von GP5 und GP4.

Zum Problem des Watch-Dog Timers:

Ich hab mir die SFRs über den Programmverlauf mal angeschaut und festgestellt, dass zwar das A/D-Wandlungsmodul aktiviert wird, die Konversion mittels GO/-DONE nicht gestartet wird...
Trotz Anweisung bleibt das Bit bei 0...

Ich habe festgestellt, dass das GO/-DONE-Bit gesetzt wird, sofern ich den Befehl 2x hintereinander aufrufe, allerdings mit dem Ergebniss, dass gleichzeitig das ADIF-Bit im PIR1-Reg. kommt, was besagt, dass die Konversion abgeschlossen ist...

Ich stelle gerade fest, dass auch das ADIE nicht gesetzt wird, bei der Konfiguration der Interrupt-Möglichkeit...

Hast du noch eine andere Idee??


Gruß


Frank
Verrückt!
Kaum macht mans richtig, schon funktionierts.

Offline Stampede

  • Hero Member
  • *****
  • Beiträge: 1026
    • Profil anzeigen
    • PicPlayer.de
Re:Probleme bei A/D-Wandlung mit PIC12F683
« Antwort #5 am: Januar 05, 2013, 22:32:47 Nachmittag »
Hi,

Zitat
die Zuordnung basiert auf den "#define-Anweisungen" vor dem eigentlichen Code, welche die literalen Variablen CLEAR und SET definieren --> die Zuweisung ist dazu gedacht den Code etwas lesbarer zu machen..
Es ging mir um die linke Seite der Zuweisung, die #define sind mir schon klar. Und so weiter. Der XC8 1.12 in Verbindung mit X1.60 setzt bei mir im Debugger die Bits im ADCON0 alle richtig.

Gruß
Stefan

Offline Fraeo09

  • Newbie
  • *
  • Beiträge: 31
    • Profil anzeigen
Re:Probleme bei A/D-Wandlung mit PIC12F683
« Antwort #6 am: Januar 06, 2013, 19:10:19 Nachmittag »
Hallo Stefan,

hab meine IDE und den Compiler aktualisiert, alles funktioniert wie es soll.

Danke für deine Hilfe.



Grüße

Frank

P.S. Wie macht man eigentlich einen Beitrag zu?
« Letzte Änderung: Januar 06, 2013, 19:24:18 Nachmittag von Fraeo09 »
Verrückt!
Kaum macht mans richtig, schon funktionierts.

 


* Recent Topics