Популярные проекты

WEB PICµBASIC LOGIC CONTROLLER

USB PICµBASIC Mid Hardware

USB PICµBASIC LOGIC CONTROLLER

DDS генератор сигналов "OSKAR-DDS"

Термостол для оплавления паяльной пасты

Осциллограф Карманный "OSKAR" V3.1

Электроника и механика 3-х координатного станка ЧПУ (Hobby CNC)

Простой счетчик

Измеритель ESR и емкости конденсаторов

Самодельный установщик SMD компонентов - раскладочный станок "SMD PLACER V2"

Прибор для измерения частоты, емкости, индуктивности, сопротивления

Выключатель /диммер светодиодных лент с ДУ.

Светомузыка «СЕМИЦВЕТИК» + автомат световых эффектов.

Универсальный прибор для автомобиля. Часы, термометр, вольтметр, тахометр.

Все, что нельзя запрограммировать на ассемблере, приходится паять.

      Этот сайт посвящен моим проектам на PIC контроллерах, доступных для публичного освещения. Все приведенные схемы реализованы в железе и работают в настоящее время в быту или производстве. Для написания программ использован пакет MPLAB/х , свободно распространяемый фирмой MICROCHIP. Используется программатор PICKIT2/3, ICD2/3. Любую конструкцию можно собрать самому, даже если она платная и получить бесплатно код разблокировки. Также можно приобрести в качестве набора для сборки или готового изделия. Принимаются заказы на разработку аналогово-цифровой или цифровой электроники, систем управления и электроники для производства с применением контроллеров.
Вопросы и предложения писать на почту Gennadiy.V@gmail.com
Если у Вас есть интересные предложения, закакзы или вопросы и форум Вам не помог - адрес тот же.


Универсальный прибор для автомобиля
Часы, термометр, вольтметр, тахометр.

     Данное устройство предназначено для контроля напряжения в бортовой сети с точностью 0.1в, измерения температуры в диапазоне от -50 до +125 градусов, измерения частоты вращения коленчатого вала от 0 до 9990 об/мин с точностью 100 об/мин в первом режиме и 10 об/мин во втором ( четырех цилиндровый двигатель), и имеет часы с питанием от встроеной литиевой батарейки. Предусмотрено изменение яркости индикатора - 10 уровней, режим корректировки часов, звуковая сигнализация при частоте вращения двигателя более 4000 об/мин, и напряжении более 14,9 вольт или менее 12 вольт.

  Схема

     Устройство имеет
  - входы питания - от замка зажигания
  - измерительный вход напряжения - к аккумулятору
  - вход датчика цифрового термометра DS18b20
  - вход датчика тахометра - подключается к клеме катушки зажигания , куда подходит провод от электронного коммутатора
  - две кнопки управления

   Питание осуществляется от бортсети автомобиля.Есть встроенная защита от переполюсовки.
Одной кнопкой осуществляется короткий выбор режимов - часы, термометр, вольтметр, тахометр.
Второй кнопкой осуществляется выбор всех режимов -часы, термометр, вольтметр, тахометр, регулировка яркости, коррекция минут, коррекция часов, тахометр с точностью 10 об/мин. При этом в режимах регулировка яркости, коррекция минут, коррекция часов - первой осуществляются изменения.
При включении зажигания прибор устанвливается в режим отображения времени, звуковая индикая отключена.
Кварц установить 4 МГц. Если есть проблема с вольтметром, то подключить 5 ногу процессора к +5 вольт.


ПО распространяется под лицензией Freeware. Вы можете скачать с сайта схемы, инструкции, прошивки бесплатно.

Даташит на индикатор (в приборе установлен вверх ногами для удобства)
Комплект файлов: прошивка, схема, разводка, исходный текст для разных типов индикаторов
Фото(1),
Фото(2),
Фото(3),
Фото(4),
Фото(5),
Фото(6),
Обсудить на форуме
Купить


Пример работы с EEPROM
PIC16F628 ASM


;PIC16F628

;=====================================================
; Сохранение в еепром
;=====================================================

eewrite					; Write	to EEPROM
	movlw	.10			; попытка записи максимум 10 циклов 
	movwf	TEMP2
write_2
	bcf	STATUS,	RP1
	movf	ee_data, 0
	bsf	STATUS,	RP0
	movwf	EEDATA
	bcf	STATUS,	RP0
	movf	ee_addr, 0
	bsf	STATUS,	RP0
	movwf	EEADR


;
	bcf	INTCON,	GIE		; Запретить прерывания
	bsf	EECON1,	WREN		; Разрешить запись
	movlw	55h
	movwf	EECON2
	movlw	0AAh
	movwf	EECON2
	bsf	EECON1,	WR		; Начать запись !
W_1
	clrwdt
	btfsc	EECON1,	WR
	goto	W_1
	bcf	EECON1,	WREN		; Запретить запись

;	bsf	INTCON,	GIE

; Проверка записи
	bcf	STATUS,	RP0
	movf	ee_data, 0
	bsf	STATUS,	RP0
	bsf	EECON1,	RD
	nop
;
	subwf	EEDATA, 0		; Проверка окончания записи
	bcf	STATUS,	RP0
	btfsc	STATUS,	Z
	retlw	0			; Ok ! Запись произведена !
	decfsz	TEMP2, f
	incf	errors
	goto	write_2
	retlw	1			; Error  ! Запись  НЕ произведена !
;=====================================================
; Сохранение в еепром  конец
; ПРИМЕР 
SAVE 
	clrf	errors

	MOVLW 	00H	 	;
	MOVWF 	ee_addr 	; Address to write
	MOVF 	RC0,0	 	; data to write
	MOVWF 	ee_data 	; Data to save
	CALL	eewrite 

	MOVLW 	11H	 	;
	MOVWF 	ee_addr 	; Address to write
	MOVf 	CRC_RCOLD,0	 	; data to write
	MOVWF 	ee_data 	; Data to save
	CALL	eewrite

	bsf	INTCON,	GIE
	RETURN

;;=====================================================
;=====================================================
; Восстановление из еепрома счетчика 
;=====================================================
; ПРИМЕР 
LOAD
	BANK1 
	MOVLW 	00H	 	;
	MOVWF 	EEADR 		; Address to read
	BSF 	EECON1, RD 	; EE Read
	MOVF 	EEDATA^80h, W 	; W = EEDATA
	BCF 	STATUS, RP0 	; Bank 0
	MOWWF	TEMP1
	RETURN	
;****************************************************************************


ПО распространяется под лицензией Freeware. Вы можете скачать с сайта схемы, инструкции, прошивки бесплатно.

Обсудить на форуме


Пример работы с шиной i2c
PIC16F628 ASM


; *********************************************************************
;Подпрограммы для работы с шиной I2C   24LC256. 100 kHz ДЛЯ 20 мГц ; 400 Кгц - delay 4 заменить nop,nop
; *********************************************************************
;/*--------- начало примера-----------
; Требуется 2 байта ОЗУ - i2c_byte - в него помещается байт,
; который необходимо вывести на шину, в нем оказывается байт, 
; считанный с шины; tmp - счетчик, используемый в цикле. */
; *********************************************************************
;char i2c_byte; /* рабочий регистр */
;char tmp;      /* счетчик */

i2c_start
  			BANK1 		
            bcf 	TRIS_SDA          ; SDA - вывод
            bcf 	TRIS_SCL          ; SCL - вывод
  		BANK0  
  		bsf 	SCL     ; SCL - 1
		CALL	delay4		
  		bsf 	SDA     ; SDA - 1
		CALL	delay4	
		bcf 	SDA     ; SDA - 0
		CALL	delay4	
  		bcf 	SCL    	; SCL - 0
	RETURN 
