kautz
31.12.2005, 18:39
Hallo,
Ich möchte mal den AD-Eingang testen, aber irgendwie klappt das nicht. Mein Code:
title "Programm um den ADC-wandler zu benutzen"
processor 18F458
include <P18F458.I18> ;Datei muss sich im selben Ordner befinden
;Konfiguration für den µC einstellen
__CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
__CONFIG _CONFIG2L, _BOR_ON_2L & _PWRT_ON_2L & _BORV_27_2L
__CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
__CONFIG _CONFIG3H, _CCP2MX_ON_3H
__CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H
;############## Reset ################
org 0x0000
goto __Resolve_INTERRUPT
;############## interrupt ################
org 0x0008
goto __Resolve_INTERRUPT
;############## main ################
org 0x0020
__Resolve_INTERRUPT
Init
movlb 1 ;zur Bank 1 wechseln
bcf INTCON2,7 ;Pull-up Widerstände einschalten
movlw B'11111111' ; das Wort ins Akku laden
movwf TRISA ;PortB als Eingang benutzen
movlw B'00000000'
movwf TRISC ;PortC als Ausgang
movlw B'00000000'
movwf TRISD ;PortD als Ausgang
movlw B'00000000'
movwf TRISB ;PortD als Ausgang
clrf PORTC ;PORTB loeschen
; Timer1 interrupt checken
movlb 0
btfss PIE1, TMR1IE
btfsc PIR1, TMR1IF
Start
; Perform AD Conversion on Channel AN2
;---------------------------------------
bsf ADCON0, 0
bcf ADCON0, CHS2 ; Select AN2
bsf ADCON0, CHS1
bcf ADCON0, CHS0
movlb 1
bsf ADCON1, PCFG3 ;Vref einstellen 1001
bcf ADCON1, PCFG2 ;analog-input einstellen
bcf ADCON1, PCFG1
bsf ADCON1, PCFG0
bcf ADCON1,ADCS2
movlb 0
bsf ADCON0, ADCS1 ;internen Takt einstellen
bsf ADCON0, ADCS0
bcf ADCON0, CHS2
bcf PORTB,3
;----------------------------------delay---------------------------------------------
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
;-------------------------------------------------------------------------------------
bsf ADCON0, GO_DONE ; Start Conversion
btfsc ADCON0, GO_DONE ; Wait conversion END
movlw ADRESL
movwf PORTC
bsf PORTB,3
movlw ADRESH
movwf PORTD
goto Start
end
Desweiteren frag ich mich immer wozu die Bänke sind. Im Datenblatt steht irgendwie was von Speicheraufteilung, aber wann weiss ich ob ich zur anderen Bank wechseln muss?
In meinem Code habe ich ADCON1 und ADCON0 auf Bank1 bzw. Bank0, das habe ich in einem Beispiel so gesehen. Ist das richtig?
Vielen Dank im Vorraus!!!
Ich möchte mal den AD-Eingang testen, aber irgendwie klappt das nicht. Mein Code:
title "Programm um den ADC-wandler zu benutzen"
processor 18F458
include <P18F458.I18> ;Datei muss sich im selben Ordner befinden
;Konfiguration für den µC einstellen
__CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
__CONFIG _CONFIG2L, _BOR_ON_2L & _PWRT_ON_2L & _BORV_27_2L
__CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
__CONFIG _CONFIG3H, _CCP2MX_ON_3H
__CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H
;############## Reset ################
org 0x0000
goto __Resolve_INTERRUPT
;############## interrupt ################
org 0x0008
goto __Resolve_INTERRUPT
;############## main ################
org 0x0020
__Resolve_INTERRUPT
Init
movlb 1 ;zur Bank 1 wechseln
bcf INTCON2,7 ;Pull-up Widerstände einschalten
movlw B'11111111' ; das Wort ins Akku laden
movwf TRISA ;PortB als Eingang benutzen
movlw B'00000000'
movwf TRISC ;PortC als Ausgang
movlw B'00000000'
movwf TRISD ;PortD als Ausgang
movlw B'00000000'
movwf TRISB ;PortD als Ausgang
clrf PORTC ;PORTB loeschen
; Timer1 interrupt checken
movlb 0
btfss PIE1, TMR1IE
btfsc PIR1, TMR1IF
Start
; Perform AD Conversion on Channel AN2
;---------------------------------------
bsf ADCON0, 0
bcf ADCON0, CHS2 ; Select AN2
bsf ADCON0, CHS1
bcf ADCON0, CHS0
movlb 1
bsf ADCON1, PCFG3 ;Vref einstellen 1001
bcf ADCON1, PCFG2 ;analog-input einstellen
bcf ADCON1, PCFG1
bsf ADCON1, PCFG0
bcf ADCON1,ADCS2
movlb 0
bsf ADCON0, ADCS1 ;internen Takt einstellen
bsf ADCON0, ADCS0
bcf ADCON0, CHS2
bcf PORTB,3
;----------------------------------delay---------------------------------------------
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
bra $ + D'2'
;-------------------------------------------------------------------------------------
bsf ADCON0, GO_DONE ; Start Conversion
btfsc ADCON0, GO_DONE ; Wait conversion END
movlw ADRESL
movwf PORTC
bsf PORTB,3
movlw ADRESH
movwf PORTD
goto Start
end
Desweiteren frag ich mich immer wozu die Bänke sind. Im Datenblatt steht irgendwie was von Speicheraufteilung, aber wann weiss ich ob ich zur anderen Bank wechseln muss?
In meinem Code habe ich ADCON1 und ADCON0 auf Bank1 bzw. Bank0, das habe ich in einem Beispiel so gesehen. Ist das richtig?
Vielen Dank im Vorraus!!!