;*******************************************************************************************
;   Beschreibung:    Eine Vorlage fьr den PIC16F876A											       *
;                    																							 *
;																														 *
;																														 *
;*******************************************************************************************
;                                                                                          *
;    Dateiname:	 	Vorlage.asm						                                           *
;    Datum:        	01.08.2008                                                            *
;    Version: 			V1.0                                                                  *
;                                                                                          *
;    Autor:       	Michael Hofmann                                                       *
;    Internet:      	www.edmh.de                                                           *
;    e-mail:			info@edmh.de                                                          *
;                                                                                          *
;*******************************************************************************************
;    Bemerkungen:                                                                          *
;    										                         	                               *
;                                                                                          *
;*******************************************************************************************


	list      p=16f876            ; definiert den verwendeten Prozessor
	#include <p16f876.inc>        ; in diesem File stehen die Adressen und Bitnamen
	
__CONFIG    03F71H	;__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _XT_OSC & _WRT_OFF & _LVP_OFF & _DEBUG_ON & _CPD_OFF 
	; Mit '__CONFIG' werden die Configurationsbits gesetzt, z.B. Watchdog an/aus, Debugmodus

;===========================
;  VARIABLEN
#define E_0             bcf PORTB,7    ; назначаем вывод команды E для LCD
#define E_1             bsf PORTB,7    ; назначаем вывод команды E для LCD
#define RS_0            bcf PORTB,6    ; назначаем вывод команды RS для LCD
#define RS_1            bsf PORTB,6    ; назначаем вывод команды RS для LCD
#define D_0             bcf PORTB,6    ; назначаем вывод команды Data для 74HC164
#define D_1             bsf PORTB,6    ; назначаем вывод команды Data для 74HC164
#define C_0             bcf PORTB,5    ; назначаем вывод команды Clk для 74HC164
#define C_1             bsf PORTB,5    ; назначаем вывод команды Clk для 74HC164       
#define DALLAS PORTB,0                  ; шина связи с ДАЛЛАСОМ
        
;===========================
COUNT           EQU 0x20     
Mem             EQU 0x21     
Reg_tmp1        EQU 0x22
Reg_tmp2        EQU 0x23
Reg_tmp3        EQU 0x24
T_L             EQU 0x25
T_H             EQU 0x26
TEMP1           EQU 0x27      
KOM             EQU 0x28
BUF_BX          EQU 0x29 
w_temp        	EQU	0x70        ; werden fьr Interrupts verwendet, um den Status vor 
status_temp   	EQU	0x71        ; der Interruptroutine zu sichern

;===========================
;  MACROS
;===========================
_BANK_0 macro			; wдhlt die Register von Bank 0 aus
	bcf STATUS,RP0
	bcf STATUS,RP1
	endm

_BANK_1 macro			; wдhlt die Register von Bank 1 aus
	bsf STATUS,RP0
	bcf STATUS,RP1
	endm

_BANK_2 macro			; wдhlt die Register von Bank 2 aus
	bcf STATUS,RP0
	bsf STATUS,RP1
	endm

_BANK_3 macro			; wдhlt die Register von Bank 3 aus
	bsf STATUS,RP0
	bsf STATUS,RP1
	endm

;================================================================================


;__________________________________________________________________________________________

		ORG     0x000				; Adresse, an die nach einem Reset gesprungen wird
		clrf    PCLATH          ; Rьcksetzen der Page-Bits
  		goto    start           ; Springe zum Programmanfang

		ORG     0x004           ; Adresse, an die nach einem Interrupt gesprungen wird
		movwf	w_temp          ; Sichere den Inhalt des W-Registers
		movf    STATUS,w        ; Verschiebe STATUS-Register ins W-Register
		movwf	status_temp     ; Sichere den Inhalt des STATUS-Registers
    	movwf	STATUS           
		swapf   w_temp,f
		swapf   w_temp,w          
		retfie                  
;__________________________________________________________________________________________

start
;===============================    	; Начало программы
; ИНИЦИАЛИЗАЦИЯ Контроллера
;===============================
_BANK_0
clrf PORTA			                    ;Ощищаем порты микроконтроллера
clrf PORTB
clrf PORTC
_BANK_1
movlw b'10000101'                       ;RA0,RA1-аналоговые входы RA3-вход опорного напряжения
movwf ADCON1                            ;выравнивать результат по правому краю
movlw b'11111111'                       ;PORTA-настроить на вход
movwf TRISA                             ;Включаем предделитель перед WDT,отключаем подтягивающие
movlw b'10001101'                       ;резисторы
movwf OPTION_REG                        ;
movlw b'00001010'                       ;RB7-RB4,RB2-выхода RB3,RB1,RB0-входа
movwf TRISB
movlw b'11111101'                       ;PORTC-насторить на вход
movwf TRISC                             ;
movlw b'00000000'                                        ;глобальный запрет всех прерываний
movwf INTCON                            ;перефирийные прерывания запрещены
movlw b'00000000'
movwf PIE1
_BANK_0                                 ;инициализировать АЦП,канал АЦП-AN0,
movlw b'01000000'                       ;Fosk/8-тактовая частота 5 МГц
movwf ADCON0                            ;
clrwdt                                 ;очистить сторожевой таймер
;===================================

