Hallo,
ich bin mit einem Freund kürzlich in die Mikrocontrollerprogrammierung
eingestiegen, d.h. wir sind noch ziemlich frisch auf diesem Gebiet...
Beim Verwenden des AD-Konverters am PIC12F675 stehen wir jedoch vor
einem Messproblem.
Am Analogeingang hängt zur Zeit ein Spannungsteiler, der konstante 2,5V
auf den PIN legt. Die Referenzspannung soll der ADC vom Vdd (5V) holen.
Das Programm sieht so aus:
1 | #define __12f675
|
2 | #include"pic/pic12f675.h"
|
3 |
|
4 | typedef unsigned int config;
|
5 | config at 0x2007 __CONFIG = _CP_OFF &
|
6 | _WDT_OFF &
|
7 | _BODEN_OFF &
|
8 | _PWRTE_OFF &
|
9 | _INTRC_OSC_CLKOUT &
|
10 | _MCLRE_OFF;
|
11 |
|
12 | int Zeichen;
|
13 |
|
14 | /* Schnipp */
|
15 |
|
16 | void main(void) {
|
17 | CMCON = 0x07; // 0000 0111
|
18 | TRISIO = 0x09; // 0000 1001
|
19 | GPIO = 0x00; // 0000 0000
|
20 |
|
21 | ADCON0 = 0x01; // 0000 0001
|
22 | ANSEL = 0xF1; // 1111 0001
|
23 |
|
24 | Zeichen = 0;
|
25 | while (1)
|
26 | {
|
27 | langsamAlles();
|
28 |
|
29 | ADCON0 = 0x03; // 0000 0011
|
30 | sende();
|
31 |
|
32 | while (ADCON0 == 0x03) {
|
33 | _asm
|
34 | nop
|
35 | _endasm;
|
36 | }
|
37 |
|
38 | Zeichen=ADRESH;
|
39 | }
|
40 | }
|
Der ADC soll also einen Wert holen, der anschließend über die serielle
Schnittstelle in den Computer gelangt. Von den 10-Bit werden nur die 8
höhsten Stellen verwendet. langsamAlles() bewirkt eine Verzögerung von
etwa 104 µs, sende() übertragt das Zeichen über einen digitalen Ausgang.
Problem
Die Werte liegen zwar bei etwa 128, schwanken jedoch sehr stark, d.h.
einen brauchbaren Wert erhalten wir erst indem wir den Median von 100
Werten verwenden, was natürlich sehr viel Zeit kostet. Geht es nicht
genauer/schneller?
Ist es ein Denkfehler nur die ersten 8-Bits zu verwenden? Im Prinzip
wollen wir nur die Übertragung vereinfachen und "Kommastellen"
abschneiden ;-)
Wir sagen schonmal Danke für die Antworten!
PS: Auf diesem Weg auch ein herzliches Dankeschön an dieses Forum :-)
Das hat das Lösen von Anfängerfehlern sehr erleichtert!