; ***********
i2c_stop
  		BANK0 
		bcf SDA     ; SDA - 0
		CALL	delay4	
  		bsf SCL     ; SCL - 1
		CALL	delay4	
  		bsf SDA     ; SDA - 1
	RETURN 
; ***********
i2c_write
			movlw 	0x08
            movwf 	_tmp
  			BANK1 		
            bcf 	TRIS_SDA          ; SDA - вывод
            bcf 	TRIS_SCL          ; SCL - вывод
   			BANK0
  			bcf 	SCL               ; SCL - 0
			CALL	delay4	
send_bit  
  			bsf 	SDA     		; SDA - 1 выводим 1 на SDA
			CALL	delay4	
            btfss 	_i2c_byte, 7    ; бит данных - 1 ?
 			bcf 	SDA          	; нет - выводим 0 на SDA
			CALL	delay4	
  			bsf 	SCL     		; SCL - 1
			CALL	delay4	
            rlf 	_i2c_byte, F    ; сдвигаем влево байт данных

        	bcf 	SCL          	; SCL - 0
			CALL	delay4		
            decfsz 	_tmp, F        	; конец цикла ?
            goto 	send_bit        ; нет - переход
                       
         	bsf 	SDA          	; осв. SDA SDA - 1
			CALL	delay4	
  			bsf 	SCL     		; SCL - 1, получаем ACK-бит и игнорируем его (!)
			CALL	delay4	         
  			bcf 	SCL    			; SCL - 0 
	RETURN 
; ***********

i2c_read
            movlw 	0x08
            movwf 	_tmp
  			BANK1 
            bsf 	TRIS_SDA        ; SDA - на ввод
           	bcf 	TRIS_SCL        ; SCL - вывод
  			BANK0 
       		bcf 	SCL          	; SCL - на 0
			CALL	delay4	



read_bit
			rlf 	_i2c_byte, F    ; сдвигаем байт влево
  			bsf 	SCL     		; SCL - 1
			CALL	delay4	
            bsf 	_i2c_byte, 0    ; устанавливаем бит в 1 ; -NOP
			NOP
            btfss 	SDA        		; SDA - 1?
            bcf 	_i2c_byte, 0    ; нет - устанавливаем бит в 0

  			bcf 	SCL    			; SCL - 0
			CALL	delay4	
            decfsz 	_tmp, F        	; конец цикла ?
            goto 	read_bit        ; нет - переход
  			BANK1 		
            bcf 	TRIS_SDA          ; SDA - вывод
   			BANK0
	RETURN 
; ***********
; *********************************************************************
;Примеры использования процедур I2C
; *********************************************************************


 ; *********************************************************************
;Примеры использования процедур I2C
; *********************************************************************

EEPROM_READ_BYTE
 

	CALL    i2c_start
	MOVLW	0xA2
    MOVWF	_i2c_byte 	;          // control байт с битом WR
    CALL	i2c_write
    MOVF 	EE_ADR_ST,W
    MOVWF 	_i2c_byte   ; старший байт адреса памяти
    CALL    i2c_write	;
    MOVF 	EE_ADR_ML,W
    MOVWF 	_i2c_byte    ;  младший байт адреса памяти
    CALL    i2c_write;  
    CALL    i2c_start;
	MOVLW	0xA3
    MOVWF	_i2c_byte    ;// control байт с битом RD
    CALL    i2c_write
    CALL    i2c_read
    CALL    i2c_stop
    MOVF 	_i2c_byte,W
    MOVWF 	EE_DATA

		RETURN
; *********************************************************************
EEPROM_SAVE_BYTE

    CALL        i2c_start
	MOVLW	0xA2
    MOVWF	_i2c_byte;        ; //control байт с битом WR
    CALL        i2c_write
    MOVF 	EE_ADR_ST,W
    MOVWF 	_i2c_byte         ;  // старший байт адреса памяти
    CALL        i2c_write
    MOVF 	EE_ADR_ML,W
    MOVWF 	_i2c_byte         ;// младший байт адреса памяти
    CALL        i2c_write  
    MOVF 	EE_DATA,W
    MOVWF 	_i2c_byte         ;// записываемые данные
    CALL        i2c_write              
    CALL        i2c_stop

	MOVLW 	.64 ; 10mS (2.5-5V)
;	MOVLW 	.90 ; 14mS (2.5-5V)
	GOTO	Big_delay

;		RETURN

;**********************************************************************
;DS1307
DSTIME_READ_BYTE
 	CALL    i2c_start
	MOVLW	0xD0
    MOVWF	_i2c_byte 	;          // control байт с битом WR
    CALL	i2c_write
    MOVF 	EE_ADR_ML,W
    MOVWF 	_i2c_byte    ;  младший байт адреса памяти
    CALL    i2c_write;  
    CALL    i2c_start;
	MOVLW	0xD1
    MOVWF	_i2c_byte    ;// control байт с битом RD
    CALL    i2c_write
    CALL    i2c_read
    CALL    i2c_stop
    MOVF 	_i2c_byte,W
    MOVWF 	EE_DATA


		RETURN
; *********************************************************************
DSTIME_SAVE_BYTE

    CALL        i2c_start
	MOVLW	0xD0
    MOVWF	_i2c_byte;        ; //control байт с битом WR
    CALL        i2c_write
    MOVF 	EE_ADR_ML,W
    MOVWF 	_i2c_byte         ;// младший байт адреса памяти
    CALL        i2c_write  
    MOVF 	EE_DATA,W
    MOVWF 	_i2c_byte         ;// записываемые данные
    CALL        i2c_write              
    GOTO        i2c_stop

;		RETURN

;**********************************************************************


########################################################################
                   ПРИМЕР 2
######################################################################## 
 
 ;******* 20 mHz
;
; Подпрограммы работы с микросхемами 24с512 (16 шт)
; чтение и запись прозводится блоками. размер блока от 1 до 128 байт
; Скорость шины 1 mHz позволяет хранить звук 22 кHz 8 бит  для вывода на ЦАП  
;  Весь массив сгруппирован в 2 строки по 8 шт.В первой линейке А0 подтянут на плюс питания,
; а во второй на землю.В кадом столбще А1 соеденены вместе и идут на выходы.
; код оптимизировался по скорости
;
;************** I2C ***************

#define   SDA		PORTC,4		
#define   SCL	 	PORTC,3
#define   TRIS_SCL   TRISC^80,3 ; I2C SCL PIN 
#define   TRIS_SDA   TRISC^80,4 ; I2C SDA PIN 

_i2c_byte		EQU	0x2E
_tmp			EQU	0x2F
EE_DATA			EQU	0x30
EE_ADR_32		EQU	0x31

EE_ADR_ST		EQU	0x32
EE_ADR_ML		EQU	0x33

;*****************************************************************************
; МЕСТНЫЕ ПОДПРОГРАММЫ
;*****************************************************************************


SET_BANK	; УСТАНОВКА ЕСЛИ ОН ПОМЕНЯЛСЯ 

		BCF		FLAG_CHANGE_BANK


		MOVLW	b'00011111'
		ANDWF	EE_ADR_32,W
		MOVWF	EE_ADR_ML


		SWAPF	ML_ADR_RAM,W; ПЕРЕМЕСТИМ 3 БИТА ИЗ КОНЦА В НАЧАЛО
		MOVWF	TEMP4
		RLF		TEMP4,W
		ANDLW	b'11100000'

		IORWF	EE_ADR_ML,F


		MOVF	ML_ADR_RAM,W
		MOVWF	TEMP4

		RRF		TEMP4,F
		RRF		TEMP4,F
		RRF		TEMP4,W
		ANDLW	b'00011111'

		MOVWF	EE_ADR_ST


		SWAPF	ST_ADR_RAM,W
		MOVWF	TEMP4

		RLF		TEMP4,W
		ANDLW	b'11100000'

		IORWF	EE_ADR_ST,F


