Analog Input ADC

OP #4843999
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
}
Moderator (Firma: Titel) Persönliche Seite #4844112
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...

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