Forum: Mikrocontroller und Digitale Elektronik Analog Input ADC


von Markus T. (1lc)


Lesenswert?

Hallo,
Ich versuche mich zum ersten mal an ADC beim PIC18F14K22 und will ein 
Poti dass an PIN (RA4 (AnalogChannel3)) angeschlossen ist auslesen und 
das 10Bit-Result auf 10 LED's anzeigen lassen.
Sollte eigentlich nicht zu schwer sein aber es klappt noch nicht.
DIE LED's zeigen zwar was an allerdings schwankt das sehr stark und 
größtenteils sind nur die unteren Bits  (LED's) an, erst wenn ich das 
POTI fast ganz aufdrehe gehen die meisten an.

PS: Der PIC läuft auf 8Mhz durch den Internen Oszillator

Was mache ich falsch?


Hier der Code
1
/* 
2
 * File:   XC8.c
3
 * Author: Markus
4
 *
5
 * Created on 23. Dezember 2016, 15:03
6
 */
7
8
#include <stdio.h>
9
#include <stdlib.h>
10
#include "XC8.h"
11
12
#define PIN0 LATAbits.LA2
13
#define PIN1 LATCbits.LC0
14
#define PIN2 LATCbits.LC1
15
#define PIN3 LATCbits.LC2
16
#define PIN4 LATBbits.LB4
17
#define PIN5 LATBbits.LB5
18
#define PIN6 LATBbits.LB6
19
#define PIN7 LATCbits.LC6
20
#define PIN8 LATCbits.LC7
21
#define PIN9 LATBbits.LB7
22
23
24
void ADC_Init()
25
{
26
    ADCON0=0x0D;
27
    ADCON1=0x00;
28
    //ADCON2=0x85;
29
    ADCON2=0xB5;
30
}
31
32
unsigned int ADC_Read(unsigned char channel)
33
{
34
    ADCON0=0x0D;
35
    __delay_ms(2);
36
    ADCON0bits.GO=1;
37
    while(ADCON0bits.GO==1)
38
    {
39
        
40
    }//wait for ADC to complete
41
    return ((ADRESH<<8)+ADRESL);
42
}
43
void setup()
44
{
45
    OSCCONbits.IRCF=110;
46
    TRISAbits.RA2=0;
47
    TRISBbits.RB4=0;
48
    TRISBbits.RB5=0; //Set PortB Bit 5 as Output
49
    TRISBbits.RB6=0;
50
    TRISBbits.RB7=0;
51
    TRISCbits.RC0=0;
52
    TRISCbits.RC1=0;
53
    TRISCbits.RC2=0;
54
    TRISCbits.RC6=0;
55
    TRISCbits.RC7=0;
56
    TRISAbits.RA4=1; //RA4 as Analog Input with ANalog Channel 3
57
    OSCCONbits.IRCF=110;
58
    ANSEL=0xFF;
59
    ANSELH=0xFF;
60
    
61
}
62
unsigned int get_bit(unsigned int decimal, int N)
63
{
64
    int constant=1<<(N-1);
65
    if(decimal&constant)
66
    {
67
        return 1;
68
    }
69
    else
70
        return 0;
71
}
72
73
void main(void ) {
74
    unsigned int res;
75
    setup(); //Initialize
76
    TRISAbits.RA4=1;
77
    ADC_Init();
78
    
79
    do
80
    {
81
        res=ADC_Read(3); //Read from Channel 3
82
        unsigned int a=res&0x3FF;
83
        PIN0=get_bit(a,1);
84
        PIN1=get_bit(a,2);
85
        PIN2=get_bit(a,3);
86
        PIN3=get_bit(a,4);
87
        PIN4=get_bit(a,5);
88
        PIN5=get_bit(a,6);
89
        PIN6=get_bit(a,7);
90
        PIN7=get_bit(a,8);
91
        PIN8=get_bit(a,9);
92
        PIN9=get_bit(a,10);
93
        __delay_ms(100);
94
        
95
    }while(1); //Infinite Loop
96
97
}

: Bearbeitet durch Moderator
von Rainer U. (r-u)


Lesenswert?

Ich hab zwar Deinen Quelltext nicht gelesen - aber kann es sein, dass Du 
ein logarithmisches Poti hast? Was sagt das Messgerät?

Gegen das Flackern hilft ein kleiner Tiefpass..

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus L. schrieb:
> DIE LED's zeigen zwar was an allerdings schwankt das sehr stark und
> größtenteils sind nur die unteren Bits  (LED's) an, erst wenn ich das
> POTI fast ganz aufdrehe gehen die meisten an.
Probiers doch einfach mal mit logischem Vorgehen durch Ausschluss von 
Fehlermöglichkeiten...
1. was misst du mit einem Messgerät am Controllerpin? Hast du dort 
einen linearen Spannungsverlauf? Oder ist dort die Spannung auch erst 
nur niedrig und steigt dann schnell an?
2. was gibt dein Poti aus, ohne dass ein uC-Pin angeschlossen ist?

BTW:
Bitte das nächste Mal selber die [c ] und [/c ] Tags um den Quellcode 
platzieren. Siehe die Anleitung über dem Texteingabefeld, Abschnitt 
"Formatierung"...

BTW2:
1
   PIN0=get_bit(a,1);
Das niederwertigste Bit ist üblicherweise das Bit 0. Wenn du deine 
Zählung bei 1 beginnen lässt, sehe ich schon einen amoklaufenden 
Pointer, der hinter (s)ein Feld zugreift. Den Klassiker eben...

: Bearbeitet durch Moderator
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.