Forum: Mikrocontroller und Digitale Elektronik PIC18F25k80 Probleme mit dem ADC


von Andreas K. (Firma: Trenew Electroic AG) (lehafir)


Lesenswert?

Guten Tag allerseits,

Ich bin gerade an meinem ersten Mikrokontrollerporjekt und ich bin am 
verzweifeln. Ich habe ein Thermometer mit einem LCD Display, welches die 
Temperatur anzeigen soll, dieser Teil funktoniert und wir hier nicht 
aufgeführt. Allerdings hab ich ein Problem bei der A/D Wandlung, wenn 
ich das Programm wie unten aufgeführt ausführe, erhalte ich als 
Temperatur 0.
Ich weiss nicht was ich flasch mache, aber wahrscheinlich liegt es an 
der Konifg. des A/D's.

Hier noch ein paar technische Angaben:
Speisung: 3V
Oszillator: intern 1MHz
Analoge Refernez: intern 2.048V und AVSS
Restliche I/O's: output

Ich hoffe ihr könnt mir helfen

Danke im Voraus
Andreas
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <xc.h>
4
#include <pic18f25k80.h>
5
#include <math.h>
6
7
/*
8
 * Config
9
 */
10
11
// #pragma config statements should precede project file includes.
12
// Use project enums instead of #define for ON and OFF.
13
14
// CONFIG1L
15
#pragma config RETEN = OFF      // VREG Sleep Enable bit (Ultra low-power regulator is Disabled (Controlled by REGSLP bit))
16
#pragma config INTOSCSEL = HIGH // LF-INTOSC Low-power Enable bit (LF-INTOSC in High-power mode during Sleep)
17
#pragma config SOSCSEL = DIG    // SOSC Power Selection and mode Configuration bits (Digital (SCLKI) mode)
18
#pragma config XINST = ON       // Extended Instruction Set (Enabled)
19
20
// CONFIG1H
21
#pragma config FOSC = INTIO2    // Oscillator (Internal RC oscillator)
22
#pragma config PLLCFG = OFF     // PLL x4 Enable bit (Disabled)
23
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor (Disabled)
24
#pragma config IESO = OFF       // Internal External Oscillator Switch Over Mode (Disabled)
25
26
// CONFIG2L
27
#pragma config PWRTEN = OFF     // Power Up Timer (Disabled)
28
#pragma config BOREN = OFF      // Brown Out Detect (Disabled in hardware, SBOREN disabled)
29
#pragma config BORV = 2         // Brown-out Reset Voltage bits (2.0V)
30
#pragma config BORPWR = ZPBORMV // BORMV Power level (ZPBORMV instead of BORMV is selected)
31
32
// CONFIG2H
33
#pragma config WDTEN = ON       // Watchdog Timer (WDT controlled by SWDTEN bit setting)
34
#pragma config WDTPS = 1048576  // Watchdog Postscaler (1:1048576)
35
36
// CONFIG3H
37
#pragma config CANMX = PORTB    // ECAN Mux bit (ECAN TX and RX pins are located on RB2 and RB3, respectively)
38
#pragma config MSSPMSK = MSK7   // MSSP address masking (7 Bit address masking mode)
39
#pragma config MCLRE = ON       // Master Clear Enable (MCLR Enabled, RE3 Disabled)
40
41
// CONFIG4L
42
#pragma config STVREN = OFF     // Stack Overflow Reset (Disabled)
43
#pragma config BBSIZ = BB2K     // Boot Block Size (2K word Boot Block size)
44
45
// CONFIG5L
46
#pragma config CP0 = OFF        // Code Protect 00800-01FFF (Disabled)
47
#pragma config CP1 = OFF        // Code Protect 02000-03FFF (Disabled)
48
#pragma config CP2 = OFF        // Code Protect 04000-05FFF (Disabled)
49
#pragma config CP3 = OFF        // Code Protect 06000-07FFF (Disabled)
50
51
// CONFIG5H
52
#pragma config CPB = OFF        // Code Protect Boot (Disabled)
53
#pragma config CPD = OFF        // Data EE Read Protect (Disabled)
54
55
// CONFIG6L
56
#pragma config WRT0 = OFF       // Table Write Protect 00800-03FFF (Disabled)
57
#pragma config WRT1 = OFF       // Table Write Protect 04000-07FFF (Disabled)
58
#pragma config WRT2 = OFF       // Table Write Protect 08000-0BFFF (Disabled)
59
#pragma config WRT3 = OFF       // Table Write Protect 0C000-0FFFF (Disabled)
60
61
// CONFIG6H
62
#pragma config WRTC = OFF       // Config. Write Protect (Disabled)
63
#pragma config WRTB = OFF       // Table Write Protect Boot (Disabled)
64
#pragma config WRTD = OFF       // Data EE Write Protect (Disabled)
65
66
// CONFIG7L
67
#pragma config EBTR0 = OFF      // Table Read Protect 00800-03FFF (Disabled)
68
#pragma config EBTR1 = OFF      // Table Read Protect 04000-07FFF (Disabled)
69
#pragma config EBTR2 = OFF      // Table Read Protect 08000-0BFFF (Disabled)
70
#pragma config EBTR3 = OFF      // Table Read Protect 0C000-0FFFF (Disabled)
71
72
// CONFIG7H
73
#pragma config EBTRB = OFF      // Table Read Protect Boot (Disabled)
74
75
76
/*
77
 * Defin
78
 */