; ТУТ НАДА ВЫВЕСТИ БАНК

		MOVLW	b'01111000';
		ANDWF	ST_ADR_RAM,W
		MOVWF	TEMP4
;CMP BANK
		XORWF	OLD_BANK,W
		BTFSC	STATUS,Z

		RETURN	;ЕСЛИ БАНКИ СОВПАДАЮТ - ВЫХОДИМ

;ЕСЛИ НЕТ - ВЫСТАВИМ 



		BSF		FLAG_CHANGE_BANK

SET_BANK_1
		MOVLW		.255	;	ЭТО ОЧИСТКА БАНКОВ
		MOVWF		PORTA
		BSF			PORTC,0
		BSF			PORTC,1

		MOVF	TEMP4,W
		MOVWF	OLD_BANK

		BCF		TEMP4,3
		
		MOVLW	.0
		XORWF	TEMP4,W
		BTFSC	STATUS,Z
		BCF		RAM_BANK0

		MOVLW	b'00010000'
		XORWF	TEMP4,W
		BTFSC	STATUS,Z
		BCF		RAM_BANK1

		MOVLW	b'00100000'
		XORWF	TEMP4,W
		BTFSC	STATUS,Z
		BCF		RAM_BANK2

		MOVLW	b'00110000'
		XORWF	TEMP4,W
		BTFSC	STATUS,Z
		BCF		RAM_BANK3

		MOVLW	b'01000000'
		XORWF	TEMP4,W
		BTFSC	STATUS,Z
		BCF		RAM_BANK4

		MOVLW	b'01010000'
		XORWF	TEMP4,W
		BTFSC	STATUS,Z
		BCF		RAM_BANK5

		MOVLW	b'01100000'
		XORWF	TEMP4,W
		BTFSC	STATUS,Z
		BCF		RAM_BANK6

		MOVLW	b'01110000'
		XORWF	TEMP4,W
		BTFSC	STATUS,Z
		BCF		RAM_BANK7

		RETURN
;********************************************************
EEPROM_READ_BYTE

		BCF		INTCON,7	; IRQ off

		BTFSS	ST_ADR_RAM,3
		GOTO	EEPROM_READ_BYTE_ML

EEPROM_READ_BYTE_ST

	CALL    i2c_start
	MOVLW	0xA2
    MOVWF	_i2c_byte 	;          // control байт с битом WR
    CALL	i2c_write
    MOVF 	EE_ADR_ST,W
    MOVWF 	_i2c_byte   ; старший байт адреса памяти
    CALL    i2c_write	;
    MOVF 	EE_ADR_ML,W
    MOVWF 	_i2c_byte    ;  младший байт адреса памяти
    CALL    i2c_write;  
    CALL    i2c_start;
	MOVLW	0xA3
    MOVWF	_i2c_byte    ;// control байт с битом RD
    CALL    i2c_write

    CALL    i2c_read
    MOVF 	_i2c_byte,W
    MOVWF 	EE_DATA

    CALL    i2c_stop


		BSF		INTCON,7	; IRQ on

		RETURN
;**********************************************************************
EEPROM_READ_BYTE_ADDR 
		BCF		INTCON,7	; IRQ off
;		BSF		INTCON,7	; IRQ on



		BTFSS	ST_ADR_RAM,3
		GOTO	EEPROM_READ_BYTE_ML_ADDR

EEPROM_READ_BYTE_ST_ADDR

	CALL    i2c_start
	MOVLW	0xA2
    MOVWF	_i2c_byte 	;          // control байт с битом WR
    CALL	i2c_write
    MOVF 	EE_ADR_ST,W
    MOVWF 	_i2c_byte   ; старший байт адреса памяти
    CALL    i2c_write	;
    MOVF 	EE_ADR_ML,W
    MOVWF 	_i2c_byte    ;  младший байт адреса памяти
    CALL    i2c_write;  
    CALL    i2c_start;
	MOVLW	0xA3
    MOVWF	_i2c_byte    ;// control байт с битом RD
    CALL    i2c_write


;		BCF		INTCON,7	; IRQ off
		BSF		INTCON,7	; IRQ on

		RETURN


;**********************************************************************
EEPROM_READ_BYTE_DATA 

		BCF		INTCON,7	; IRQ off

     CALL    i2c_read

    MOVF 	_i2c_byte,W
    MOVWF 	EE_DATA

		BSF		INTCON,7	; IRQ on

		RETURN
;**********************************************************************
EEPROM_READ_BYTE_ML
		BCF		INTCON,7	; IRQ off


	CALL    i2c_start
	MOVLW	0xA0
    MOVWF	_i2c_byte 	;          // control байт с битом WR
    CALL	i2c_write
    MOVF 	EE_ADR_ST,W
    MOVWF 	_i2c_byte   ; старший байт адреса памяти
    CALL    i2c_write	;
    MOVF 	EE_ADR_ML,W
    MOVWF 	_i2c_byte    ;  младший байт адреса памяти
    CALL    i2c_write;  
    CALL    i2c_start;
	MOVLW	0xA1
    MOVWF	_i2c_byte    ;// control байт с битом RD
    CALL    i2c_write
    CALL    i2c_read
    CALL    i2c_stop
    MOVF 	_i2c_byte,W
    MOVWF 	EE_DATA


		BSF		INTCON,7	; IRQ on

		RETURN

;**********************************************************************
EEPROM_READ_BYTE_ML_ADDR 
	CALL    i2c_start
	MOVLW	0xA0
    MOVWF	_i2c_byte 	;          // control байт с битом WR
    CALL	i2c_write
    MOVF 	EE_ADR_ST,W
    MOVWF 	_i2c_byte   ; старший байт адреса памяти
    CALL    i2c_write	;
    MOVF 	EE_ADR_ML,W
    MOVWF 	_i2c_byte    ;  младший байт адреса памяти
    CALL    i2c_write;  
    CALL    i2c_start;
	MOVLW	0xA1
    MOVWF	_i2c_byte    ;// control байт с битом RD
    CALL    i2c_write



		BSF		INTCON,7	; IRQ on

		RETURN


;**********************************************************************



SAVE_BUTE_IN_RAM_DATA

		BCF		INTCON,7	; IRQ off

    MOVF 	EE_DATA,W
    MOVWF 	_i2c_byte         ;// записываемые данные
    CALL        i2c_write              

		BSF		INTCON,7	; IRQ on

		RETURN
;***************************************************
SAVE_BUTE_IN_RAM_ADDR

		CALL 	SET_BANK	; УСТАНОВКА ЕСЛИ ОН ПОМЕНЯЛСЯ 

		BTFSC	ST_ADR_RAM,3
		GOTO	EEPROM_SAVE_BYTE_ST

EEPROM_SAVE_BYTE_ML

		BCF		INTCON,7	; IRQ off
;		BSF		INTCON,7	; IRQ on

    CALL        i2c_start
	MOVLW	0xA0
    MOVWF	_i2c_byte;        ; //control байт с битом WR
    CALL        i2c_write
    MOVF 	EE_ADR_ST,W
    MOVWF 	_i2c_byte         ;  // старший байт адреса памяти
    CALL        i2c_write
    MOVF 	EE_ADR_ML,W
    MOVWF 	_i2c_byte         ;// младший байт адреса памяти
    CALL        i2c_write  

EEPROM_SAVE_BYTE_LONG_ML

    MOVF 	EE_DATA,W
    MOVWF 	_i2c_byte         ;// записываемые данные
    CALL        i2c_write              

		BSF		INTCON,7	; IRQ on

		RETURN

;**********************************************************************

