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 | }
|