PIC18 ADC liefert nur zwei Werte.

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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.