EEPROM_SAVE_BYTE_ST
		BCF		INTCON,7	; IRQ off


    CALL        i2c_start
	MOVLW	0xA2
    MOVWF	_i2c_byte;        ; //control байт с битом WR
    CALL        i2c_write
    MOVF 	EE_ADR_ST,W
    MOVWF 	_i2c_byte         ;  // старший байт адреса памяти
    CALL        i2c_write
    MOVF 	EE_ADR_ML,W
    MOVWF 	_i2c_byte         ;// младший байт адреса памяти
    CALL        i2c_write  

EEPROM_SAVE_BYTE_LONG

    MOVF 	EE_DATA,W
    MOVWF 	_i2c_byte         ;// записываемые данные
    CALL        i2c_write              



		BSF		INTCON,7	; IRQ on

		RETURN

;***********************************************

; *********************************************************************
;char i2c_byte; /* рабочий регистр */
;char tmp;      /* счетчик */

i2c_start
  			BANK1 		
            bcf 	TRIS_SDA          ; SDA - вывод
            bcf 	TRIS_SCL          ; SCL - вывод
  		BANK0  
  		bsf 	SCL     ; SCL - 1
		NOP 			
  		bsf 	SDA     ; SDA - 1
		NOP	
		bcf 	SDA     ; SDA - 0
		NOP	
  		bcf 	SCL    	; SCL - 0
	RETURN 
; ***********
i2c_stop
  		BANK0 
		bcf SDA     ; SDA - 0
		NOP	
  		bsf SCL     ; SCL - 1
		NOP	
  		bsf SDA     ; SDA - 1
	RETURN 
; ***********
i2c_write
			movlw 	0x08
            movwf 	_tmp
  			BANK1 		
            bcf 	TRIS_SDA          ; SDA - вывод
            bcf 	TRIS_SCL          ; SCL - вывод
   			BANK0
  			bcf 	SCL               ; SCL - 0
			NOP	
send_bit  
  			bsf 	SDA     		; SDA - 1 выводим 1 на SDA
			NOP	
            btfss 	_i2c_byte, 7    ; бит данных - 1 ?
 			bcf 	SDA          	; нет - выводим 0 на SDA
			NOP	
  			bsf 	SCL     		; SCL - 1
			NOP	
            rlf 	_i2c_byte, F    ; сдвигаем влево байт данных

        	bcf 	SCL          	; SCL - 0
			NOP		
            decfsz 	_tmp, F        	; конец цикла ?
            goto 	send_bit        ; нет - переход
                       
         	bsf 	SDA          	; осв. SDA SDA - 1
			NOP	
  			bsf 	SCL     		; SCL - 1, получаем ACK-бит и игнорируем его (!)
			NOP	         
  			bcf 	SCL    			; SCL - 0 
	RETURN 
; ***********

i2c_read
            movlw 	0x08
            movwf 	_tmp
  			BANK1 
            bsf 	TRIS_SDA        ; SDA - на ввод
           	bcf 	TRIS_SCL        ; SCL - вывод
  			BANK0 
       		bcf 	SCL          	; SCL - на 0
			NOP	



read_bit
			rlf 	_i2c_byte, F    ; сдвигаем байт влево
  			bsf 	SCL     		; SCL - 1
			NOP	
            bsf 	_i2c_byte, 0    ; устанавливаем бит в 1 ; -NOP
			NOP
            btfss 	SDA        		; SDA - 1?
            bcf 	_i2c_byte, 0    ; нет - устанавливаем бит в 0

  			bcf 	SCL    			; SCL - 0
			NOP	
            decfsz 	_tmp, F        	; конец цикла ?
            goto 	read_bit        ; нет - переход
  			BANK1 		
            bcf 	TRIS_SDA          ; SDA - вывод
   			BANK0
	RETURN 
; ***********

i2c_read_ask
            movlw 	0x08
            movwf 	_tmp
  			BANK1 
            bsf 	TRIS_SDA        ; SDA - на ввод
           	bcf 	TRIS_SCL        ; SCL - вывод
  			BANK0 
       		bcf 	SCL          	; SCL - на 0
			NOP	

read_bit_ask
			rlf 	_i2c_byte, F    ; сдвигаем байт влево
  			bsf 	SCL     		; SCL - 1
			NOP	
            bsf 	_i2c_byte, 0    ; устанавливаем бит в 1 ; -NOP
			NOP
            btfss 	SDA        		; SDA - 1?
            bcf 	_i2c_byte, 0    ; нет - устанавливаем бит в 0

  			bcf 	SCL    			; SCL - 0
			NOP	
            decfsz 	_tmp, F        	; конец цикла ?
            goto 	read_bit_ask        ; нет - переход

  			BANK1 		
            bcf 	TRIS_SDA          ; SDA - вывод
   			BANK0

         	bcf 	SDA          	; осв. SDA SDA - 0
			NOP	
  			bsf 	SCL     		; SCL - 1, получаем ACK-бит и игнорируем его (!)
			NOP	         
  			bcf 	SCL   			; SCL - 0 
         	bsf 	SDA          	; осв. SDA SDA - 1
	RETURN 
; ***********
ask_0


         	bcf 	SDA          	; осв. SDA SDA - 0
			NOP	
  			bsf 	SCL     		; SCL - 1, получаем ACK-бит и игнорируем его (!)
			NOP	         
  			bcf 	SCL   			; SCL - 0 
         	bsf 	SDA          	; осв. SDA SDA - 1
	RETURN 
ask_1


         	bsf 	SDA          	; осв. SDA SDA - 1
			NOP	
  			bsf 	SCL     		; SCL - 1, получаем ACK-бит и игнорируем его (!)
			NOP	         
  			bcf 	SCL   			; SCL - 0 
;         	bsf 	SDA          	; осв. SDA SDA - 1
	RETURN 

;**************************************
; Блочное чтение 
KODE_37_1




			;ПОЛУЧИМ ДАННЫЕ
		CALL 	SET_BANK	; УСТАНОВКА ЕСЛИ ОН ПОМЕНЯЛСЯ 
		BTFSC	FLAG_CHANGE_BANK
		GOTO	KODE_37_1_FULL


		CALL	ask_0
		CALL	EEPROM_READ_BYTE_DATA
		GOTO	KODE_37_1_END

KODE_37_1_FULL
		BCF		INTCON,7	; IRQ off
		CALL	ask_1
    	CALL    i2c_stop
		BSF		INTCON,7	; IRQ on

			NOP
			NOP
			
		CALL	EEPROM_READ_BYTE_ADDR 
		CALL	EEPROM_READ_BYTE_DATA



KODE_37_1_END
			MOVF	EE_DATA,W

			MOVWF	TEMP3
			INCF	EE_ADR_32,F	; СДВИГ ПО АДРЕСУ БЛОКА
			CLRWDT

 KODE_37_2

			; ПРОВЕРИМ ГРАНИЦУ БЛОКА

			MOVLW	.32
			XORWF	EE_ADR_32,W
			BTFSS	STATUS,Z
			GOTO	KODE_37_1


			CLRF	EE_ADR_32; НА НАЧАЛО БЛОКА

			INCFSZ	ML_ADR_RAM,F; УВЕЛИЧИМ СЧЕТ БЛОКОВ АДРЕСА
			GOTO	KODE_37_3
			INCF	ST_ADR_RAM,F
			BCF		ST_ADR_RAM,7
KODE_37_3


			DECFSZ	ML_LEN_RAM,F ; УМЕНЬШИМ СЧЕТ БЛОКОВ ДЛЯ ЧТЕНИЯ
			GOTO	KODE_37_1

			MOVF	ST_LEN_RAM,W
			BTFSC	STATUS,Z
			GOTO	KODE_37_5

			DECFSZ	ST_LEN_RAM,F
			GOTO	KODE_37_1

;ТУТ СТОП НА И2С   
KODE_37_5

			CALL	ask_1
			CALL	i2c_stop

KODE_37_4
			return
