Forum: Mikrocontroller und Digitale Elektronik PIC18 ADC liefert nur zwei Werte.


von Hansi (Gast)


Lesenswert?

Hallo Leute.

Ich versuche gerade den umstieg auf PICs (bitte hierzu noch keine 
Kommentare).
Jetzt bin ich aber leider an einer Stelle angekommen, an der ich nicht 
mehr weiter weiß!

µC: PIC18F2550
Board: PICDEM 2 Plus
Programmer: ICD2
Takte: ext 4MHz Oszillator
Compiler: c18 (v3.40)
Library: MPLAB C18 Lib


Auf dem Board ist ein Poti am RA0/ANA0 angeschlossen.
Ich versuche den Wert des ADCs auszulesen und via USART auszugeben.

Der UART funktioniert auch so weit! Nur mein ADC liefert mir nur die 
Werte 0 oder 1023 (was ja das min bzw. max des darstellbaren Wertes 
darstellt)
Hat einer von euch einen heißen Tipp für mich?

Vielen Dank für eure Hilfe
Hansi
1
#include <p18f2550.h>
2
#include <delays.h>
3
#include <usart.h>
4
#include <stdio.h>
5
#include <stdlib.h>
6
#include <adc.h>
7
8
#pragma config FOSC=XT_XT
9
#pragma config PWRT=ON   //Power on timer
10
#pragma config BOR=OFF   //Brown out reset
11
#pragma config WDT=OFF   //Watchdog timer
12
#pragma config LVP=OFF   //Low voltage progr.
13
#pragma config MCLRE=ON  //Master clear reset
14
15
void delay_ms(int ms);
16
void INIT_IO(void);
17
18
void delay_ms(int ms)
19
{
20
  int z;
21
    for (z=1; z<ms; z++)
22
    {     
23
      Delay10TCYx(25);
24
    }
25
}
26
27
void INIT_IO(void)
28
{
29
  PORTA = 0x00;
30
  TRISA = 0x10;   //Port A Bit 4 = input
31
  PORTB = 0x00;
32
  TRISB = 0x00;  //Port B all Bits = Output
33
}
34
35
void main (void)
36
{
37
  int result;
38
  char temp_str[]="00000";
39
  
40
  INIT_IO();
41
  
42
  OpenUSART( USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 25);
43
  OpenADC( ADC_FOSC_2 & ADC_RIGHT_JUST & ADC_0_TAD, ADC_CH0 & ADC_INT_OFF,1);
44
  Delay10TCYx( 50 );     // Delay for 50TCY
45
46
    while (1)
47
  {
48
    if(!(PORTA & 0x10))
49
    {
50
      ConvertADC();
51
      while( BusyADC() );   // Wait for completion
52
        result = ReadADC();   // Read result
53
      itoa(result, temp_str);
54
      putrsUSART((const rom far char *)"\n\rADC");
55
      putsUSART(temp_str);
56
      while(!BusyUSART());      
57
    }
58
    else
59
    {
60
      delay_ms(1000);
61
      PORTBbits.RB3 = 1;
62
      delay_ms(1000);
63
      PORTBbits.RB3 = 0;
64
    }
65
  }
66
  CloseUSART();
67
  CloseADC();
68
}

von Martin S. (drunkenmunky)


Lesenswert?

Hi,

ich kenn mich mit der Lib nicht so aus. Wird AN0 im Register ADCON1 auf 
analog geschalten?

ADC Clock im erlaubten Bereich?

von Chris B. (dekatz)


Lesenswert?

"....TRISA = 0x10;   //Port A Bit 4 = input..."????
Da AN0 auf RA0 liegt sollte es wohl TRISA = 0x01 lauten.

Keine Ahnung ob OpenADC das ADCON1-Register initialisiert, aber kannst 
ja sicherheitshalber ADCON1 = 0x0E setzen (Vref- = Vss, Vref+ = Vdd, 
AN0)

von W.S. (Gast)


Lesenswert?

Lies die Doku zum Chip gründlich. Du mußt sowohl die Portpins einstellen 
als auch die Register des ADC, dann geht das auch. Erwarte bitte nicht, 
daß sich hier alle Helfer durch deinen Quellcode durcharbeiten.

W.S.

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.