So folgendes. Es funktioniert nun zum Teil. Im folgenden sind 2
Programmcodes mit Ausgabe. Die erste funktioniert und die zweite nicht
mehr. Vielleicht wisst ihr warum.
Ich habe lediglich den Multiplikator geändert und der Variablen string
einen weiteren Wert spendiert.
Vielleicht könnt ihr auch einen Blick auf das Config Word machen und
sagen ob noch etwas fehlt.
1 | #include <p18f2410.h>
|
2 | #include <usart.h>
|
3 | #include <delays.h>
|
4 | #include <adc.h>
|
5 |
|
6 | #pragma config OSC = INTIO67 // Interner Oszillator, Port function on RA6 u. RA7
|
7 | #pragma config WDT = OFF // Watchdog Timer Off
|
8 | #pragma config PWRT = ON
|
9 | #pragma config LVP = OFF //Low Voltage ICSP
|
10 |
|
11 | #pragma code
|
12 |
|
13 | // **************************************************************************************
|
14 | // init: Initialisierung des PIC
|
15 | // **************************************************************************************
|
16 |
|
17 | void init(void)
|
18 | {
|
19 | OSCCONbits.IRCF1 = 1; // CPU auf 4MHz einstellen
|
20 |
|
21 | TRISC = 0x00;
|
22 |
|
23 | // USART initialisieren
|
24 | OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 25);
|
25 |
|
26 | // A/D Wandler initialisieren
|
27 | OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_4_TAD,ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS,0b1110);
|
28 | SetChanADC(ADC_CH0);
|
29 |
|
30 | } //init
|
31 |
|
32 | // **************************************************************************************
|
33 | // main: Hauptprogramm
|
34 | // **************************************************************************************
|
35 |
|
36 | void main(void)
|
37 | {
|
38 | int mess_erg;
|
39 | unsigned short long temp;
|
40 | char string[10];
|
41 |
|
42 | init();
|
43 |
|
44 | while(1) {
|
45 | Delay10KTCYx( 100 );
|
46 |
|
47 | ConvertADC(); // Start conversion
|
48 | while( BusyADC() ); // Wait for ADC conversion
|
49 | mess_erg = ReadADC(); // Read result and put in mess_erg
|
50 |
|
51 | temp = mess_erg * (unsigned)50;
|
52 | temp = temp / (unsigned)1024;
|
53 |
|
54 | string[1]=(temp % 10) +'0'; // Modulo rechnen, dann den ASCII-Code von '0' addieren
|
55 | temp /= 10;
|
56 | string[0]=(temp % 10) +'0'; // Modulo rechnen, dann den ASCII-Code von '0' addieren
|
57 |
|
58 | while(BusyUSART());
|
59 | WriteUSART( string[0] );
|
60 | while(BusyUSART());
|
61 | WriteUSART('.');
|
62 | while(BusyUSART());
|
63 | WriteUSART( string[1] );
|
64 | while(BusyUSART());
|
65 | WriteUSART('V');
|
66 |
|
67 | while(BusyUSART()); // Neue Zeile
|
68 | WriteUSART( 0x0D );
|
69 | while(BusyUSART());
|
70 | WriteUSART( 0x0A );
|
71 | } //while
|
72 | }
|
Die Ausgabe stimmt. Ich habe sie mit einem Multimeter am Sensor
gemessen.
1 | 4.3V
|
2 | 4.3V
|
3 | 4.3V
|
4 | 4.3V
|
5 | 4.3V
|
6 | 4.3V
|
Nachdem das erste Programm funktioniert wollte ich die mehr Genauigkeit
also wollte ich eine Kommastelle mehr haben.
1 | #include <p18f2410.h>
|
2 | #include <usart.h>
|
3 | #include <delays.h>
|
4 | #include <adc.h>
|
5 |
|
6 | #pragma config OSC = INTIO67 // Interner Oszillator, Port function on RA6 u. RA7
|
7 | #pragma config WDT = OFF // Watchdog Timer Off
|
8 | #pragma config PWRT = ON
|
9 | #pragma config LVP = OFF //Low Voltage ICSP
|
10 |
|
11 | #pragma code
|
12 |
|
13 | // **************************************************************************************
|
14 | // init: Initialisierung des PIC
|
15 | // **************************************************************************************
|
16 |
|
17 | void init(void)
|
18 | {
|
19 | OSCCONbits.IRCF1 = 1; // CPU auf 4MHz einstellen
|
20 |
|
21 | TRISC = 0x00;
|
22 |
|
23 | // USART initialisieren
|
24 | OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 25);
|
25 |
|
26 | // A/D Wandler initialisieren
|
27 | OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_4_TAD,ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS,0b1110);
|
28 | SetChanADC(ADC_CH0);
|
29 |
|
30 | } //init
|
31 |
|
32 | // **************************************************************************************
|
33 | // main: Hauptprogramm
|
34 | // **************************************************************************************
|
35 |
|
36 | void main(void)
|
37 | {
|
38 | int mess_erg;
|
39 | unsigned short long temp;
|
40 | char string[10];
|
41 |
|
42 | init();
|
43 |
|
44 | while(1) {
|
45 | Delay10KTCYx( 100 );
|
46 |
|
47 | ConvertADC(); // Start conversion
|
48 | while( BusyADC() ); // Wait for ADC conversion
|
49 | mess_erg = ReadADC(); // Read result and put in mess_erg
|
50 |
|
51 | temp = mess_erg * (unsigned)500;
|
52 | temp = temp / (unsigned)1024;
|
53 |
|
54 | string[2]=(temp % 10) +'0'; // Modulo rechnen, dann den ASCII-Code von '0' addieren
|
55 | temp /= 10;
|
56 | string[1]=(temp % 10) +'0'; // Modulo rechnen, dann den ASCII-Code von '0' addieren
|
57 | temp /= 10;
|
58 | string[0]=(temp % 10) +'0'; // Modulo rechnen, dann den ASCII-Code von '0' addieren
|
59 |
|
60 | while(BusyUSART());
|
61 | WriteUSART( string[0] );
|
62 | while(BusyUSART());
|
63 | WriteUSART('.');
|
64 | while(BusyUSART());
|
65 | WriteUSART( string[1] );
|
66 | while(BusyUSART());
|
67 | WriteUSART( string[2] );
|
68 | while(BusyUSART());
|
69 | WriteUSART('V');
|
70 |
|
71 | while(BusyUSART()); // Neue Zeile
|
72 | WriteUSART( 0x0D );
|
73 | while(BusyUSART());
|
74 | WriteUSART( 0x0A );
|
75 | } //while
|
76 | }
|
Die ausgabe stimmt nun nicht mehr.
1 | 0.53V
|
2 | 0.53V
|
3 | 0.53V
|
4 | 0.53V
|
5 | 0.53V
|
6 | 0.53V
|
Danke für eure Hilfe! Ich kämpfe schon den ganzen Tag mit dem Zeug.
Andreas