; ***************************************
; Запись блоками
;**********************
KODE_37			; WRITE BLOCK

			MOVF	TEMP3,W
;ZAPOLNIT ADRES
			MOVWF	ST_ADR_RAM	; СТАРШИЙ АДРЕС БЛОКА
			...
			...

			MOVF	TEMP3,W
;ZAPOLNIT ADRES
			MOVWF	ML_ADR_RAM	; МЛАДШИЙ АДРЕС БЛОКА


KODE_36_2


			MOVWF	EE_DATA         ;(DATA IN w)
			CALL	SAVE_BUTE_IN_RAM_ADDR 
			INCF	EE_ADR_32,F	; СДВИГ ПО АДРЕСУ БЛОКА
			GOTO	KODE_36_22	

KODE_36_22

			CALL	LOAD_VECTOR_OUT		; ПОЛУЧИМ НОВЫЙ байт для записи
			BTFSS	STATUS,Z

			GOTO	KODE_36_11

			CALL	i2c_stop
			CALL	delay_5ms		; 

			RETURN 

KODE_36_11
			MOVF	TEMP3,W
			MOVWF	EE_DATA         ;(DATA IN w)
			CALL	SAVE_BUTE_IN_RAM_DATA 
			INCF	EE_ADR_32,F	; СДВИГ ПО АДРЕСУ БЛОКА
			GOTO	KODE_36_22


ПО распространяется под лицензией Freeware. Вы можете скачать с сайта схемы, инструкции, прошивки бесплатно.

Обсудить на форуме


Пример работы с символьным ЖКИ HD44780
PIC16F628 ASM


;**********************************************************************
INIT_LCD
		;********************************  init LCD ********
		MOVLW   B'00110000'	; в регистр W $30
		CALL	WR_COMMAND_LCD

;		MOVLW 	.32 ; 5mS
		CALL	Big_delay5

		MOVLW   B'00110000'	; в регистр W $30
		CALL	WR_COMMAND_LCD

		MOVLW 	.175 ; 100mkS
		CALL	delay

		MOVLW   B'00110000'	; в регистр W $30
		CALL	WR_COMMAND_LCD

		; думаем что жки сбросился и находится в 8 битном режиме

		CALL	Big_delay5
		MOVLW   B'00111000'	; в регистр W $38 2 СТРОКИ 5*8 ТОЧЕК  8БИТ
		CALL	WR_COMMAND_LCD


		CALL	Big_delay5
		MOVLW   B'00001110'	; в регистр W $0E LCD - ON , CURSOR - ON "_"
		CALL	WR_COMMAND_LCD


		CALL	Big_delay5
		MOVLW   B'00000110'	; в регистр W $06 CURSOR AUTO INC
		CALL	WR_COMMAND_LCD


		CALL	Big_delay5
		MOVLW   B'00000011'	; в регистр W $03 CURSOR  START POSITION 
		goto	WR_COMMAND_LCD

		;*****************************   END init LCD ********
		;RETURN

;**********************************************************************



;**********************************************************************
LCD_READ_BUTE	; ВВОД ОДНОГО СИМВОЛА, КУРСОР +1, КОД В W
		CALL	Big_delay5
				BCF		LCD_E	
				BANK1
		        MOVLW   B'11111111'		; PORTD   ;
        		MOVWF   TRISD^80
				BANK0


				BSF		LCD_RW
				BSF		LCD_RS ; DATA
				BSF		LCD_E
				NOP
				NOP				
				MOVF	LCD_DAT,W
				MOVWF	TEMP
				BCF		LCD_E
				BCF		LCD_RW
				
				BANK1
		        MOVLW   B'00000000'		; PORTD   ;
        		MOVWF   TRISD^80
				BANK0
				MOVF	TEMP,W
			RETURN
; *********************************************************************
WR_COMMAND_LCD
				; DATA IN W
				BCF		LCD_RW
				BCF		LCD_E
				BCF		LCD_RS ; COMMAND
				MOVWF	LCD_DAT
				BSF		LCD_E
				NOP
				NOP				
				BCF		LCD_E
				BSF		LCD_RS ; DATA
				RETURN
;**********************************************************************
;**********************************************************************
LCD_BUTE	; ВЫВОД ОДНОГО СИМВОЛА, КУРСОР +1, КОД В W
				MOVWF	TEMP
;				CALL	BUSY
				CALL	Big_delay5
				MOVF	TEMP,W
WR_DATA_LCD		; DATA IN W
				MOVWF	TEMP

				BTFSS	FLAG_MOVE_CURSOR
				GOTO 	G3ST
				CALL	LCD_INC_CURSOR
				CALL	Big_delay5	
G3ST
				; ОБРАБОТКА ФЛАГОВ РЕДАКТИРОВАНИЯ
				;BCF			FLAG_EDIT_NUMBER 
				;BCF			FLAG_EDIT_DATAIN
				; ЕСЛИ УСТАНОВЛЕН НУЖНЫЙ ФЛАГ И 
				; КУРСОР НА ЕТОМ МЕСТЕ ТО СИМВОЛ НЕ ВЫВОДИМ 

				BTFSS	FLAG_EDIT_NUMBER 
				GOTO	G3ST_PRN1 ; NE USTANOWLEN 
				;ПРОВЕРКА КУРСОРА 
				MOVLW	0x46
				XORWF	CURSOR,W
				BTFSS	STATUS,Z
				GOTO	G3ST_PRN2
				GOTO	G3ST_END

G3ST_PRN1
				BTFSS	FLAG_EDIT_DATAIN 
				GOTO	G3ST_PRN2 ; NE USTANOWLEN 
				;ПРОВЕРКА КУРСОРА
				MOVLW	0x42
				XORWF	CURSOR,W
				BTFSC	STATUS,Z
				GOTO	G3ST_END
				MOVLW	0x45
				XORWF	CURSOR,W
				BTFSC	STATUS,Z
				GOTO	G3ST_END
				MOVLW	0x48
				XORWF	CURSOR,W
				BTFSC	STATUS,Z
				GOTO	G3ST_END


G3ST_PRN2
				BCF		LCD_RW
				BCF		LCD_E
				BSF		LCD_RS ; DATA
				MOVF	TEMP,W
				MOVWF	LCD_DAT
				BSF		LCD_E
				NOP
				NOP				
				BCF		LCD_E

G3ST_END

				GOTO	SET_CURSOR

;**********************************************************************
LCD_CLR		; ОЧИСТКА ЭКРА КУРСОР НА 1 ПОЗИЦИЮ
;		CALL	BUSY		; РАБОТА С РЕГИСТРОМ УПРАВЛЕНИЯ
		CALL	Big_delay5
		CLRF	CURSOR

		MOVLW   B'00000001'	; в регистр W $01 CURSOR  START POSITION 
		GOTO	WR_COMMAND_LCD

; *********************************************************************
SET_CURSOR	; УСТОНОВИТЬ КУРСОР В МЕСTO N CURSOR
		
;		CALL	BUSY		; РАБОТА С РЕГИСТРОМ УПРАВЛЕНИЯ
		CALL	Big_delay5
		MOVLW   B'10000000'	; установить ТИП КОМАНДЫ
		IORWF	CURSOR,0
		GOTO	WR_COMMAND_LCD
	
;**********************************************************************


LCD_DEC_CURSOR
				DECF	CURSOR,1
		MOVLW   0xFF
		XORWF	CURSOR,0
		BTFSC	STATUS,Z
		GOTO 	G4ST
		MOVLW   0x3F
		XORWF	CURSOR,0
		BTFSC	STATUS,Z
		GOTO 	G5ST
			GOTO	SET_CURSOR

G4ST

		MOVLW   0x4F
		MOVWF	CURSOR
		GOTO	SET_CURSOR