;===========================================================================================================================================================================
;======= ИНИЦИАЛИЗАЦИЯ  ДАТЧИКА ТЕМПЕРАТУРЫ =====================
;=================================================================================
; чтение температуры из DS18B20
START_DS
            ; DS_INIT
            _BANK_1 
            bcf TRISB,0        
            _BANK_0
            bcf PORTB,0
            call Del_500
            _BANK_1 
            bsf TRISB,0
            _BANK_0
            bsf PORTB,0
            call Del_500  
			movlw 0xCC
			movwf BUF_BX
			call BYD_KOM_1
			movlw 0x44
			movwf BUF_BX
			call BYD_KOM_1	    
			call Del_500
            call Del_500
            ;DS_INIT
            _BANK_1 
            bcf TRISB,0        
            _BANK_0
            bcf PORTB,0
            call Del_500
            _BANK_1 
            bsf TRISB,0
            _BANK_0
            bsf PORTB,0
            call Del_500 			
			movlw 0xCC
			movwf BUF_BX
			call BYD_KOM_1	
			movlw 0xBE
            movwf BUF_BX
			call BYD_KOM_1					
	  		call READ_1			
			movf KOM,W
			movwf T_L
        	call READ_1
			movf KOM,W	
			movwf T_H			  
			goto START_DS
;=======================================================================================


;=======================================================================================
;  Эта подпрограмма получает данные от ДАЛЛАССКОГО чипа.
READ_1
            movlw .8            
            movwf COUNT         
            clrf KOM          
prm_bait_1  _BANK_1 
            bcf TRISB,0        
            _BANK_0
            bcf PORTB,0 ;_LINE_0                      ; Формирование на линии уровня 0.
           _BANK_1 
            bsf TRISB,0
            _BANK_0
            bsf PORTB,0 ;_LINE_1                      ; Формирование на линии уровня 1.
            nop                       
            btfss DALLAS          ; На линии 0 или 1 ? 
            bcf STATUS,C      
            btfsc DALLAS       
            bsf STATUS,C      
            rrf KOM,F                   
            call Del_60
            decfsz COUNT                 
            goto prm_bait_1    
            movf KOM,W                   
            return                 
;=======================================================================================
;=======================================================================================
;  Эта подпрограмма посылает команды к DS1820. Данные
; посылается младшим битом сначала без четности, останова, или битов начала
BYD_KOM_1
           movlw .8            
           movwf COUNT                
p_b0       rrf BUF_BX                         ; Сдвиг вправо 
           btfss STATUS,C      
           goto bit_0            ; передачa 0.
           goto bit_1            ; передачa 1.
p_b1       decfsz COUNT                
           goto p_b0          
           return
bit_0                                      ; передачa бита с уровнем "0"
           _BANK_1 
           bcf TRISB,0        
           _BANK_0
           bcf PORTB,0 ;_LINE_0           
           call Del_60          ; задержка 60мкс
           _BANK_1 
           bsf TRISB,0
           _BANK_0
           bsf PORTB,0 ;_LINE_1                       ;  Конец передачи.
           goto p_b1          
;---------------------------------------------------------------------------------------------
bit_1                                      ; передачa бита с уровнем "1"
          _BANK_1 
           bcf TRISB,0        
           _BANK_0
           bcf PORTB,0 ;_LINE_0                    
           _BANK_1 
           bsf TRISB,0
           _BANK_0
           bsf PORTB,0 ;_LINE_1                                          
           call Del_60          ; задержка60мкс.
           goto p_b1          
                    
;=====================================================================================
Del_05
nop
nop
nop
nop
nop
return
;==================================
Del_010
call Del_05
call Del_05
return
;==================================
Del_500
call Del_240
call Del_240
return
;==================================
Del_240
movlw       .79
movwf       Reg_tmp1
decfsz      Reg_tmp1,F
goto        $-1
nop
nop
return
;==================================
Del_60
movlw       .19
movwf       Reg_tmp1
decfsz      Reg_tmp1,F
goto        $-1
nop
nop
return


;======================================================================================================
end



 			



	               

