PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei ADC Auswertung



CorsabMatrix
09.09.2007, 18:46
Hallo,
brauche dringend Hilfe bei einer ADC Auswertung beim PIC12F675.
Das Programm ist für Ein Trennrelais zu schalten, wenn man im Auto 2 Batterien Betreiben will.
Die Zweite Batterie Zoll zugeschaltet werden, wenn die Spannung am ADC über 1,38Volt steigt.
Zuerst wird Die Spannung am ADC abgefragt, dann wird geschaut ob das Register „ADRESH“
Größer 0x46 (1,38Volt ) , dann gegebenen Falls das Relais eingeschaltet/ausgeschaltet und Dann noch etwas gewartet.
Mein Problem ist, das im Register ADRESH kein Wert steht (oder Falscher Wert),
wo dran kann das Liegen?



;************************************************* ***********************************************
; File: TrennRelai.asm
; Vom 1.9.2007
; Vers. 1.0

;************************************************* ***********************************************
list p=12F675
#include P12F675.INC
; 4 MHZ Interner Tackt
;************************************************* ******************************
; Watch_Dog_Timer OFF, Interner Ozzilator an, MasterClear auf pin 4 Aktiv, usw.
__config _INTRC_OSC_NOCLKOUT & _WDT_OFF &_MCLRE_OFF & _CP_OFF
;************************************************* ******************************
;Define GP5 als Piepser
#define Starthilfe GPIO,0 ;IN ;ist derzeit noch abgeschaltet
#define Reali GPIO,1 ;OUT
#define LED GPIO,2 ;OUT
#define ADCIN GPIO,5 ;IN ADC
;************************************************* ******************************
;EQU
Zeit1 equ H'0020'
Zeit2 equ H'0021'
Zeit3 equ H'0022'
ADCWERT equ H'0023'


;************************************************* ******************************
; Option Register
bsf STATUS,RP0
movlw 0x00
movwf OPTION_REG
bcf STATUS,RP0
;************************************************* ******************************
;I/O
bsf STATUS,RP0
movlw b'010001'
movwf TRISIO
bcf STATUS,RP0
clrf GPIO ;Ausgang löschen
;************************************************* ******************************
;CMCON
bcf STATUS,RP0
movlw 0x07
movwf CMCON
;************************************************* ******************************
;******************************Setzen der Register ANSEL und ADCON
;ADCON
bcf STATUS,RP0

BCF ADCON0, 0 ;ADC aus


BSF ADCON0, 2 ;AN3 (GP4 Pin3)
BSF ADCON0, 3

BCF ADCON0, 6 ;Voltage Reference bit VDD=0

BCF ADCON0, 7 ;A/D Result Formed Select bit, Daten linksbündig

;************************************************* ******************************
;ANSEL
bsf STATUS,RP0

BCF ANSEL, 0 ;AN3 ein
BCF ANSEL, 1
BCF ANSEL, 4
BSF ANSEL, 3

BSF ANSEL, 4 ;ADC Arbeitstackt festlegen (Bei 4 MHZ), 16 TOSC, ADCS2:ADCS0 101 (FOSC/16)
BCF ANSEL, 5
BSF ANSEL, 6
bcf STATUS,RP0

;************************************************* ******************************
;Programm Start
start
call ADC
call Relai
call mainloop
goto start

;************************************************* ******************************
;********************************************Subro utinen*************************
ADC ;ADC Auswertung,wert in Register "ADRESH" und "ADRESL" gespeichert wird.
BSF ADCON0, 1 ; ADC starten
loop6
BTFSC ADCON0, 1 ; ist der ADC fertig?
GOTO loop6 ; nein, weiter warten
;OK ADC IST Fertig
return
;************************************************* ***********************************************
Relai ;Reali ein ?
;Das Relai einschalten bei einer spannung größer als 13,8V (ADC (Register ADRESH) größer als 0x46)

;2^10bit=1024, Uref 5V, 5V/1024=0,0048828125 Volt Pro Schritt,
;Spannungsvorteiler 1/10 bei 13,8V sind am ADC 1,38V, 13,8V/0,0048828125=282,624 (282)
;Relai Einschalten wenn Wert über 282, b'100011010' ==(8Bit ADRESH 1000110 (0x46))

MOVF ADRESH,0 ;Kopiere ADRESH nach ADCWERT
movwf ADCWERT

;Ziehe von ADCWERT 0x46 ab. Ist jetzt ein Unterlauf eingetreten war die Spannung unter 13,8V

movlw 0x46
subwf ADCWERT,1
btfss STATUS,C ;Carry unterlauf 0?
return

BSF Reali
return
;************************************************* ***********************************************
;Zeitschleife Groß, mehrere Minuten
mainloop
bsf LED ;LED Ein
movlw 0xff
movwf Zeit3
LK movlw 0xff
movwf Zeit2
LX movlw 0xff ;Zählerstand von dem Runter gezählt wird.
movwf Zeit1
schleife
clrwdt
decfsz Zeit1
goto schleife
clrwdt
decfsz Zeit2
goto LX
clrwdt
decfsz Zeit3
Goto LK
bcf LED ;LED Aus
return

end

CorsabMatrix
09.09.2007, 20:11
Hat sich erledigt, habe vergessen im ADCON register den ADC einzuschalten.