G5ST
		MOVLW   0x0F
		MOVWF	CURSOR
		GOTO	SET_CURSOR

;**********************************************************************
LCD_INC_CURSOR

		INCF	CURSOR,1
		MOVLW   D'16'
		XORWF	CURSOR,0
		BTFSC	STATUS,Z
		GOTO 	G2ST	
		MOVLW   D'80'
		XORWF	CURSOR,0
		BTFSC	STATUS,Z
		GOTO 	G1ST
		GOTO	SET_CURSOR

G2ST		MOVLW   D'64'
		MOVWF	CURSOR
		GOTO	SET_CURSOR

G1ST		MOVLW   D'0'
		MOVWF	CURSOR
		GOTO	SET_CURSOR
;**********************************************************************
TABLE	; ДЛЯ ВЫВОДА ЧИСЕЛ В HEX ФОРМАТЕ
	 	ADDWF	PCL,1
		RETLW	30H
		RETLW	31H
		RETLW	32H
		RETLW	33H
		RETLW	34H
		RETLW	35H
		RETLW	36H
		RETLW	37H
		RETLW	38H
		RETLW	39H
		RETLW	41H
		RETLW	42H
		RETLW	43H
		RETLW	44H
		RETLW	45H
		RETLW	46H
;************************************
LCD_NUM		; ВЫВОД ЧИСЛА 0-F   КОД В W
		MOVWF	TEMP1
		movlw 	HIGH TABLE 	;load high 8-bit;address of Table
		movwf 	PCLATH 		;into PCLATH
		MOVF	TEMP1,0
LCD_NUM1
		ANDLW	B'00001111'
		CALL	TABLE
		BSF		FLAG_MOVE_CURSOR
		GOTO	LCD_BUTE

;************************************
LCD_NUM_D	; ВЫВОД ЧИСЛА 0-FF   КОД В W
		MOVWF	TEMP1
		movlw 	HIGH TABLE 	;load high 8-bit;address of Table
		movwf 	PCLATH 		;into PCLATH
		SWAPF	TEMP1,0
		CALL	LCD_NUM1
		MOVF	TEMP1,0
		GOTO	LCD_NUM1

; *********************************************************************


ПО распространяется под лицензией Freeware. Вы можете скачать с сайта схемы, инструкции, прошивки бесплатно.

Обсудить на форуме


Пример работы с семисегментным индикатором и кнопками
PIC16F628 ASM


BEGIN 

; УНИВЕРСАЛЬНЫЙ МОДУЛЬ ДИНАМИЧЕСКОЙ ИНДИКАЦИИ
;ИСПОЛЬЗУЕТСЯ 555ИД4 ДЛЯ ДЕШИФРАЦИИ РАЗРЯДА И 176ИД2 ДЛЯ ДЕШИФРАЦИИ ЦИФРЫ



; покажем индикатор  полностью за 4 проходa
; ПОТУШИМ 
		BSF	PORTB,1
		BSF	PORTB,2
		BSF	PORTB,3				
		BSF	PORTB,4		
; узнаем номер прохода 
		
		MOVF	CIKLE,0		; в W номер прохода
; табличное ветвление
		btfsc   STATUS,Z
		GOTO 	MCICLE0
		movwf	TEMP1
		decf	TEMP1,1
		btfsc   STATUS,Z
		GOTO 	MCICLE1
		decf	TEMP1,1
		btfsc   STATUS,Z
		GOTO 	MCICLE2
		decf	TEMP1,1
		btfsc   STATUS,Z
		GOTO 	MCICLE3
		
MCICLE3:

		BSF	PORTA,0		
		BSF	PORTA,1	; ВЫБРАЛИ РАЗРЯД (СТАРШИЙ)

		BTFSS	IND_3,0
		BCF	PORTB,3
		BTFSS	IND_3,1
		BCF	PORTB,1		
		BTFSS	IND_3,2
		BCF	PORTB,4
		BTFSS	IND_3,3
		BCF	PORTB,2	; зажжем этот разряд	
	
		goto    ENDIND							

MCICLE2:
		BCF	PORTA,0		
		BCF	PORTA,1	; ВЫБРАЛИ РАЗРЯД 

		BTFSS	IND_3,0
		BCF	PORTB,3
		BTFSS	IND_3,1
		BCF	PORTB,1		
		BTFSS	IND_3,2
		BCF	PORTB,4
		BTFSS	IND_3,3
		BCF	PORTB,2	; зажжем этот разряд	
	
		goto    ENDIND
MCICLE1:
		BSF	PORTA,0		
		BCF	PORTA,1	; ВЫБРАЛИ РАЗРЯД 

		BTFSS	IND_2,0
		BCF	PORTB,3
		BTFSS	IND_2,1
		BCF	PORTB,1		
		BTFSS	IND_2,2
		BCF	PORTB,4
		BTFSS	IND_2,3
		BCF	PORTB,2	; зажжем этот разряд	
	
		goto    ENDIND

MCICLE0:

		BCF	PORTA,0		
		BSF	PORTA,1	; ВЫБРАЛИ РАЗРЯД (ML)

		BTFSS	IND_1,0
		BCF	PORTB,3
		BTFSS	IND_1,1
		BCF	PORTB,1		
		BTFSS	IND_1,2
		BCF	PORTB,4
		BTFSS	IND_1,3
		BCF	PORTB,2	; зажжем этот разряд	
	
		goto    ENDIND
ENDIND

		INCF	CIKLE,1 	; Счетчик проходов увеличим	
		MOVLW	.4
		XORWF	CIKLE,0
		BTFSC	STATUS,Z
		CLRF	CIKLE

		MOVLW	.3	; ЗАДЕРЖКА ДЛЯ НЕ СИЛЬНО ЧАСТОЙ ИНДИКАЦИИ
		MOVWF	TEMP1
		CALL	WAIT_1
	

		
;	На индикаторе состояние рама IND_1 - IND_3


STATRT_CIKLE	; УНИВЕРСАЛЬНЫЙ МОДУЛЬ ОПРОСА КЛАВЫ ПРИ ДИНАМИЧЕСКОЙ ИНДИКАЦИИ С ПОДАВЛЕНИЕ ДРЕБЕЗГА И АВТОПОВТОРОМ
		
		
;		DECFSZ	KEY_CICLE	
;		GOTO	DALEE_1

START_IN_KEY	
;		MOVLW	.21
;		MOVWF	KEY_CICLE
		
		
		BTFSC	PORTA,5
		GOTO	NO_KEY
		
		
		movf	KEY_RETRY,1
		BTFSS	STATUS,Z
		DECF	KEY_RETRY,1 		
		
		
		
		
		MOVF	CIKLE,0
		MOVWF	KEY_TMP
		
		GOTO      CODE_KEY
				
NO_KEY		

						
		CLRF	KEY_TMP
		DECF	KEY_TMP,1
		
		
		MOVLW	.255
		XORWF	KEY_OLD,0
		BTFSC	STATUS,Z
		GOTO	CODE_KEY			



		MOVF	CIKLE,0		
		XORWF	KEY_OLD,0
		BTFSC	STATUS,Z		
		GOTO	KEY_DREBEZG
		GOTO	DALEE	
		
		
					
				
CODE_KEY		; ЗДЕСЬ В РЕГИСТРЕ KEY_TMP НОМЕР КЛАВИШИ НАЖАТОЙ ИЛИ 255 ЕСЛИ НЕ НАЖАТА

		MOVF	KEY_OLD,0
		XORWF	KEY_TMP,0
		BTFSS	STATUS,Z
		GOTO	KEY_DREBEZG
		GOTO	KEY_OK
KEY_DREBEZG			
		MOVF	KEY_TMP,0
		MOVWF	KEY_OLD	
		GOTO	DALEE		
