AD Wandler Problem PIC 16F684

Gast #1204950
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren