Forum: Mikrocontroller und Digitale Elektronik AD-Wandler des PIC 16F88 in C Programmieren


von Sebastian (Gast)


Lesenswert?

Hallo,
Ich möchte mit dem PIC 16F88 eine AD-Wandlung an einem Port vornehmen. 
Dabei soll der ermittelte Wert wenn er <= 3 ist einen Port auf high 
setzen und ansonsten und wenn er >= 3 ist auf low. Teile aus meinem 
Programm habe ich aus diesem Tutorial http://www.cc5x.de/ADC.htm 
übernommen. cc5x erstellt auch das HEX File aber beim Testen leuchtet 
die LED an PORTB.2 nicht.

Ich denke daher meine ganze AD-Wandlung (bzw. das Zusammenfassen des 
High und Low) falsch sind.

Kann mir jemand weiterhelfen? Hier der Code:

#include "prozess.h"      //Prozessor
#include "ad.h" //PIN-Konfiguration
#include "delay.c"

// 
Speicherschutz12,13,4,5=aus,Debug11=aus,ProgrammFlash9=an,EEpromRead8=an 
,
// NiedervoltProgr7=aus, NiederVoltReset6=an,EinschaltTimer3=an,
// WachDogTimer2=aus,Oszillator0,1=XC
#pragma config |= 0b.11.111101.11.00.10



//*******  AD-Wandler-Fnktion 
***************************************************

uns16 ADC(char kanal)
{
    uns16 Antwort;
    ADCON0 &= 0b.1100.0111; // 3 Bits, die KanalNummer angeben, reseten
    kanal= kanal << 3 ;     // Kanalnummer auf richtige Position 
rotieren
    ADCON0 |= kanal;        // und durch ODER-Funktion in Register 
übertragen
    Delay1ms(255);          // Warten, damit interne Meßkondensator 
geladen wird.
    Delay1ms(255);
    GO=1;                   // Starten der Wandlung
    while(GO);              // Solange warten bis Wandlung abgeschlossen 
ist
    Antwort.low8=ADRESL;    // Ergebnisse in Variable speichern
    Antwort.high8=ADRESH;
    return Antwort;
}
//********************************************************************** 
***************

//*******  Hauptprogramm 
***************************************************

void main(void)
{

  TRISA = 0b.1111.1;      // PortA   alles Eingänge
   TRISB = 0b.0000.0000;     // Port B sind alles Ausgänge

   uns16 a;                // Variablen
    char n;
  char ade;
  char verg;
  char verg1;


    //++  Einstellungen des AD-Wandlers  ++++++++++++++++++++++++++++
    ADCON1=0;               // Ganzer PortA als Analog Vdd Vss
    ADON=1;                 // ADC-Einschalten
    ADCS1=1 ;               // Geschwingigkeit der ADC
    ADCS0=0 ;
    ADFM=1;                 // Rechts Ausrichtung
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


    while(1) {

     n=1;
      a=ADC(n);           // AD-Wandlung

      verg=a.high8*256;  //Umrechnung des High und Low Byts
     verg1=verg+a.low8;
      ade=1024*verg1;

      if (ade<=3) PORTB.2=1;
      if (ade>=3) PORTB.2=0;


     }
                      // Ende der Schleife

}                     // Ende des Hauptprogramms´
//********************************************************************** 
***************

von Sabine M. (zizo)


Lesenswert?

hallo,
du muss alle Pins der Port B als Digitale Ausgänge setzen, In Datenblatt 
gibt es das Register ANSEL. der musst du auf 0x00 setzen

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.