Forum: Mikrocontroller und Digitale Elektronik AD Wandler Problem PIC 16F684


von Patrick (Gast)


Lesenswert?

Hallo,

ich habe eine Schaltung aufgebaut mit einem PIC16F684. Diese Schaltung 
soll im Grunde folgendes machen: Analogen Spannungswert einlesen, Wert 
aufarbeiten und als Binärwert wieder ausgeben. Nur wird bei meinem PIC 
am Ausgang immer b'11111' angezeigt. Dieser Wert soll eigentlich 
angezeigt werden wenn die maximale oder die minimale Spannung am Analog 
Pin anliegt. Daher meine Vermutung, dass immer aus dem AD-Wandler 
b'00000000000' ausgelesen wird.

Hier der Code:
1
;***************************************************************************
2
;***** lkw.ASM
3
;***** Wunner Patrick 14.11.2008
4
;***** LKW Hydraulik Motor Steuerung
5
;***************************************************************************
6
7
8
;***************************************************************************
9
;***** PIC intialisieren
10
;***************************************************************************
11
12
#include<P16F684.INC>
13
14
  __CONFIG 0x3fC4
15
16
  List P = 16F684
17
18
19
;***************************************************************************
20
;***** Vektoren vergabe
21
;***************************************************************************
22
23
  org      0x00
24
  goto    start
25
26
  org      0x04
27
  retfie
28
29
30
;***************************************************************************
31
;***** Register definieren
32
;***************************************************************************
33
34
anzahl      equ    0x21
35
vZeit1      equ    0x22
36
vZeit2      equ    0x23
37
vZeit3      equ    0x24
38
ergebnis    equ    0x25
39
rueck_erg    equ    0x26
40
vor_erg      equ    0x27
41
42
43
44
;***************************************************************************
45
;***** Variablen definieren
46
;***************************************************************************
47
48
49
50
;***************************************************************************
51
;***** Tabellen
52
;***************************************************************************
53
54
55
56
57
;***************************************************************************
58
;***** Makros definieren
59
;***************************************************************************
60
61
62
  
63
64
65
66
67
;***************************************************************************
68
;***** Initialisierung
69
;***************************************************************************
70
71
start
72
73
  bsf    STATUS,RP0
74
  movlw  b'01110000'
75
  MOVWF  ADCON1 
76
77
  clrf  TRISC            ; TRISC als Ausgang
78
  movlw  b'00111111'
79
  movwf  TRISA            ; TRISA als Eingang
80
81
  clrf  ANSEL
82
  bsf    ANSEL,0            ; RA0 Analoger Eingang
83
                    ; Ein- und Ausgänge definieren
84
85
  bcf    STATUS,RP0
86
  ;movlw  07h
87
  ;movwf  CMCON0
88
89
  MOVLW   b'10000001'          ; 
90
  MOVWF   ADCON0             ; Vdd Vref, AN0, On
91
92
  call  vZeitschleife        ; zeit abwarten
93
94
  ;clrf  PORTA            ; Register zu beginn löschen
95
  clrf  PORTC
96
  clrf  anzahl
97
98
99
100
101
;***************************************************************************
102
;***** Hauptprogramm
103
;***************************************************************************
104
105
prog
106
107
  call  vZeitschleife        ; zeit abwarten
108
109
  clrf  ergebnis
110
111
  bsf    ADCON0,GO          ; AD-Wandler einschalten
112
  BTFSC   ADCON0,GO           ; Uebertragung zuende?
113
  GOTO   $-1             ; wenn nicht neu testen      ;
114
  MOVFW   ADRESH             ; Lese die höherwertigen Bits
115
  movwf  ergebnis
116
117
118
  rrf    ergebnis          ; ergebnis durch 2 teilen
119
  bcf    ergebnis,7          ; Bit 7 löschen
120
  rrf    ergebnis          ; ergebnis durch 2 teilen
121
  bcf    ergebnis,7          ; Bit 6 löschen
122
123
  btfsc  ergebnis,5          ; Testen ob größer oder kleiner 2,5V
124
  goto  vorwaerts          ; Wenn größer gehe zu vorwärts
125
  
126
127
rueckwaerts
128
129
  movfw  ergebnis
130
  movwf  rueck_erg
131
  comf  rueck_erg,f          ; Komplementiere rueck_erg
132
  movlw  d'32'            ; 32 nach Arbeitsregister
133
  subwf  rueck_erg,f          ; Subtrahiere 32 von rueck_erg
134
  bcf    rueck_erg,7
135
  bcf    rueck_erg,6
136
  bcf    rueck_erg,5
137
138
  movfw  rueck_erg          ; Ergebnis nach PORTC schreiben
139
  movwf  PORTC
140
141
  goto  prog
142
143
vorwaerts
144
  
145
  movfw  ergebnis
146
  movwf  vor_erg
147
  movlw  d'32'            ; 32 nach Arbeitsregister
148
  subwf  vor_erg,f          ; Subtrahiere 32 von rueck_erg
149
150
  movfw  vor_erg            ; Ergebnis nach PORTC schreiben
151
  movwf  PORTC
152
153
  goto  prog
154
155
156
;***************************************************************************
157
;***** Unterprogramme
158
;***************************************************************************
159
160
vZeitschleife
161
162
163
  movlw    d'20'
164
  movwf    vZeit1
165
  movwf    vZeit2
166
167
vschleife1
168
169
  decfsz    vZeit1
170
  goto     vschleife2
171
  return
172
173
vschleife2
174
175
  movwf    vZeit2
176
177
vschleife2_1
178
179
  decfsz    vZeit2
180
  goto     vschleife3
181
  goto    vschleife1
182
183
vschleife3
184
185
  movwf    vZeit3
186
187
vschleife3_1
188
189
  decfsz    vZeit3
190
  goto    vschleife3_1
191
  goto    vschleife2_1
192
193
194
end


Habe ich vll einen Fehler in der Initialisierung? Bin alles schon 10mal 
durchgegangen, finde aber meinen Fehler nicht.

Hoffe es kann mir jemand helfen.

Vielen Dank im Voraus

Patrick

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.