Hallo, ich wollte mit meinem PIC über A2 einen Analogwert einlesen und ihn dann über ein Terminalprogramm anzeigen lassen. Allerdings wird mir dann der doppelte Wert angezeigt. Kann mir einer sagen ob der Fehler in der Analogverarbeitung oder an der Kommunikation mit dem PC liegt? Hier ein Auszug: void adInit() { adcs0 = 1; adcs1 = 1; pcfg0 = 0; pcfg1 = 0; pcfg2 = 0; pcfg3 = 0; adfm = 1; adon = 1; } float ReadAnalog() { int16 i=0; chs0 = 0; chs1 = 1; chs2 = 0; delay_us(10); godone =1; adwert=0; while(i<255) { adwert = adwert + read_adc(); i++; } godone =0; return (adwert/i)/100; } void GetWert(float wert) { char ascii[50]; int8 i; sprintf(ascii,"Analogwert %3.1f V",wert); For (i=0;i<LENGTH_ASCII;++i) { putc(ascii[i]); } putc(CR); } #INT_RDA void isr_rda() { LED1=1; rx_buffer[rx_count]= getc(); ++rx_count; flag=1; } void main() { set_tris_a(0b11111111); set_tris_b(0b11111111); set_tris_c(0b11111100); port_b_pullups(FALSE); serialInit(); // Initialisierung der RS232-Schnittstelle adInit(); ENABLE_INTERRUPTS(INT_RDA); ENABLE_INTERRUPTS(GLOBAL); while (1) { wert=ReadAnalog(); checkusart(); if(rx_buffer[rx_p]==0x30) GetWert(wert); } }
>Kann mir einer sagen ob der Fehler in der Analogverarbeitung oder an der >Kommunikation mit dem PC liegt? Mach doch hier mal float ReadAnalog() { //return (adwert/i)/100; return 123.45; } Wird der richtige Wert gesendet liegt es nicht an der Kommunikation ;)
Wenn ich, float ReadAnalog() { //return (adwert/i)/100; return 123.45; } angebe werden mir auch die 123.45 angezeigt. Auch wenn ich ein const char abfrage erhalte ich ein korrektes Ergebnis, nur bei Ausgabe des Analogwertes bekomme ich ein falsches Ergebnis zurück. Auch die Änderung von For (i=0;i<LENGTH_ASCII;++i) nach For(i=0;<strlen(ascii);i++) hat leider nichts gebracht.
Aber was kann man bei read_adc falsch machen es ist doch eine Funktion des ccs Compilers und ReadAnalog() sollte ja auch richtig sein. Hab ReadAnalog auch anderst geschrieben wo ich keinen Mittelwert bilde und bekomme trotzdem einen falschen Wert zurück.
>Aber was kann man bei read_adc falsch machen es ist doch eine Funktion >des ccs Compilers und ReadAnalog() sollte ja auch richtig sein. Hab >ReadAnalog auch anderst geschrieben wo ich keinen Mittelwert bilde und >bekomme trotzdem einen falschen Wert zurück. Ich hab keine Ahnung was du misst, wie die Schaltung aussieht oder welchen PIC du benutzt. Möglicherweise irgendeine falsche Einstellung der Referenzspannung oder sonst irgendein Unsinn. Fehler in der Compiler LIB nicht ausgeschlossen. Vieleicht liegt der Fehler dann ja hier? void adInit() { adcs0 = 1; adcs1 = 1; pcfg0 = 0; pcfg1 = 0; pcfg2 = 0; pcfg3 = 0; adfm = 1; adon = 1; } Welchen Wert bekommst du denn wenn du nur mal so 1.0V an den AD Eingang legst?
Ich hab die interne Referenzspannung eingestellt. Bei einer Spannung von 2,5V messe ich 4,9V und wenn ich Masse anlege messe ich eine Spannung von 0,9V.
Hi ich hab jetzt meinen Code nur auf die Analogauswertung reduziert aber der Fehler tritt weiterhin auf. Kann mir bitte jemand helfen ich komm da einfach nichtmehr weiter. Zum Code: Internal_ADC_Clock, All_Analog, Referenzspannung Intern, Kanal 2, es wird eine Spannung von 2,5V an Eingang A2 angelegt, dann wird der Mittelwert gebildet und wenn die Spannung größer als 4V ist gehen zwei LEDs an. #include <16F876.h> #DEVICE *=16 #DEVICE ADC=10 #DEVICE ICD = TRUE #FUSES HS, NOWDT, PROTECT, PUT, NOBROWNOUT, NOLVP, DEBUG #ZERO_RAM #USE delay (clock=20000000) #USE fast_io(A) #USE fast_io(B) #USE fast_io(C) #bit LED1 = 0x07.0 //Pin C0 #bit LED2 = 0x07.1 //Pin C1 void main() { int16 v = 0; int8 i; set_tris_a(0b11111111); set_tris_b(0b11111111); set_tris_c(0b11111000); port_b_pullups(FALSE); LED1=1; LED2=1; delay_ms(500); LED1=0; LED2=0; delay_ms(500); SETUP_ADC(ADC_CLOCK_INTERNAL); SETUP_ADC_PORTS(0); set_adc_channel(2); delay_us(10); For(i=0;i<10;++i) { v += read_adc(); } v /= i; While(1) { delay_ms(500); if(v>4) { LED1=1; LED2=1; } else{ LED1=1; } delay_ms(500); } }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.