79
#define _XTAL_FREQ 1000000
80
81
/*
82
 * 
83
 */
84
85
int main(int argc, char** argv)
86
{
87
    OSCCONbits.IRCF = 0b011;    // Frequenz auf 1MHz
88
89
    ANCON0 = 0x01;              // Analogeingänge auf Digital umschalten
90
    ANCON1 = 0x00;              // Bis auf AN0
91
92
    ADCON0bits.ADON = 0b1;      //Analogeingang definieren
93
    ADCON0bits.CHS = 0b00000;
94
95
    ADCON1bits.VCFG = 0b10;     //Analoge Referenz festlegen
96
    ADCON1bits.VNCFG = 0b0;
97
    ADCON1bits.CHSN = 0b000;
98
99
    ADCON2bits.ADFM = 0b1;      //Analoge Geschwindigkeit festlegen
100
    ADCON2bits.ACQT = 0b010;
101
    ADCON2bits.ADCS = 0b111;
102
103
    TRISA = 0x01;               // Alle Digitalen Ports auf Ausgang stellen
104
    TRISB = 0x00;               // Bis auf den analogen Eingang
105
    TRISC = 0x00;
106
107
    PORTAbits.RA5 = 0;          // Nicht benutzte Pins auf 0 ziehen
108
109
    // Variablen für die Ansteuerung der LCD-Anzeige erstellen
110
    static bit A1 = 0, B1 = 0, C1 = 0, D1 = 0, E1 = 0, F1 = 0, G1 = 0, DP1 = 0;
111
    static bit A2 = 0, B2 = 0, C2 = 0, D2 = 0, E2 = 0, F2 = 0, G2 = 0, DP2 = 0;
112
113
    // Div. Variablen erstellen
114
    int Temperatur = 0;
115
    static bit Invertierer = 0;
116
    while(1)
117
    {
118
        /*
119
         * Einlesen der Temperatur
120
         */
121
        ADCON0bits.GO_DONE = 1;
122
        while(ADCON0bits.GO_DONE);
123
 
124
        Temperatur = ADRESL;
125
    }

von Alex X. (behindi)


Lesenswert?

Hallo Andreas,

kann in Configs keine Fehler erkennen.
Kann dir leider nur Ratschläge geben, was du noch probieren könntest.

- versuch mal als Wandlungstakt fosc/2 zu nehmen (ADCON2bits.ADCS = 
0b000;)




Kleine Bebmerkung nebenbei

ADCON2bits.ADFM = 0b0; Ergebnis wird linksbündig in ADRESH/L abgelegt
.
Temperatur = ADRESH; (8 bit Auflösung)

ansonsten

ADCON2bits.ADFM = 0b1; Ergebnis wird rechtsbündig in ADRESH/L abgelegt
.
Temperatur = ADRESL + (ADRESH*256);  (10 bit Auflösung)

von Andreas K. (Firma: Trenew Electroic AG) (lehafir)


Lesenswert?

Danke für den Tipp, hat leider aber auch nicht funktioniert.

Das mit dem ADFM ist mir schon bekannt, habs jetzt nur gerade vergessen, 
hinzuschreiben, sollte ja aber keine Unterschied machen, irgentetwas 
sollte ich ja herausbekommen.

von Chris B. (dekatz)


Lesenswert?

#pragma config WDTEN = ON ???
Wenn WDT nicht benötigt wird abschalten bzw. bei Programmstart Löschen.

von Andreas K. (Firma: Trenew Electroic AG) (lehafir)


Angehängte Dateien:

Lesenswert?

Danek für den Hinweis, wollte ich eigentlich auch ausschalten, hab ich 
aber vergessen. Funktionieren tut das ganze leider immer noch nicht.

Ich habe hier noch das Schema, könnte es sein, dass ich in der Hardware 
ein Fehler gemacht habe?

von Michael S. (rbs_phoenix)


Lesenswert?

Wenn du statt "Temperatur = ADRESH;" also "Temperatur = 128;" schreibst 
(und den Rest so lässt), zeigt dein Display auch 128 bzw 1.024V an? Wenn 
ja bin ich ratlos. Wenn nein, liegt der Fehler irgendwo anders im Code. 
Interessant wäre deshalb der komplette Code. Das oben wird er ja nicht 
sein.

Oder guckst du mit dem Debugger nach?

Zusätzlich kannst du noch an dem ausgewählten Analogeingang die Spannung 
messen. Nicht, dass 0 der richtig gemesene Wert ist (durch nen 
Kurzschluss zur masse oder so).

von Andreas K. (Firma: Trenew Electroic AG) (lehafir)


Lesenswert?

Wenn ich eine Zahl bei der Temperatur eingebe kommt diese am Ende auch 
heraus.
Am AN0 (Pin 2) liegen ca 800mV an.

(Mein Temperaturbeich geht nur von 0 - 50C°)

1
/* 
2
 * File:   main.c
3
 * Author: akolb
4
 *
5
 * Created on 28. Juli 2014, 08:28
6
 */
7
8
#include <stdio.h>
9
#include <stdlib.h>
10
#include <xc.h>
11
#include <pic18f25k80.h>
12
#include <math.h>
13
14
/*
15
 * Config
16
 */
17
18
// #pragma config statements should precede project file includes.
19
// Use project enums instead of #define for ON and OFF.
20
21
// CONFIG1L
22
#pragma config RETEN = OFF      // VREG Sleep Enable bit (Ultra low-power regulator is Disabled (Controlled by REGSLP bit))
23
#pragma config INTOSCSEL = HIGH // LF-INTOSC Low-power Enable bit (LF-INTOSC in High-power mode during Sleep)
24
#pragma config SOSCSEL = DIG    // SOSC Power Selection and mode Configuration bits (Digital (SCLKI) mode)
25
#pragma config XINST = ON       // Extended Instruction Set (Enabled)
26
27
// CONFIG1H
28
#pragma config FOSC = INTIO2    // Oscillator (Internal RC oscillator)
29
#pragma config PLLCFG = OFF     // PLL x4 Enable bit (Disabled)
30
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor (Disabled)
31
#pragma config IESO = OFF       // Internal External Oscillator Switch Over Mode (Disabled)
32
33
// CONFIG2L
34
#pragma config PWRTEN = OFF     // Power Up Timer (Disabled)
35
#pragma config BOREN = OFF      // Brown Out Detect (Disabled in hardware, SBOREN disabled)
36
#pragma config BORV = 2         // Brown-out Reset Voltage bits (2.0V)
37
#pragma config BORPWR = ZPBORMV // BORMV Power level (ZPBORMV instead of BORMV is selected)
38
39
// CONFIG2H
40
#pragma config WDTEN = OFF       // Watchdog Timer (WDT controlled by SWDTEN bit setting)
41
#pragma config WDTPS = 1048576  // Watchdog Postscaler (1:1048576)
42
43
// CONFIG3H
44
#pragma config CANMX = PORTB    // ECAN Mux bit (ECAN TX and RX pins are located on RB2 and RB3, respectively)
45
#pragma config MSSPMSK = MSK7   // MSSP address masking (7 Bit address masking mode)
46
#pragma config MCLRE = ON       // Master Clear Enable (MCLR Enabled, RE3 Disabled)
47
48
// CONFIG4L
49
#pragma config STVREN = OFF     // Stack Overflow Reset (Disabled)
50
#pragma config BBSIZ = BB2K     // Boot Block Size (2K word Boot Block size)
51
52
// CONFIG5L
53
#pragma config CP0 = OFF        // Code Protect 00800-01FFF (Disabled)
54
#pragma config CP1 = OFF        // Code Protect 02000-03FFF (Disabled)
55
#pragma config CP2 = OFF        // Code Protect 04000-05FFF (Disabled)
56
#pragma config CP3 = OFF        // Code Protect 06000-07FFF (Disabled)
57
58
// CONFIG5H
59
#pragma config CPB = OFF        // Code Protect Boot (Disabled)
60
#pragma config CPD = OFF        // Data EE Read Protect (Disabled)
61
62
// CONFIG6L
63
#pragma config WRT0 = OFF       // Table Write Protect 00800-03FFF (Disabled)
64
#pragma config WRT1 = OFF       // Table Write Protect 04000-07FFF (Disabled)
65
#pragma config WRT2 = OFF       // Table Write Protect 08000-0BFFF (Disabled)
66
#pragma config WRT3 = OFF       // Table Write Protect 0C000-0FFFF (Disabled)
67
68
// CONFIG6H
69
#pragma config WRTC = OFF       // Config. Write Protect (Disabled)
70
#pragma config WRTB = OFF       // Table Write Protect Boot (Disabled)
71
#pragma config WRTD = OFF       // Data EE Write Protect (Disabled)
72
73
// CONFIG7L
74
#pragma config EBTR0 = OFF      // Table Read Protect 00800-03FFF (Disabled)
75
#pragma config EBTR1 = OFF      // Table Read Protect 04000-07FFF (Disabled)
76
#pragma config EBTR2 = OFF      // Table Read Protect 08000-0BFFF (Disabled)
77
#pragma config EBTR3 = OFF      // Table Read Protect 0C000-0FFFF (Disabled)
78
79
// CONFIG7H
80
#pragma config EBTRB = OFF      // Table Read Protect Boot (Disabled)
81
82
83
/*
84
 * Defin
85
 */
86
#define _XTAL_FREQ 1000000
87
88
/*
89
 * 
90
 */
91
92
int main(int argc, char** argv)
93
{
94
    OSCCONbits.IRCF = 0b011;    // Frequenz auf 1MHz
95
96
    ANCON0 = 0x01;              // Analogeingänge auf Digital umschalten
97
    ANCON1 = 0x00;              // Bis auf AN0
98
99
    TRISA = 0x01;               // Alle Digitalen Ports auf Ausgang stellen
100
    TRISB = 0x00;               // Bis auf den analogen Eingang
101
    TRISC = 0x00;
102
103
    
104
    ADCON0bits.CHS = 0b00000;   //Analogeingang definieren
105
    ADCON0bits.ADON = 0b1;
106
107
    ADCON1bits.VCFG = 0b10;     //Analoge Referenz festlegen
108
    ADCON1bits.VNCFG = 0b0;
109
    ADCON1bits.CHSN = 0b000;
110
111
    ADCON2bits.ADFM = 0b1;      //Analoge Geschwindigkeit festlegen
112
    ADCON2bits.ACQT = 0b010;
113
    ADCON2bits.ADCS = 0b000;
114
115
    
116
117
    PORTAbits.RA5 = 0;          // Nicht benutzte Pins auf 0 ziehen
118
119
    // Variablen für die Ansteuerung der LCD-Anzeige erstellen
120
    static bit A1 = 0, B1 = 0, C1 = 0, D1 = 0, E1 = 0, F1 = 0, G1 = 0, DP1 = 0;
121
    static bit A2 = 0, B2 = 0, C2 = 0, D2 = 0, E2 = 0, F2 = 0, G2 = 0, DP2 = 0;
122
123
    // Div. Variablen erstellen
124
    int Temperatur = 0;
125
    static bit Invertierer = 0;
126
    while(1)
127
    {
128
        /*
129
         * Einlesen der Temperatur
130
         */
131
132
        ADCON0bits.GO_DONE = 1;
133
134
        while(ADCON0bits.GO_DONE);
135
136
        Temperatur = ADRESL;   // (ADRESL + (ADRESH*256)-454)/60;//(((514)-454)/60);
137
138
       
139
        /*
140
         * Verarbeitung der Temperatur
141
         */
142
        
143
        // Die erste Ziffer setzen
144
        if(Temperatur == 50)
145
        {
146
            A1 = 1;     // 5 setzen
147
            B1 = 0;
148
            C1 = 1;
149
            D1 = 1;
150
            E1 = 0;
151
            F1 = 1;
152
            G1 = 1;
153
        }
154
        else if(Temperatur >= 40)
155
        {
156
            A1 = 0;     // 4 setzen
157
            B1 = 1;
158
            C1 = 1;
159
            D1 = 0;
160
            E1 = 0;
161
            F1 = 1;
162
            G1 = 1;
163
        }
164
        else if(Temperatur >= 30)
165
        {
166
            A1 = 1;     // 3 setzen
167
            B1 = 1;
168
            C1 = 1;
169
            D1 = 1;
170
            E1 = 0;
171
            F1 = 0;
172
            G1 = 1;
173
        }
174
        else if(Temperatur >= 20)
175
        {
176
            A1 = 1;     // 2 setzen
177
            B1 = 1;
178
            C1 = 0;
179
            D1 = 1;
180
            E1 = 1;
181
            F1 = 0;
182
            G1 = 1;
183
        }
184
        else if(Temperatur >= 10)
185
        {
186
            A1 = 0;     // 1 setzen
187
            B1 = 1;
188
            C1 = 1;
189
            D1 = 0;
190
            E1 = 0;
191
            F1 = 0;
192
            G1 = 0;
193
        }
194
        else
195
        {
196
            A1 = 0;     // nichts setzen
197
            B1 = 0;
198
            C1 = 0;
199
            D1 = 0;
200
            E1 = 0;
201
            F1 = 0;
202
            G1 = 0;
203
        }
204
205
        // Die Zweite Ziffer setzten
206
        if((Temperatur == 0)||(Temperatur == 10)||(Temperatur == 20)||(Temperatur == 30)||(Temperatur == 40)||(Temperatur == 50))
207
        {
208
            A2 = 1;     // 0 setzen
209
            B2 = 1;
210
            C2 = 1;
211
            D2 = 1;
212
            E2 = 1;
213
            F2 = 1;
214
            G2 = 0;
215
        }
216
        else if((Temperatur == 1)||(Temperatur == 11)||(Temperatur == 21)||(Temperatur == 31)||(Temperatur == 41))
217
        {
218
            A2 = 0;     // 1 setzen
219
            B2 = 1;
220
            C2 = 1;
221
            D2 = 0;
222
            E2 = 0;
223
            F2 = 0;
224
            G2 = 0;
225
        }
226
        else if((Temperatur == 2)||(Temperatur == 12)||(Temperatur == 22)||(Temperatur == 32)||(Temperatur == 42))
227
        {
228
            A2 = 1;     // 2 setzen
229
            B2 = 1;
230
            C2 = 0;
231
            D2 = 1;
232
            E2 = 1;
233
            F2 = 0;
234
            G2 = 1;
235
        }
236
        else if((Temperatur == 3)||(Temperatur == 13)||(Temperatur == 23)||(Temperatur == 33)||(Temperatur == 43))
237
        {
238
            A2 = 1;     // 3 setzen
239
            B2 = 1;
240
            C2 = 1;
241
            D2 = 1;
242
            E2 = 0;
243
            F2 = 0;
244
            G2 = 1;
245
        }
246
        else if((Temperatur == 4)||(Temperatur == 14)||(Temperatur == 24)||(Temperatur == 34)||(Temperatur == 44))
247
        {
248
            A2 = 0;     // 4 setzen
249
            B2 = 1;
250
            C2 = 1;
251
            D2 = 0;
252
            E2 = 0;
253
            F2 = 1;
254
            G2 = 1;
255
        }
256
        else if((Temperatur == 5)||(Temperatur == 15)||(Temperatur == 25)||(Temperatur == 35)||(Temperatur == 45))
257
        {
258
            A2 = 1;     // 5 setzen
259
            B2 = 0;
260
            C2 = 1;
261
            D2 = 1;
262
            E2 = 0;
263
            F2 = 1;
264
            G2 = 1;
265
        }
266
        else if((Temperatur == 6)||(Temperatur == 16)||(Temperatur == 26)||(Temperatur == 36)||(Temperatur == 46))
267
        {
268
            A2 = 1;     // 6 setzen
269
            B2 = 0;
270
            C2 = 1;
271
            D2 = 1;
272
            E2 = 1;
273
            F2 = 1;
274
            G2 = 1;
275
        }
276
        else if((Temperatur == 7)||(Temperatur == 17)||(Temperatur == 27)||(Temperatur == 37)||(Temperatur == 47))
277
        {
278
            A2 = 1;     // 7 setzen
279
            B2 = 1;
280
            C2 = 1;
281
            D2 = 0;
282
            E2 = 0;
283
            F2 = 0;
284
            G2 = 0;
285
        }
286
        else if((Temperatur == 8)||(Temperatur == 18)||(Temperatur == 28)||(Temperatur == 38)||(Temperatur == 48))
287
        {
288
            A2 = 1;     // 8 setzen
289
            B2 = 1;
290
            C2 = 1;
291
            D2 = 1;
292
            E2 = 1;
293
            F2 = 1;
294
            G2 = 1;
295
        }
296
        else if((Temperatur == 9)||(Temperatur == 19)||(Temperatur == 29)||(Temperatur == 39)||(Temperatur == 49))
297
        {
298
            A2 = 1;     // 9 setzen
299
            B2 = 1;
300
            C2 = 1;
301
            D2 = 1;
302
            E2 = 0;
303
            F2 = 1;
304
            G2 = 1;
305
        }
306
        else
307
        {
308
            A2 = 0;     // nichts setzen
309
            B2 = 0;
310
            C2 = 0;
311
            D2 = 0;
312
            E2 = 0;
313
            F2 = 0;
314
            G2 = 0;
315
        }
316
317
318
        // Bei ausserhalb des Temperaturbereiches
319
        if(Temperatur > 50)
320
        {
321
            A1 = 1;     // E setzen
322
            B1 = 0;
323
            C1 = 0;
324
            D1 = 1;
325
            E1 = 1;
326
            F1 = 1;
327
            G1 = 1;
328
329
            A2 = 1;     // E setzen
330
            B2 = 0;
331
            C2 = 0;
332
            D2 = 1;
333
            E2 = 1;
334
            F2 = 1;
335
            G2 = 1;
336
        }
337
        else if(Temperatur < 0)
338
        {
339
            A1 = 0;     // - setzen
340
            B1 = 0;
341
            C1 = 0;
342
            D1 = 0;
343
            E1 = 0;
344
            F1 = 0;
345
            G1 = 1;
346
347
            A2 = 1;     // E setzen
348
            B2 = 0;
349
            C2 = 0;
350
            D2 = 1;
351
            E2 = 1;
352
            F2 = 1;
353
            G2 = 1;
354
        }
355
        else;
356
357
        /*
358
         * Ausgabe an die LCD-Anzeige
359
         */
360
        if(Invertierer == 0)
361
        {
362
            PORTAbits.RA1 = 0;
363
   
364
            PORTBbits.RB0 = D1;
365
            PORTBbits.RB1 = C1;
366
            PORTBbits.RB2 = B1;
367
            PORTBbits.RB3 = A1;
368
            PORTBbits.RB4 = F1;
369
            PORTBbits.RB5 = E1;
370
            PORTBbits.RB6 = DP1;
371
            PORTBbits.RB7 = G1;
372
            
373
            PORTCbits.RC0 = D2;
374
            PORTCbits.RC1 = C2;
375
            PORTCbits.RC2 = B2;
376
            PORTCbits.RC3 = A2;
377
            PORTCbits.RC4 = F2;
378
            PORTCbits.RC5 = E2;
379
            PORTCbits.RC6 = DP2;
380
            PORTCbits.RC7 = G2;
381
382
            Invertierer = 1;
383
        }
384
        //invertieren für LCD Display
385
        else
386
        {
387
            PORTAbits.RA1 = 1;
388
389
            PORTBbits.RB0 = 1 - D1;
390
            PORTBbits.RB1 = 1 - C1;
391
            PORTBbits.RB2 = 1 - B1;
392
            PORTBbits.RB3 = 1 - A1;
393
            PORTBbits.RB4 = 1 - F1;
394
            PORTBbits.RB5 = 1 - E1;
395
            PORTBbits.RB6 = 1 - DP1;
396
            PORTBbits.RB7 = 1 - G1;
397
398
            PORTCbits.RC0 = 1 - D2;
399
            PORTCbits.RC1 = 1 - C2;
400
            PORTCbits.RC2 = 1 - B2;
401
            PORTCbits.RC3 = 1 - A2;
402
            PORTCbits.RC4 = 1 - F2;
403
            PORTCbits.RC5 = 1 - E2;
404
            PORTCbits.RC6 = 1 - DP2;
405
            PORTCbits.RC7 = 1 - G2;
406
407
            Invertierer = 0;
408
        }
409
410
411
        __delay_ms(10);    // Wartezeit von 10ms
412
    }
413
    return (EXIT_SUCCESS);
414
}

von Pascal H. (pase-h)


Angehängte Dateien:

Lesenswert?

Hallo,
vielleicht hilft dir mein Programm weiter.
Es ist für eine PIC18F45k22 geschrieben, und liest den ADC über den ADC 
Interrupt aus, erzeugt einen Mittelwert aus n Messwerten (bei mir 200) 
und gibt das ganze über den Timer0 Interrupt auf 7-Segment anzeigen aus.

Desweitern kann man noch den Dezimalpunkt deaktivieren, und/oder 
verschieben.

Das Programm und die Config Words sind im Anhang.
Die CWords.h sind die Configuration Words.

Mit freundlichen grüßen
Pascal

von Michael S. (rbs_phoenix)


Lesenswert?

Wenn man jetzt mit 800mV rechnet und deine Einstellung auf rechtsbündig 
beachtet, steht im Lowbyte 64 und im Highbyte 6 (zusammen 1600).

Nach deinem Code also müsste in Temperatur 64 stehen und somit EE 
anzeigen.

Ich vermisse das ANSEL-Register, wobei das ja nach dem Reset alles auf 
Analog stellt. Ich würde außerdem noch das Register WDTCON auf 0 setzen. 
Auf RA0 ist auch noch der Eingang für den Ultra Low-Power Wakeup. Laut 
datenblatt ist es nicjt definiert, ob das Modul an ist oder nicht. 
Sicher ist sicher. Ist es denn möglich, dass du nen anderen PIC oder 
auch einen anderen Input nimmst? Also dass du zum testen z.B. den 
Ausgang für nen Punkt und den ADC-Eingang tauscht? Da könnte man gucken, 
ob der Eingang kaputt ist oder die Config nicht stimmt o.ä.

von Andreas K. (Firma: Trenew Electroic AG) (lehafir)


Lesenswert?

@Michael: den WDTCON hab ich auf 0 gesetzt, passiert nichts.

Ich habe 2 Prints mit der selben betückung und es funktioniert auf 
beiden nicht, mehr habe ich nicht zur Verfügung.
Allerdings kann ich den PIC entfernen ich werde mal eine Versuchsaufbau 
machen.

@Pascal: Ich werde mir das Programm mal anschauen. Danke

von Andreas K. (Firma: Trenew Electroic AG) (lehafir)


Angehängte Dateien:

Lesenswert?

Hallo Leute, gute und seeeeehhhhhr schlechte Nachricht.

Ich habe herausgefunden, dass ich ADRESL in einen float einlesen 
muss(fragt micht nihct wiso). Alles gut und schön, nun nachdem ich mein 
Programm umgeschrieben hab, ging nichts mehr, selbst dann wenn ich eine 
Zahl eingab. Also hab ich mein altes Programm wider geöffnet und habe 
feststellen müssen, dass das auch nicht mehr geht, obwohl ich nichts 
veränder hab. Hier sind die beiden codes, vieleicht findet ihr ja wo der 
Wurm drinn ist, ich kapiers einfach nicht.

PS: PC hab ich auch schon neu gestartet, nützt auch nix.

von Chris B. (dekatz)


Lesenswert?

Also ich finde eigentlich auch nix "grobes" was ein Erklärung wäre.
Sicherheitshalber würde ich mal
1. Debugging abschalten
// CONFIG4L
#pragma config DEBUG = OFF

2. Erweiterten Instruktionssatz der PIC18 abschalten (habe dunkel in 
Erinnerung das es da schon mal Probleme mit einem Compiler gab, weiss 
aber nicht mehr bei welchen)
// CONFIG1L
#pragma config XINST = OFF

btw: #include <pic18f25k80.h> ist unnötig da dies von #include <xc.h> 
erledigt wird - ist aber kaum das Problem......

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
Noch kein Account? Hier anmelden.