KEY_OK
		MOVF	KEY_TMP,0
		MOVWF	KEY_OLD			

		MOVF	KEY_OLD,0
		XORWF	KEY,0
		BTFSS	STATUS,Z
		GOTO	KEY_NEW
		GOTO	DALEE 	;СОСТОЯНИЕ КЛАВЫ НЕ ИЗМЕНИЛОСЬ
KEY_NEW
		MOVF	KEY_OLD,0
		MOVWF	KEY	; ТЕКУЩЕЕ НАЖАТИЕ КОД КЛАВИШИ
		INCFSZ 	KEY,0
		GOTO 	KEY_PRESS_NEW
		GOTO	DALEE 	;ОТПУСТИЛИ  КНОПКУ
KEY_PRESS_NEW		
		BSF 	FLAG_PRESS_KEY,0
		CLRF	KEY_RETRY
		DECF	KEY_RETRY,1		

DALEE		
		movf	KEY_RETRY,1
		BTFSS	STATUS,Z		
		GOTO	DALEE_1
		BSF 	FLAG_PRESS_KEY,0
		MOVLW	.64
		MOVWF	KEY_RETRY
DALEE_1

;**********РАЗОБРАЛИСЬ С КЛАВОЙ И ИНДИКАЦИЕЙ  ПОДАВЛЕНИЕ ДРЕБЕЗГА И АВТОПОВТОР
		;ЕСЛИ ФЛАГ FLAG_PRESS_KEY УСТАНОВЛЕН НАЖАТО НОВАЯ КНОПКА - ОБРАБОТАТЬ И ФЛАГ СБРОСИТЬ
		; КОД КОПКИ В KEY


ПО распространяется под лицензией Freeware. Вы можете скачать с сайта схемы, инструкции, прошивки бесплатно.

Обсудить на форуме


Пример приема кода RC5 в прерывании
PIC16F628 ASM


Декодирование кода подобного RC5 в прерывании

 		ORG     0x004             ;  Сюда попадем если прерывание
		movwf   w_temp            ; сохраним содержание регистра W 
		movf	STATUS,w          ; Переместите регистр статуса в регистр W
		movwf	status_temp       ; сохраним  содержание регистра СТАТУСА
; тут программа обработки прерываний
;прерывания по таймеру
		BCF	INTCON,2	; RESET FLAG TIMER
	
;*************20 mgz

		MOVLW	(.256-.7) ;.16)	; таймер считает +1 от загруженного значения при переполнении - INT 
		MOVWF	TMR0		; ЗДЕСЬ МЫ 25.6MKS*2

; ЗДЕСЬ МЫ КАЖДЫЕ 53 МИКРОСЕКУНДЫ 
; ПРЕРЫВАНИЕ ДОЛЖНОБЫТЬ КОРОЧЕ 50 МИКРОСЕКУНД
;ИСПОЛЬЗУЕМАЯ ГЛУБИНА СТЕКА = 

		INCFSZ	_TIMER2,1		; УВЕЛИЧИМ ДО 255
		GOTO     _INCNEXT 
		DECF	_TIMER2,1
; накопительный счетчик  при возникновениии фронта абнуляем

_INCNEXT		
;----------------

	MOVF	PORTA,0
	ANDLW	b'00100000'; и чо у нас на входе?
	MOVWF	FLAG_IN1; временная переменная состояние входа
	XORWF	FLAG_IN,0
	BTFSC	STATUS,Z
	GOTO	ENDIRQ
	MOVF	FLAG_IN1,0	
	MOVWF	FLAG_IN
	; СОСТОЯНИЕ ВХОДА ИЗМЕНИЛОСЬ
	CLRF	FLAG_TIME
	MOVF	_TIMER2,0	
	MOVWF	TMP_TIME
	CLRF	_TIMER2 ; обнулим счетчик прерываний

	MOVLW	.10;.13 ; BAD
	SUBWF	TMP_TIME,1	
	BTFSS	STATUS,C		
	GOTO	_BAD
	
	MOVLW	.16;.12 ; 25*53 =1325 = 0,89 MC *1,5
	SUBWF	TMP_TIME,1	
	BTFSS	STATUS,C	
	GOTO 	OK35 ; 1 PERIOD
	MOVLW	.22;.17 ; (25+17)*53 = 2226 = 1.778+0.89/2
	SUBWF	TMP_TIME,1	
	BTFSS	STATUS,C	
	GOTO 	OK69; 2 PERIODA
	
	MOVLW	.45 ; BAD
	SUBWF	TMP_TIME,1	
	BTFSS	STATUS,C		
	GOTO	_BAD	
	
	GOTO 	MAX125
	
		; УСТАНОВИМ  БИТЫ СООТВЕТСТВУЮЩИЕ ВРЕМЕНИ МЕЖДУ ФРОНТАМИ

OK35
	BSF     	FLAG_TIME,1
	GOTO	_DECODE	
OK69
	BSF     	FLAG_TIME,2
	GOTO	_DECODE	
	
MAX125
	BSF     	FLAG_TIME,4
	GOTO	_DECODE
		
_BAD	CLRF	COUNT_BIT
	GOTO	ENDIRQ	

; 50 КОМАНД ИЗ 256 ИЛИ 10 МИКРОСЕКУНД
; СТЕКНЕ ИСПОЛЬЗОВАЛИ

;     ТУТ НАДО СОБСТВЕННО ДЕКОДЕР	

;ФРОНТ ПРОИЗОШЕЛ
;FLAG_IN БИТ5 - ТЕКУЩИЙ ЛОГИЧЕСКИЙ УРОВЕНЬ ПОСЛЕ ФРОНТА
;
;ВРЕМЯ УЖЕ ПОСЧИТАНО И ВЫБРАН ДИАПАЗОН
;FLAG_TIME,
;БИТ0 - ОЧЕНЬ МАЛО
;БИТ1 -1 ПОЛУПЕРИОД
;БИТ2 - 2 ПОЛУПЕРИОДА
;БИТ 3  -3 ПОЛУПЕРИОДА
;БИТ 4 -ОЧЕНЬ МНОГО
;
;ЕСЛИ ПРОДЦЕДУРА НЕ НАЧАТА ТО FLAG_START РАВЕН 0
_DECODE
		BTFSS	FLAG_TIME,2   ; ВРЕМЯ = 2 ТАКТА
		GOTO	_NEXT1
 		RLF	ML_BYTE		;СДВИГ ВЛЕВО
 		RLF	ST_BYTE
 		RLF	ST1_BYTE
 		BCF	ML_BYTE,0		;КОПИРОВАНИЕ БИТА С ИНВЕРСИЕЙ
 		BTFSS	ML_BYTE,1
		BSF	ML_BYTE,0
		INCF 	COUNT_BIT,1	; УВЕЛИЧИМ СЧЕТ БИТ
		GOTO	_CRC
		
_NEXT1		BTFSS	FLAG_TIME,4   ; START BIT НАЧАЛО
		GOTO	_NEXT2
		BTFSC	FLAG_IN,5 
		GOTO	_END_DECODE		; ОШИБКА СТАРТ БИТА 
		CLRF	COUNT_BIT		
		INCF 	COUNT_BIT,1	; УВЕЛИЧИМ СЧЕТ БИТ
 		CLRF	ML_BYTE		; ОЧИСТИМ ВСЕ
 		CLRF	ST_BYTE		
 		BSF	ML_BYTE,0		; ЭТО ПЕВЫЙ СТАРТ БИТ
		GOTO	_CRC
				
