avr_racer
02.02.2016, 18:48
Hallo Bastler,
im Anhang die Ansteuerung eines MCP41HVx-Potis. Warum dieses ?? Vorteil ist, es kann mit +-18V oder 0 - 36V an den Potipins betrieben werden und ist damit recht gut geeignet um zum Beispiel als Feedback bei einem LM2596ADJ zu dienen. nen ganz kleinen Hacken gibts... leider nur in SSOP14 erhältlich. Aber auch hier gibs schon Lösungen im Netz in dem man sich Adapterplatinen kauft. Fürn schmalen Taler gibs da 12 Stück für unter 5€. Ruhige Hand vorrausgesetzt.. ;)
Auch hier habe ich versucht darauf zu achten, dass die Plattform nicht nur an einen µC gebunden ist.
Als erstes wieder den "ausgeblendeten" Kopf in die Init kopieren und an eigene Bedürfnisse anpassen.
!!!! MCP_xyz2 brauch nicht genutzt zu werden falls alles an einen Port passt.
Sonst anpassen in
MCP41HVX_wlat
MCP41HVX_shdn_off
MCP41HVX_shdn_on.
Achsooo auf einen ReadCommand hab ich verzichtet da die Rückmeldung, wenn alles korrekt übersand worden ist, immer ein $FF zurück kommt siehe Datenblatt TABLE 7-2. Dachte mir das man vllt damit die aktuelle Wiperstellung auslesen kann aber irgendwie war ich da auf dem Holzweg.
http://pdf1.alldatasheet.com/datasheet-pdf/view/514774/MICROCHIP/MCP41HVX1.html
/*
;*********************MCP41HVX
.equ MCP41_ddr = ddrb
.equ MCP41_port = portb
.equ MCP41_pin = pinb
.equ MCP41_ddr2 = ddrd
.equ MCP41_port2 = portd
.equ MCP41_pin2 = pind
.equ CS1 = 0 ;0 = Chip aktiv ; 1 = Chip deaktiviert
.equ MOSI = 3 ; Master out (TX)
.equ MISO = 4 ; Master in (RX)
.equ SCK = 5 ; Taktgenerierung
.equ WLAT = 6 ;0 = übernahme aktiv ; 1 = ****
.equ SHDN = 7 ;0 = shdn aktiviert ; 1 = shdn deaktiviert
;Commands
.equ incwip = 4 ;(8bits)
.equ decwip = 8 ;(8bits)
.equ writeD = 0 ;(16bits)
.equ readD = 12 ;(16bits)
.equ CMD_Wiper = 00
.equ CMD_TCON = 04
;.equ RESERVED = 01-03
;.equ RESERVED = 05-15
*/
;*********************PortInit für MCP41HVX
MCP41HVX_Init:
in temp0,MCP41_ddr2
ori temp0,(1<<WLAT|1<<SHDN)
out MCP41_ddr2,temp0 ;Konfig DDR
in temp0,MCP41_port2
ori temp0,(0<<WLAT|1<<SHDN) ;Konfig WLAT = 0 = Ständige Datenübernahme
out MCP41_port2,temp0 ;Konfig SHDN = 1 = CHIP an
in temp0,MCP41_ddr
ori temp0,(1<<CS1|1<<MOSI|0<<MISO|1<<SCK) ;Konfig DDR
out MCP41_ddr,temp0
in temp0,MCP41_port ;CS = 1 nicht angewählt
ori temp0,(1<<CS1|0<<MOSI|1<<MISO|1<<SCK) ;MOSI = 0 Pegel egal
out MCP41_port,temp0 ;MISO = 1 Pullup aktiv da Eingang
clr xl
rcall MCP41_wip_change
ret
;****************CHANGE WIPE with inc/dec(8Bit) or with 16Bit*****************
;Wiper +
MCP41_incwip:
rcall MCP41HVX_cs_off ;chip abwählen
ldi xl,incwip ;incWert laden +
ldi cnt,$08 ;Counter auf 8 setzen
rcall send_Data_MCP41 ;Byte senden
rcall MCP41HVX_cs_on ;chip anwählen
ret
;Wiper -
MCP41_decwip:
rcall MCP41HVX_cs_off ;chip abwählen
ldi xl,decwip ;decWert laden -
ldi cnt,$08 ;Counter 8 setzen
rcall send_Data_MCP41 ;BYte senden
rcall MCP41HVX_cs_on ;chip anwählen
ret
;16Bit Word, XH = Adress XL = Data
MCP41_wip_change:
rcall MCP41HVX_cs_off ;chip anwählen
ldi xh,CMD_Wiper ;WiperCMD laden ($00) da nur ein Poti
ldi cnt,$10 ;Counter mit 16($10)
rcall send_Data_MCP41_16 ;Word senden
rcall MCP41HVX_cs_on ;chip anwählen
ret
;******************DATA_SEND********************** ***
;Send-8bit
Send_Data_MCP41:
sbrc xl,7 ;Bit 7 = 1?
sbi MCP41_port,MOSI
sbrs xl,7 ;Bit 7 = 0?
cbi MCP41_port,MOSI
rcall MCP41HVX_SCK ;clocken
lsl xl ;links shiften <<<<<
dec cnt ;-1
brne Send_Data_MCP41 ;jmp Label
ret
;SEND-16bit
Send_Data_MCP41_16:
sbrc xh,7 ;Bit 7 = 1 ?
sbi MCP41_port,MOSI
sbrs xh,7 ;Bit 7 = 0 ?
cbi MCP41_port,MOSI
rcall MCP41HVX_SCK ;clocken
lsl xl ;links shiften <<<<<
rol xh ;links rotieren
dec cnt ; 16x -1
cpi cnt,$00
brne Send_Data_MCP41_16 ;jmp Label
ret
;*************************MCP41_UProgs
;MODE 1,1 = SCK = 1 u CS = 1 = Startbedingungen
;MODE 0,0 = SCK = 0 u CS = 1 = Startbedingungen
MCP41HVX_SCK: ;Clock generieren
cbi MCP41_port,SCK
nop
nop
nop
sbi MCP41_port,SCK
ret
MCP41HVX_wlat: ;Wlat ist zuständig um idealerweise im Nulldurchgang neuen Potiwert zu laden externe Schaltung zur ZeroCrossDetection notwendig
cbi MCP41_port2,wlat ;off
nop
nop
nop
nop
sbi MCP41_port2,wlat ;on
ret
MCP41HVX_shdn_off: ;SHDN wird mit 1 deaktiviert
sbi MCP41_port2,shdn ;off
ret
MCP41HVX_shdn_on: ;SHDN wird mit 0 aktiviert
cbi MCP41_port2,shdn ;on
ret
;MODE 1,1
MCP41HVX_cs_off: ;ChipSelect = 0 = Chip select
cbi MCP41_port,CS1
ret
MCP41HVX_cs_on: ;ChipSelect = 1 = Chip not select
sbi MCP41_port,CS1
ret
im Anhang die Ansteuerung eines MCP41HVx-Potis. Warum dieses ?? Vorteil ist, es kann mit +-18V oder 0 - 36V an den Potipins betrieben werden und ist damit recht gut geeignet um zum Beispiel als Feedback bei einem LM2596ADJ zu dienen. nen ganz kleinen Hacken gibts... leider nur in SSOP14 erhältlich. Aber auch hier gibs schon Lösungen im Netz in dem man sich Adapterplatinen kauft. Fürn schmalen Taler gibs da 12 Stück für unter 5€. Ruhige Hand vorrausgesetzt.. ;)
Auch hier habe ich versucht darauf zu achten, dass die Plattform nicht nur an einen µC gebunden ist.
Als erstes wieder den "ausgeblendeten" Kopf in die Init kopieren und an eigene Bedürfnisse anpassen.
!!!! MCP_xyz2 brauch nicht genutzt zu werden falls alles an einen Port passt.
Sonst anpassen in
MCP41HVX_wlat
MCP41HVX_shdn_off
MCP41HVX_shdn_on.
Achsooo auf einen ReadCommand hab ich verzichtet da die Rückmeldung, wenn alles korrekt übersand worden ist, immer ein $FF zurück kommt siehe Datenblatt TABLE 7-2. Dachte mir das man vllt damit die aktuelle Wiperstellung auslesen kann aber irgendwie war ich da auf dem Holzweg.
http://pdf1.alldatasheet.com/datasheet-pdf/view/514774/MICROCHIP/MCP41HVX1.html
/*
;*********************MCP41HVX
.equ MCP41_ddr = ddrb
.equ MCP41_port = portb
.equ MCP41_pin = pinb
.equ MCP41_ddr2 = ddrd
.equ MCP41_port2 = portd
.equ MCP41_pin2 = pind
.equ CS1 = 0 ;0 = Chip aktiv ; 1 = Chip deaktiviert
.equ MOSI = 3 ; Master out (TX)
.equ MISO = 4 ; Master in (RX)
.equ SCK = 5 ; Taktgenerierung
.equ WLAT = 6 ;0 = übernahme aktiv ; 1 = ****
.equ SHDN = 7 ;0 = shdn aktiviert ; 1 = shdn deaktiviert
;Commands
.equ incwip = 4 ;(8bits)
.equ decwip = 8 ;(8bits)
.equ writeD = 0 ;(16bits)
.equ readD = 12 ;(16bits)
.equ CMD_Wiper = 00
.equ CMD_TCON = 04
;.equ RESERVED = 01-03
;.equ RESERVED = 05-15
*/
;*********************PortInit für MCP41HVX
MCP41HVX_Init:
in temp0,MCP41_ddr2
ori temp0,(1<<WLAT|1<<SHDN)
out MCP41_ddr2,temp0 ;Konfig DDR
in temp0,MCP41_port2
ori temp0,(0<<WLAT|1<<SHDN) ;Konfig WLAT = 0 = Ständige Datenübernahme
out MCP41_port2,temp0 ;Konfig SHDN = 1 = CHIP an
in temp0,MCP41_ddr
ori temp0,(1<<CS1|1<<MOSI|0<<MISO|1<<SCK) ;Konfig DDR
out MCP41_ddr,temp0
in temp0,MCP41_port ;CS = 1 nicht angewählt
ori temp0,(1<<CS1|0<<MOSI|1<<MISO|1<<SCK) ;MOSI = 0 Pegel egal
out MCP41_port,temp0 ;MISO = 1 Pullup aktiv da Eingang
clr xl
rcall MCP41_wip_change
ret
;****************CHANGE WIPE with inc/dec(8Bit) or with 16Bit*****************
;Wiper +
MCP41_incwip:
rcall MCP41HVX_cs_off ;chip abwählen
ldi xl,incwip ;incWert laden +
ldi cnt,$08 ;Counter auf 8 setzen
rcall send_Data_MCP41 ;Byte senden
rcall MCP41HVX_cs_on ;chip anwählen
ret
;Wiper -
MCP41_decwip:
rcall MCP41HVX_cs_off ;chip abwählen
ldi xl,decwip ;decWert laden -
ldi cnt,$08 ;Counter 8 setzen
rcall send_Data_MCP41 ;BYte senden
rcall MCP41HVX_cs_on ;chip anwählen
ret
;16Bit Word, XH = Adress XL = Data
MCP41_wip_change:
rcall MCP41HVX_cs_off ;chip anwählen
ldi xh,CMD_Wiper ;WiperCMD laden ($00) da nur ein Poti
ldi cnt,$10 ;Counter mit 16($10)
rcall send_Data_MCP41_16 ;Word senden
rcall MCP41HVX_cs_on ;chip anwählen
ret
;******************DATA_SEND********************** ***
;Send-8bit
Send_Data_MCP41:
sbrc xl,7 ;Bit 7 = 1?
sbi MCP41_port,MOSI
sbrs xl,7 ;Bit 7 = 0?
cbi MCP41_port,MOSI
rcall MCP41HVX_SCK ;clocken
lsl xl ;links shiften <<<<<
dec cnt ;-1
brne Send_Data_MCP41 ;jmp Label
ret
;SEND-16bit
Send_Data_MCP41_16:
sbrc xh,7 ;Bit 7 = 1 ?
sbi MCP41_port,MOSI
sbrs xh,7 ;Bit 7 = 0 ?
cbi MCP41_port,MOSI
rcall MCP41HVX_SCK ;clocken
lsl xl ;links shiften <<<<<
rol xh ;links rotieren
dec cnt ; 16x -1
cpi cnt,$00
brne Send_Data_MCP41_16 ;jmp Label
ret
;*************************MCP41_UProgs
;MODE 1,1 = SCK = 1 u CS = 1 = Startbedingungen
;MODE 0,0 = SCK = 0 u CS = 1 = Startbedingungen
MCP41HVX_SCK: ;Clock generieren
cbi MCP41_port,SCK
nop
nop
nop
sbi MCP41_port,SCK
ret
MCP41HVX_wlat: ;Wlat ist zuständig um idealerweise im Nulldurchgang neuen Potiwert zu laden externe Schaltung zur ZeroCrossDetection notwendig
cbi MCP41_port2,wlat ;off
nop
nop
nop
nop
sbi MCP41_port2,wlat ;on
ret
MCP41HVX_shdn_off: ;SHDN wird mit 1 deaktiviert
sbi MCP41_port2,shdn ;off
ret
MCP41HVX_shdn_on: ;SHDN wird mit 0 aktiviert
cbi MCP41_port2,shdn ;on
ret
;MODE 1,1
MCP41HVX_cs_off: ;ChipSelect = 0 = Chip select
cbi MCP41_port,CS1
ret
MCP41HVX_cs_on: ;ChipSelect = 1 = Chip not select
sbi MCP41_port,CS1
ret