Vous êtes sur la page 1sur 6

;

***********************************************************************************
*********
;This software is provided in an AS IS condition,NO WARRANTIES in any form apply
to this software.
;You can use/modify provided schematics and code without any limitations.

; picmicrolab.com 4.1.2014
;
***********************************************************************************
*********
;PIC16F877A Solar Tracking System
;
;----------------------------------------------------------------------------------
-

LIST P=PIC16F877A
include P16f877A.inc

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _LVP_OFF &
_DEBUG_OFF & _CPD_OFF

;
lcount equ 0x2B
ncount equ 0x2C
mcount equ 0x2D
SensorUP equ 0x20
SensorDown equ 0x21
SensorClock equ 0x22
SensorCounterClock equ 0x23

org 0x00
reset:
goto start
org 0x04

start:

bcf STATUS, RP0


bcf STATUS, RP1 ;-------> Bank 0
clrf PORTC
clrf PORTD
clrf PORTA
bsf STATUS, RP0 ; -------> Babk 1
movlw 0x02
movwf ADCON1 ; all A analog; E digital
; format : 6 lower bit of ADRESL =0
clrf TRISD ;PortD output
clrf TRISC ;PortC output
movlw 0xFF
movwf TRISA ;PortA input
bcf STATUS,RP0 ;-------> Bank 0
bcf INTCON,GIE ;disable interrupts
movlw 0x81;0x89
movwf ADCON0 ;Fosc/32; channel_0; ADC on ; Channel 0 - StepUP ;Channel 1 - StepDown
;Channel 2 - StepClock ;Channel 3 - StepCounterClock ;
;call StepUP
;call StepDown

next:
;------------------------------------------------
movlw 0x81
movwf ADCON0;Channel_0
call ADC
movwf SensorUP

movlw 0x89
movwf ADCON0;Channel_1
call ADC
movwf SensorDown
subwf SensorUP,W

btfsc STATUS,C
call StepUP

btfss STATUS,C
call StepDown
;----------------------------------Uncomment to enable Counter/ClockWise
Rotation---------------------------------
; In current hardware version rotating stepper is too weak and doesn't have
enough power
; to correctly rotate the platform "it's too heavy"
;----------------------------------------------------------------------------------
---------------------------------------
;movlw 0x91
;movwf ADCON0;Channel_2
;call ADC
;movwf SensorClock

;movlw 0x99
;movwf ADCON0;Channel_3
;call ADC
;movwf SensorCounterClock

;subwf SensorClock,W

;btfsc STATUS,C
;call RotateClock

;btfss STATUS,C
;call RotateCounterClock

;----------------------------------------------------------------------------------
----------------------------------------

goto next

ADC:

call d_20 ;Delay TACQ


loop: bsf ADCON0,GO ;start conversion
waitc: btfsc ADCON0,GO ;wait end of conversion
goto waitc
call d_4
movf ADRESH,W
movwf PORTD
return

d_20:
movlw 0x20
movwf 0x22
loop1: decfsz 0x22,1
goto loop1
return

d_4:
movlw 0x06
movwf 0x22
loop2: decfsz 0x22,1
goto loop2
return

;---------------------------------------------------------------

StepUP:
movlw 0x01
movwf PORTC
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

movlw 0x02
movwf PORTC
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

movlw 0x04
movwf PORTC
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

movlw 0x08
movwf PORTC
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

;goto again
return
;----------------------------------------------------------------------------------
-

StepDown:
movlw 0x08
movwf PORTC
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

movlw 0x04
movwf PORTC
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

movlw 0x02
movwf PORTC
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

movlw 0x01
movwf PORTC
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

;goto again
return
;----------------------------------------------------------------------------------
-

RotateClock:

bcf PORTC,0X04
bsf PORTC,0X07

call pause ; delay 200ms


call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

bcf PORTC,0X07
bsf PORTC,0X06
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

bcf PORTC,0X06
bsf PORTC,0X05
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

bcf PORTC,0X05
bsf PORTC,0X04
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

;goto again
return
;----------------------------------------------------------------------------------
-

RotateCounterClock:
;movlw 0x80;0x90
bcf PORTC,0X07
bsf PORTC,0X04

call pause ; delay 200ms


call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

bcf PORTC,0X04
bsf PORTC,0X05

call pause ; delay 200ms


call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

bcf PORTC,0X05
bsf PORTC,0X06
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
bcf PORTC,0X06
bsf PORTC,0X07
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms
call pause ; delay 200ms

;goto again
return
;----------------------------------------------------------------------------------
--

pause: movlw 0x02


movwf lcount
loop3 movlw 0x40
;movlw 0x0f
movwf mcount
loop2a movlw 0xf0
movwf ncount
loop1a decfsz ncount,1
goto loop1a
decfsz mcount,1
goto loop2a
decfsz lcount,1
goto loop3

return
;next: goto next

;---------------------------------------------------------------

end

Vous aimerez peut-être aussi