PIC18 ADC liefert nur zwei Werte.

Gast #2779115
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
}
Gast #2780169
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.

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