hiho..
hab vor 2 tagen angefangen mich mit pic's zu beschäftigen und wollte das selbe zum adc-test realisieren...
verwendet hab ich einen 16f873 auf einem geäztem testboard...
* porta = adc
* portb = in
* portc = out (8xled)
Code:
; Variablen declaration
wait EQU 0x20 ; 'wait' variable für den ADC
adcvalue EQU 0x21 ; Ergebniss des ADC
chansel EQU 0x22 ; ADC Channel für Unterprogramm getana (0-3 auf TestBoard verfügbar)
; Standard Init des TestBoard PIC16F873
Init
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'11111111' ; PortB alle input
movwf TRISB
movlw B'00000000' ; PortC alle output
movwf TRISC
BCF ADCON1, 7
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
bsf ADCON0,0 ; PORTA als analog-in festlegen
bcf ADCON0,3 ; AN0 einstellen
bcf ADCON0,4 ; "
bcf ADCON0,5 ; "
BSF ADCON0, 7 ; ADC Speed
BCF ADCON0, 6 ; "
clrf PORTC ; alle LEDs ausschalten
; Init ende
;**************************************************************
; Beginn Hauptprogrammschleife
main
btfsc PORTB, 0
call anaout
goto main
; Ende Hauptprogrammschleife
;**************************************************************
; Beginn Unterprogramme
anaout
clrf chansel
nop
btfsc PORTB, 0
bsf chansel, 0
btfsc PORTB, 1
bsf chansel, 1
nop
call getana
movfw adcvalue
movwf PORTC
return
; Ende Unterprogramme
;**************************************************************
;***************************************
;* Standard Funktionen für TestBorad *
;***************************************
goto main ; versehentlichen Aufruf verhindern
; Analog Input
getana ; ADC Vorgang starten
btfsc chansel, 0 ; ADC Channel Auswahl - bit3
bsf ADCON0, 3
btfss chansel, 0
bcf ADCON0, 3
btfsc chansel, 1 ; bit4
bsf ADCON0, 4
btfss chansel, 1
bcf ADCON0, 4
btfsc chansel, 2 ; bit5
bsf ADCON0, 5
btfss chansel, 3
bcf ADCON0, 5
nop ; 1Takt Pause
bsf ADCON0, 2 ; ADC starten
adcloop
btfsc ADCON0, 2 ; ist der ADC fertig?
goto adcloop ; nein, weiter warten
movfw ADRESH ; obere 8 Bit des alanogwertes ins arbeitsverzeichnis
movwf adcvalue ; Ergebniss zwischenspeichern
clrf wait ; Warten, damit der ADC sich erholen kann
adcwarten
decfsz wait, f
goto adcwarten
return
end
in chansel (0x22) lege ich den abzufragenden ad kanal fest und speichere das ergebniss (8bit) in adcvalue..
erstmal sry für meinen ghetto-code bin leider selbst anfänger, aber ich hoffe er hat dir geholfen
Lesezeichen