Forum: Mikrocontroller und Digitale Elektronik Analog Input ADC


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Markus T. (1lc)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.