Gast
#1910716
Guten Tag, aktuell bin ich an einem Projekt für das es nötig ist zwei Spannungen zu vergleichen. Die eine Spannung ist konstant und die andere kann schwanken. Sollte diese Spannung schwanken soll die über LEDs angezeigt werden. Nun zu meinem Problem: Es ist völlig egal was am PIC an Spannung anliegt. Er gibt für jede Spannung den gleichen Wert aus. Ich hatte mal ein kleines Programm was lief, wiederrum gab es da noch Probleme mit einer externen Hardware, welche die Spannungen liefert. Dieses Problem ist nun behoben aber das Programm funktioniert nicht mehr bzw. der PIC liefert falsche Ergebnisse. Merkwürdig ist, dass wenn ich das AD1CON3 register ändere sich auch der Ergebnis der Convertierung ändert. Beispiel: AD1CON3 = 0b0000000100000010; : ADCrefValue = ADCValue = 127 AD1CON3 = 0b0001111100000111; : ADCrefValue = ADCValue = 0 AD1CON3 = 0b1001111100000010; : ADCrefValue = ADCValue = 1023 Hier ist der Code von meinem Testprogramm was nur dazu dient um zu schauen ob der PIC die Spannung korrekt umconvertiert. #include <p24FJ64GB106.h> #include <stdio.h> #include <stdlib.h> _CONFIG1 (FWDTEN_OFF) //Watchdogtimer off int main(void) { int ADCrefValue = 0; PORTB = 0b0000000000000000; TRISB = 0b1111111111111001; //RB1-2 = Output, RB0/3-15 = Input AD1CON1 = 0b0000000011100000; // SSRC<2:0> = 111 implies internal counter ends sampling and starts converting. AD1CON2 = 0b0010000000000000; // Vr+ = Vref+ AD1CON3 = 0b1001111100000010; // Sample time = 31Tad, Tad = 3Tcy AD1PCFG = 0b1111111111100110; // AN0, AN3 & AN4 as Analog Input AD1PCFGL = 0b1111111111100110; // AN0, AN3 & AN4 as Analog Input AD1PCFGH = 0b0000000000000011; AD1CSSL = 0b0000000000000000; AD1CSSH = 0b0000000000000000; AD1CHS = 0b0000000000000011; // Negative Input Vr-, analog signal from PIR (MUX A = AN4) AD1CON1bits.ADON = 1; //Turn on ADC while (1) // repeat continuously { AD1CON1bits.SAMP=1; //start sampling while(!AD1CON1bits.DONE); //conversion done? AD1CON1bits.SAMP=0; //start sampling ADCrefValue = ADC1BUF0; //yes then get ADC value if (ADCrefValue > 300){ PORTB = 0b0000000000000110; } else PORTB = 0b0000000000000010; } // repeat } In diesem Fall liegt der Wert den der PIC einliest knapp über 300 (es leuchten beide LEDs an RB1 und RB2) aber auch hier ist es egal wie hoch die Spannung ist (auch wenn garkeine Spannung an dem PIN anliegt ist das Ergebnis wie sonst auch). Ich hab leider keine andere Möglichkeit mir den Wert der in ADC1BUF0 steht anders als über die beiden LEDs anzuzeigen. Besteht vllt. die Möglichkeit der der interne AD-Converter defekt ist? Ich würde mich über jede Art von Hilfe sehr freuen. Danke schonmal im Vorraus. Gruß Alex