_NEXT2		BTFSC	FLAG_TIME_OLD,4   
		GOTO	_CRC
		BTFSS	FLAG_TIME_OLD,1
		GOTO	_CRC
 		RLF	ML_BYTE		;СДВИГ ВЛЕВО
 		RLF	ST_BYTE
 		RLF	ST1_BYTE
 		BCF	ML_BYTE,0		;КОПИРОВАНИЕ БИТА 
 		BTFSC	ML_BYTE,1
		BSF	ML_BYTE,0
		INCF 	COUNT_BIT,1	; УВЕЛИЧИМ СЧЕТ БИТ
		CLRF	FLAG_TIME
		GOTO	_CRC		
		
_CRC		BSF	FLAG_START,0;УСТАНОВЛЕН ФЛАГ ПРИЕМА
		MOVLW	.14
		SUBWF	COUNT_BIT,0
		BTFSS	STATUS,Z
		GOTO	_END_DECODE
		; ТУТ ПРОВЕРИТЬ СРС
		CLRF	COUNT_BIT

		CLRF	CRC_DATA

;		BTFSC	ST1_BYTE,2
;		INCF	CRC_DATA,1
;		
;		BTFSC	ST1_BYTE,1
;		INCF	CRC_DATA,1
;		
;		BTFSC	ST1_BYTE,0
;		INCF	CRC_DATA,1
;		
;		BTFSC	ST_BYTE,7
;		INCF	CRC_DATA,1
;		
;		BTFSC	ST_BYTE,6
;		INCF	CRC_DATA,1
;		
		BTFSC	ST_BYTE,5
		INCF	CRC_DATA,1
		
		BTFSC	ST_BYTE,4
		INCF	CRC_DATA,1		
		
		BTFSC	ST_BYTE,3
		INCF	CRC_DATA,1
		
		BTFSC	ST_BYTE,2
		INCF	CRC_DATA,1
		
		BTFSC	ST_BYTE,1
		INCF	CRC_DATA,1
		
		BTFSC	ST_BYTE,0
		INCF	CRC_DATA,1		
		
		BTFSC	ML_BYTE,7
		INCF	CRC_DATA,1
		
		BTFSC	ML_BYTE,6
		INCF	CRC_DATA,1
		
		BTFSC	ML_BYTE,5
		INCF	CRC_DATA,1
		
		BTFSC	ML_BYTE,4
		INCF	CRC_DATA,1		
		
		BTFSC	ML_BYTE,3
		INCF	CRC_DATA,1
		
		BTFSC	ML_BYTE,2
		INCF	CRC_DATA,1
		
		BTFSC	ML_BYTE,1
		INCF	CRC_DATA,1	; НАКОПЛИ БИТЫ
		
		CLRF	FLAG_ERROR_CRC	; СБРОСИЛИ ФЛАГ ОШИБКИ	
		MOVLW	.1		;
		ANDWF	CRC_DATA,1	;ВЫДЕЛИЛИ МЛ БИТ
		ANDWF	ML_BYTE,0		; И ИЗ ПОСЫЛКИ
		XORWF	CRC_DATA,0	; СРАВНИЛИ	
		BTFSS	STATUS,Z
		INCF	FLAG_ERROR_CRC,1	; УСТАНОВИМ ФЛАГ ЕСЛИ СРС НЕ СОВПАЛА
		CLRF	FLAG_START	;СБРОШЕН ФЛАГ ПРИЕМА
		BSF	FLAG_DATA,0	;УСТАНОВЛЕН ФЛАГ НАЛИЧИЯ ДАННЫХ
 
 ;		RRF	ST1_BYTE		
 ;		RRF	ST_BYTE
 ;		RRF	ML_BYTE		


_END_DECODE	MOVF	FLAG_TIME,0
		MOVWF	FLAG_TIME_OLD


;*********
ENDIRQ
		

		movf    status_temp,w     ;  ВОССТАНОВИМ ВСЕ
		movwf	STATUS            ;  register contents
		swapf   w_temp,f
		swapf   w_temp,w          ; restore pre-isr W register contents
		retfie                    ; Bозврат из обработчика прерываний
		
		
		; ВСЕГО 110 КОМАНД ИЛИ 22 МИКРОСЕКУНДЫ СТЕК НЕ ИСПОЛЬЗОВАЛИ
		;FLAG_ERROR_CRC = 1	;УСТАНОВЛЕН ФЛАГ ЕСЛИ СРС НЕ СОВПАЛА
		;FLAG_START =1	;ФЛАГ ПРИЕМА - ИДЕТ ПРИЕМ ДАННЫХ
		;FLAG_DATA =1	;ФЛАГ НАЛИЧИЯ ДАННЫХ

;**********************************************************************


ПО распространяется под лицензией Freeware. Вы можете скачать с сайта схемы, инструкции, прошивки бесплатно.

Обсудить на форуме


Термометр на DS18B20

     Схема бытового термометра с диапазоном от -55 до +99 градусов с точностью 1 градус , и точностью 0,1 градус в интервале от -10 до +10
При нажатии на кнопку схема автоматически включается и показывает текущую температуру в течении 5 секунд а затем отключается. Как показала практика элементов питания хватает на 2 года и более . Для подключения датчика был использован плоский телефонный четырех-жильный провод длинной три метра. Сам датчик и место припайки к кабелю защищено от внешней среды термоусадочной трубкой. Термометр смонтирован в миниатюрной коробочке размером 6x3x1 см и закреплен в удобном месте. Для стабильной работы в холодных помещениях необходимо исключить диод в цепи питания.

  Схема

    


ПО распространяется под лицензией Freeware. Вы можете скачать с сайта схемы, инструкции, прошивки бесплатно.

Прошивка
Исходный код
Обсудить на форуме


Лабораторный блок питания с микроконтроллером.

     Блок питания имеет два независимых канала со стабилизацией тока и напряжения, и третий независимый канал с фиксированными напряжениями

Устройство имеет
- два источника с регулируемым выходом 0-30вольт и регулируемым ограничением по току 0,02 - 3 ампера.
- источник с фиксированными напряжениями 5 и 12 вольт с ограничением по току 1,5 ампера.
- регулируемые источники имеют цифровую индикацию напряжения, установленного тока ограничения , текущего потребляемого тока нагрузкой, индикатор перехода в режим стабилизации тока.
- для каждого регулируемого источника есть внешний вход отключения, и таймер программатор
- таймер программатор в обычном режиме показывает минуты и секунды включенного состояния,с возможностью сброса. - в режиме таймер можно установить время до 23час 59 мин и запустить обратный отчсчет, по окончанию которого источник отключится. Можно выйти из этого режима вручную до отключения или изменить индикацию обратного отсчета - ЧЧ:ММ или ММ:СС.

     За основу схемы регулируемых источников была взята хорошо зарекомендовашая себя схема лабораторного блока питания, опубликованная здесь :http://www.electronics-lab.com/projects/power/003/index.html
Индикация и управление. Для повышения точности использован отдельный источник опорного напряжения для АЦП и делается 4 замера с нахождением среднего значения. Предлы измерения напряжения 0-51 вольт с шагом 0,05 вольт, тока 0-5,1 ампера с шагом 0,01 ампер. Резистор Р8 - установка тока , свыше которого переходит в режим стабилизации тока , Р9 - установка напряжения
Правильно собранный из исправных элементов блок питания в настройке не нуждается. переменным резистором Р2 выставить опорное напряжение АЦП в пределах 4,5- 4,6 вольт и провести резистором Р5, Р6, Р7 калибровку показаний индикаторов по образцовым приборам.

     Устройство размещается в подходящем по размерам корпусе , рекомендуется использовать принудительную вентиляцию при долговременной работе на больших токах, так как выделяемая тепловая мощность может достигать 100Вт.

  Схема

  Разводка печатной платы ( без схемы внешнего отключения)


ПО распространяется под лицензией Freeware. Вы можете скачать с сайта схемы, инструкции, прошивки бесплатно.

Разводка
Прошивка
Исходный код
Обсудить на форуме


Страницы <1> <2> <3> <4> <5>