Onixx

Помогите Студенту-Чайнику По Мк

698 сообщений в этой теме

Onixx    0

Здравствуйте! Уважаемые форумчане, помогите разобраться в большом количестве информации. Имеется задача создать примитивное информационное табло:

1)создать светодиодную матрицу 4*4, из двухцветных (зелено-красных, 3 вывода) светодиодов, по сути 32 диода, светодиоды самые простые 150 мВт.

2)матрица управляется микроконтроллером с компьютера через какой-либо интерфейс,

без всяких внешних программаторов. Желательно интерактивное управление(нажал мышкой по кнопке диод загорелся), но можно и просто записать программу в память контроллера.

3)Каждый светодиод управляется отдельно, имеет 16 уровней яркости(1 байт)

4)Питание от бытовой сети

Вопросы: 1) Какой недорогой, доступный в продаже, известный(в плане различных программных и схемных решений) контроллер выбрать?

2) Какой, совместимый с контроллером, драйвер СДУ(редуктор) под мои светодиоды выбрать? я понимаю что ШИМ можно реализовать программно, но возможно количество и мощность светодиодов будет увеличиваться. Да и как –то красивее получается

3) Какие-либо советы по функциональной схеме (принципиальные моменты). Если подобные конкретные вопросы рассматривались(общей информации много), просьба дать ссылки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Migray    5

1. Провокация "религиозной войны". По доставаемости - сам где обитаешь?

Доступность схем и решений по моему сейчас для любого МК не проблема.

Для чего делаешь, условия применения (температура, ЭМП и т.д.)

Надежность важна, или это игрушка/диплом, мигает да и ладно?

Если выделенные пункты важны, выбор несколько ограничивается, если нет - бери любой попавшийся.

Или выбирать будет тот, кто выразит желание помочь. В смысле что он сам знает, такой МК и будет :)

2. ШИМ конечно реализовать просто, но 32 канала ...

Посмотри сюда, может что и приглянется.

Вот только с 2-цветными светодиодами сложнее, лучше было-бы раздельные, управлять проще.

Интерфейс, по которому управляется TLC5922 или TLC5941 очень простой, стыкуется с любым МК.

По поводу программатора. Тот или иной все равно потребуется.

Бояться этого не надо, они простые.

Частенько хватает преобразователя RS-232 -> TTL

Этот-же преобразователь тебе может пригодиться для связи готового устройства с персоналкой.

С питанием проблем быть не должно. Определишься с числом и мощностью светодиодов, подсчитаете суммарную мощность светодиоды+МК+связь с компом, тогда и БП сделаете.

Изменено пользователем Migray

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
alibedog    0

Может кто поможет с курсчачом ? вот задание....

Разработать МК – систему (ТАЙМЕР) для включения/выключения электрических цепей агрегатов автоматизированного фотообрабатывающего комплекса. Количество этапов обработки на одной линии комплекса – 8, количество линий – 4. Продолжительность каждого этапа в зависимости от вида обработки составляет 100 -600 секунд. Время паузы между операциями – 5 с. Запуск каждой линии осуществляется с пульта оператора. Поэтапное расписание работы каждой линии устанавливается путем загрузки из ПЭВМ через последовательный канал ввода. Управляющий ток для включения/выключения агрегатов комплекса - 20 мА.

Отладить модули разработанной программы с помощью симулятора.

Оценить потребляемую мощность устройства.

Тип МК: Atmel AT89С51

или посоветуйте с чего начать..)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
alts    1

С изучения архитектуры МК, возможностей переферии.

Конкретизировать задание в разрезе сначала одной линии, как то: точность выдержки параметров вкл/выкл по времени, последовательность...синхронность линий нужна или нет.

А уже потом пытаться решить задачу имеющимися средствами. В принципе - ничего особо сложного. Но потребует сосредоточения мыслительных способностей... :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lexi    1

Сюда буду сносить все темы каксающиеся лабараторных, практических и прочих работ и заданий.

И я тоже (alkl)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Einstein    0

Добрый день Пико строители)).... дела насущные как говорится... скоро сдавать курсовую... поэтому решил начать ее делать... а тех задание у меня разработать на 24 пике приемо-передатчик, с частотной модуляцией. для начала решил разобраться с передатчиком, посему несколько вопросов. Для реализации думаю использовать ШИМ модуль который уже имеется в пиках но есть некоторая сложность)).... генерировать то он генерирует только не могу разобраться как изменить частоту. Может кто нибудь покажет примеры работы с ШИМ модулями желательно с комментариями. Просто пока еще разбираюсь может и дойдет до меня что там и как, но чтобы не терять времени решил и у знатоков спросить пишу кстати, говоря на С так что примеры на нем приветствуються))). А то что то на форуме .... про PIC24 ничего нету ...неужели народ еще не использует?)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Guedda    1

Добрый день, уважаемые знатоки.

У меня диплом, который переворачивает всю мою жизнь. Есть сушильная печь, и есть терморегулятор для нее на основе PIC16F876. Одной из целей моей дипломной работы есть усовершенствование терморегулятора, т.е. переделать под новый процессор. какой процессор Вы мне посоветуете, чтобы меньше было изменений в схеме (более новый, что ли)?

Извиняюсь за такой глупый вопрос. Просто не разбираюсь в них.

Заранее благодарен за ответ.

Изменено пользователем Guedda

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
fredo    0

Guedda

Одной из целей моей дипломной работы есть усовершенствование терморегулятора, т.е. переделать под новый процессор.

А какие параметры вы хотите улучшить? Чем вас не устраивает PIC16F876?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
kolot    0

Привет всем! Нужна помощь! Решил собрать схему управления 8-мью светодиодами с помощью PIC16F877. Опыта работы с Ними 0. Делал все по аналогии со статьями с одного сайта.

Вот прога для того чтобы все светодиоды загорелись:

Используется микроконтроллер PIC16F877. Частота кварца 20 МГц.

Код:

;==================================================================

; Описание программы

; Данная программа заставляет все светодиоды загореться

;==================================================================

;================================================

; Настройка и конфигурация микроконтроллера

;================================================

LIST p=16F877

__CONFIG H'3F72'

;================================================

; Инициализация регистров специального назначения

;================================================

INTCON equ 0x0B

STATUS equ 0x03

PORTB equ 0x06

TRISB equ 0x86

;================================================

; Инициализация констант

;================================================

RP0 equ 0x05

;================================================

; Инициализация переменных в памяти данных

;================================================

;================================================

; Начало программы

;================================================

ORG 0x00

goto Start

ORG 0x05

Start:

clrf INTCON ;запрещаем все прерывания

;===============================================

; Настраиваем линии порта PORTB на выход

;===============================================

bsf STATUS, RP0 ;переходим в банк 1

movlw b'00000000' ;помещаем в аккумулятор число 0

movwf TRISB ;устанавливаем линии порта

;PortB на выход

bcf STATUS, RP0 ;переходив в банк 0

;===============================================

; Закончили настройку

;===============================================

movlw .255 ;помещаем в аккумулятор число 255

movwf PORTB ;перемещаем число из аккумулятора

;в регистр DelL

Loop:

nop ;ничего не делаем

goto Loop ;переходим на метку Loop

End

А вот пример еще одной программы:

Используется микроконтроллер PIC16F877. Частота кварца 20 МГц.

Код:

;========================================================================================

; Описание программы

; Данная программа каждые 1 секунду увеличивает значение порта PORTB

; и тем самым по-разному заставляет светиться светодиоды,

; которые подключены к ножкам порта PORTB

;========================================================================================

;================================================

; Настройка и конфигурация микроконтроллера

;================================================

LIST p=16F877

#include

__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _LVP_OFF & _CPD_OFF& _CP_OFF

;================================================

; Инициализация переменных в памяти данных

;================================================

DelH equ 0x20

DelM equ 0x21

DelL equ 0x22

;================================================

; Начало программы

;================================================

ORG 0x00

goto Start

ORG 0x05

Start:

clrf INTCON ;запрещаем все прерывания

;===============================================

; Настраиваем линии порта PORTB на выход

;===============================================

bsf STATUS, RP0 ;переходим в банк 1

movlw B'00000000' ;помещаем в аккумулятор число 0

movwf TRISB ;устанавливаем линии порта PortB на выход

bcf STATUS, RP0 ;переходим в банк 0

;===============================================

; Закончили настройку

;===============================================

;===============================================

; Переходим к основному циклу программы

;===============================================

clrf PORTB ;очищаем регистр порта PORTB

nop ;ничего не делаем

nop

nop

Loop:

movlw .26 ;заносим в аккумулятор число .26

movwf DelH ;копируем содержимое аккумулятора в регистр DelH

movlw .94 ;заносим в аккумулятор число .94

movwf DelM ;копируем содержимое аккумулятора в регистр DelM

movlw .109 ;заносим в аккумулятор число .109

movwf DelL ;копируем содержимое аккумулятора в регистр DelL

nop

Delay_L:

decfsz DelL, F ;уменьшаем содержимое регистра DelL и сохраняем

;результат в регистре DelL, если содержимое регистра

;равно 0, то пропускаем сл. команду.

goto Delay_L ;переходим на метку Delay_L

Delay_M:

decfsz DelM, F ;уменьшаем содержимое регистра DelM и сохраняем

;результат в регистре DelM, если содержимое регистра

;равно 0, то пропускаем сл. команду.

goto Delay_L ;переходим на метку Delay_L

Delay_H:

decfsz DelH, F ;уменьшаем содержимое регистра DelH и сохраняем

;результат в регистре DelH, если содержимое регистра

;равно 0, то пропускаем сл. команду.

goto Delay_L ;переходим на метку Delay_L

incf PORTB, F ;увеличиваем содержимое регистра PORTB и сохраняем

;результат в регистре PORTB

goto Loop ;переходим на метку Loop

End

Вот схема, по которой я все собирал.

Народ, посмотрите пожалуйста, что не так и как вообще правильно надо все это делать.

А то горит димплом и времени на разборы полётов практически не осталось.

Если кто проживает в Москве и шарит в этом вопросе. Чирканите в Асю 499318459, в долгу не останусь.

post-55153-1211552401_thumb.png

post-55153-1211552685_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    484

Классный диплом светодиодами моргать.

А в чём проблема то собстно ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
kolot    0

Проблема в том, что собраное устройство не работает. Помогите найти ошибку!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ragnarok    0

Друзья, нужна помощь. Я учусь в техническом ВУЗе, и получил задание на курсовую работу спроектировать кодовый замок на базе микропроцессора интел 8051 с 12-кнопочной клавиатурой, и открытием только в том случае, когда сопротивление руки открывающего мало отличается от заданного. Как взяться за дело - даже не знаю.((( Предполагаю, что код с клавиатуры будет обрабатываться прошивкой, что же до руки - то на ручку будет подаваться напряжение, небольшое)) вольтметр измерит напряжения на ручке, сигнал пойдет в АЦП, а после в микропроцик. Беда в том,что я не знаю, на какие входы что подавать. Помогите пожалуйста!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Guedda    1

Извините за то, что в первом сообщении допустил глупость написать полную ересь. Сейчас исправлю.

Так как я не имел подобных случаев в своей учебе, а диплом сделать надо, то у меня есть к Вам вопросы. Задание на диплом мое таково:

Есть схема терморегулятора для сушильной печи (на основе МК PIC16F876). Нарисована она от руки. Есть код:

;  /=================================================\
;  ¦			ПРОГРАММА  ПРОЦЕССОРА				¦
;  ¦		  терморегулятора сушильной печи		 ¦ 
;  ¦			  Контроллер PIC16F876			   ¦
;  \=================================================/
;	 Кварцевый генератор, тактовая частота 4 МГц
;			   1 команда = 1 мкс
;		   Используется сторожевой таймер
;
  include   p16f876.inc
 list
;	-----  Биты регистра PortA  -----
Heat	equ	.2;Индикатор режима и реле "Нагрев"
Warm	equ	.3;Включение реле слабого нагрева
Hot	equ	.5;Включение реле сильного нагрева


;	-----  Биты регистра PortB  -----
RS	equ	.0;Сигнал "Сброс" на ЖКИ
RW	equ	.1;Выбор  "Чтение-Запись" на ЖКИ
E	equ	.2;Сигнал "Разрешение" на ЖКИ

Dn	equ	.4;Кнопка "Вверх"
Up	equ	.5;- | -  "Вниз"
Psk	equ	.6;- | -  "Пуск"
Stp	equ	.7;- | -  "Стоп"

;	-----  Биты регистра PortC  -----
Tone	equ  .2	  ;Выход на звук
;		.3;Подсветка ЖКИ		
D4_0	equ	.4;Линия данных на ЖКИ 4 (или 0)
D5_1	equ	.5;--- | --- | --- | - 5 (или 1)
D6_2	equ	.6;--- | --- | --- | - 6 (или 2)
D7_3	equ	.7;--- | --- | --- | - 7 (или 3)

; Биты регистров АЦП

Pusk	equ  .2	  ;Бит запуска АЦП GO/DONE
Adr0	equ  .3	  ;Биты адреса входного
Adr1	equ  .4	  ;канала АЦП

;   --- Вспомогательные регистры и биты ---
Ron0	  equ  h'20';Используются для отсчета
Ron1	  equ  h'21';тактов времени звонка
Cnt0	  equ  h'22';Вспомогательные
Cnt1	  equ  h'23';регистры-счетчики
Cnt2	  equ  h'24';

Bity	  equ  h'25';Регистр флагов,
				;назначения флагов:
TonZv   equ  .7	  ;Бит тона звонка

Sost	  equ  h'26';Регистр хранения состояния,
				;назначение битов:
PsSt	  equ  .0	  ;Бит "Пуск-Стоп" :
	;0 - режим "Стоп", приглашение к "Пуск"
	;1 - режим "Пуск", приглашение к "Стоп"
PUS	equ	.1;Фиксация "Пуск-Стоп" 
UstT	  equ  .2	  ;Флаг установки: 0 - температуры, 1 - время
Timm	   equ  .3	  ;Установка времени выдержки:0 - часы, 1 - минуты

;  Регистры преобразования Bin -> ASCII
Dop10	equ	h'29';Дополнение до 10 разрядов
Kod	equ	h'30';Вспом. регистр
Kod0	equ	h'31';Единицы
Kod1	equ	h'32';Десятки
Kod2	equ	h'33';Сотни
Ncyfr	equ	h'34';
PA	equ	h'35';Вспом. рег. PortA
PB	equ	h'36';Вспом. рег. PortB

; ---  Регистры 8-разрядного умножения  ---
ArIn1	equ	h'40';1-й сомножитель
ArIn2	equ	h'41';2-й сомножитель
ArIn1H	equ	h'42';Дополнение к ArIn1 - старший байт
ArResL	equ	h'43';Младший байт результата
ArResH	equ	h'44';Старший байт результата

Ns	equ	h'45';Вспом. счетчик секунд 
Nm	equ	h'46'
Nc	equ	h'47'
Nd	equ	h'48'


DisReg	equ	h'54';Вспомогательный регистр дисплея
DisRg1	equ	h'55';Вспомогательный регистр дисплея
Sec	equ	h'56';
Npt	equ	h'57';Номер пункта, к которому перейти
	;при нажатии кнопки
Dop1	equ	h'58'
Tust	equ	h'59';Установленная температура
	;в единицах АЦП
Tum	equ	h'5b';
Tti	equ	h'5A';Текущая измеренная температура
; ----------------------------------

Ev1Sec	equ	h'60';Регистры 
Ev1Min	equ	h'61';установки времени 
Ev1Czs	equ	h'62';выдержки
Ev1Sut	equ	h'63';
Ev1Cnt	equ	h'64';
Ev2Sec	equ	h'65';
Ev2Min	equ	h'66';
Ev2Czs	equ	h'67';
Ev2Sut	equ	h'68';
Ev2Cnt	equ	h'69';
Ev3Sec	equ	h'6A';
Ev3Min	equ	h'6B';
Ev3Czs	equ	h'6C';
Ev3Sut	equ	h'6D';
Ev3Cnt	equ	h'6E';
Nsec	equ	h'6F';Счетчик секунд по Timer1
Nmin	equ	h'70';Регистры 
Nchas	equ	h'71';подсчета 
Nsut	equ	h'72';общего времени

Tc120	equ	.200;Калибровочное значение АЦП на 110C
; ----------------------------------

;			   ---   ИНИЦИАЛИЗАЦИЯ   ---

OOO	 org	 .0
	goto	Start		 ;Переход на инициализацию
	org	 .4			;Здесь вектор прерывания,
	clrf	intcon		;Запрещаем прерывания
	goto	Start		 ;
	org	 h'10'
Start   movlw   h'00'		 ;Начальная установка PortA
	movwf   PortA		 ;и PortB после включения, чтобы
bsf	PortA,Hot
	movlw   b'00000000';не возникло кризисных ситуаций
	movwf   PortB
bcf	ADcon0,.0
	bcf	 Status,RP1	;
	bsf	 status,RP0	;
;Задаем Банк1 для установки tris-регистров
	movlw   b'000011'	 ;Определяем  биты порта A
	movwf   trisA		 ;на вывод (0) и ввод (1)
	movlw   b'11110000';Определяем биты порта В
	movwf   trisB		 ;на ввод и вывод (индикатор)
	movlw   b'00000000';Определяем биты порта C
	movwf   trisC		 ;на ввод и вывод
	clrf	intcon		;Запрещаем прерывания
	clrwdt				;Обнуляем сторожевой таймер
	movlw   b'00000001';Устанавливаем предварительный
	movwf   option_reg	;делитель перед TMR0, :4,
						;тогда 1 такт TMR0=4 мкс,
	;Включаем на PortB подтягивающие резисторы
movlw	.7;Установка результата АЦП - влево, т.е. 2 

младших
movwf	ADcon1;разряда - в старших разрядах старшего 

байта, 
	;все входы - цифровые
movlw	h'50';Установка периода Тмр2: 4 кГц
movwf	PR2;
	bsf	 Pie1,Tmr1ie;Разрешаем прерывания от Таймера1 
;Переходим на Банк0
	bcf	 status,RP0	  

;		  ---  Инициализация Timer1  ---
	movlw   b'00001111';Установка режима Timer1 - внешний
	movwf   T1Con		 ;кварц, делитель 1:1, без синхронизации,
						  ;при этом временная сетка 2 сек
clrf	Npt;
clrf	Nsec		  ;
clrf	Nmin		  ;
clrf	Nchas		 ;
clrf	Nsut		  ;
clrf	Kod0
clrf	Kod1
clrf	Kod2
clrf	Ev1Sec	
clrf	Ev1Min	
clrf	Ev1Czs	
clrf	Ev1Sut	
clrf	Ev1Cnt	
clrf	Ev2Sec	
clrf	Ev2Min	
clrf	Ev2Czs	
clrf	Ev2Sut	
clrf	Ev2Cnt	
clrf	Ev3Sec	
clrf	Ev3Min	
clrf	Ev3Czs	
clrf	Ev3Sut	
clrf	Ev3Cnt	
clrf	Sost
movlw	.10;Начальная установка
movwf	Ev1Czs;времени - часов
movlw	.00;и минут
movwf	Ev1Min;

movlw	.135;
movwf	Tust;Начальная установка кода Т=120 С
movlw	h'FF'
movwf	PA

;	 ---  Инициализация Timer2  в режиме ШИМ  ---
movlw	b'00000001'
movwf	T2con;Устанавливаем режим Таймер2 - 
	;пределитель :4
bsf	CCP1CON,.2
bsf	CCP1CON,.3
movlw	h'28';Установка ширины импульса
movwf	CCPR1L;

;  Помигаем подсветкой
bsf	PortC,.3;Включаем подсветку
call	_02sec
bcf	PortC,.3;Гасим подсветку
call	_02sec
bsf	PortC,.3;Включаем подсветку
call	_02sec
bcf	PortC,.3;Гасим подсветку
call	_02sec
bsf	PortC,.3;Включаем подсветку


;				 --- НАЧАЛО ПРОГРАММЫ ---


;		- Начало активных действий -
Nach
	bsf	Status,RP0	 ;Банк1 - установка спец. регистров
	clrwdt
	movlw  b'00001111'	;Устанавливаем предварительный
	movwf  Option_reg	 ;делитель после WDT, :128,
						  ;тогда период WDT около 2,5 с
	bcf	Status,RP0	 ;Банк0 
call	_02sec
call	IniDis

bcf	PortC,.3;Включили подсветку

; Выводим "Готов к работе"
	call	Crs_1		 ;
	movlw   .16		;
	movwf   Cnt1		  ;
	clrf	Cnt0		  ;
TxtPrn3
	movlw   high	DevRdy;"Готов к работе"
	movwf   PClath
	call	DevRdy		 ;
	call	PrnSmb
	incf	Cnt0,f
	decfsz  Cnt1,f
	goto	TxtPrn3;Выводим очередной символ


bsf	T2con,Tmr2on;Включаем Таймер2 - звук
call	_02sec;
bcf	T2con,Tmr2on;Выключаем Таймер2
bcf	PortA,Heat;Выключаем индикацию
clrf	Tmr1h
bcf	Pir1,Tmr1if;Сбрасываем флаг прерывания
movlw	.2
movwf	Sec

GotR	clrwdt
btfss	Pir1,Tmr1if
goto	GotR
bcf	Pir1,Tmr1if;Сбрасываем флаг прерывания
decfsz	Sec,f
goto	GotR;Ждем 2*2=4 секунды

bsf	T2con,Tmr2on;Включаем Таймер2 - звук
call	_02sec;
bcf	T2con,Tmr2on;Выключаем Таймер2

bsf	PortC,.3;Выключаем подсветку

;Выводим информацию - "Не отвлекать ..."
call	ClrDis
	call	Crs_1		 ;
	movlw   .16		;
	movwf   Cnt1		  ;
	clrf	Cnt0		  ;
TxtPrn0
	movlw   high	NeOt;"Не отвлекать -"
	movwf   PClath
	call	NeOt		 ;
	call	PrnSmb
	incf	Cnt0,f
	decfsz  Cnt1,f
	goto	TxtPrn0;Выводим очередной символ

	call	Crs_2		 ;
	movlw   .16		;
	movwf   Cnt1		  ;
	clrf	Cnt0		  ;
TxtPrn1
	movlw   high	Wrkg  ;"работаю !!!"
	movwf   PClath
	call	Wrkg		  ;
	call	PrnSmb
	incf	Cnt0,f
	decfsz  Cnt1,f
	goto	TxtPrn1;Выводим очередной символ

;	call	Res_Data


	bsf	 Intcon,RBIE;Разрешаем прерывания от PortB
	bsf	 Intcon,PEIE;Разрешаем внешние прерывания(Таймер1)
; Прошла инициализация и вывод информациии

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

; Основной цикл работы - ждем запроса прерывания и
; выход из режима Sleep
Loop0

bcf	Pir1,Tmr1if;Сбрасываем флаг прерывания
	bcf	 Intcon,RBIF;Сбрасываем флаг прерывания
bsf	Tmr1h,.7;Устанавливаем период 1 сек
movf	Sec,f
btfsc	Status,Z
goto	Loop1
decf	Sec,f
btfsc	Status,Z
bsf	PortC,.3;Выключить подсветку

Loop1	clrwdt
	bcf	Intcon,RBIF	;Сбрасываем запрос прерывания
	sleep				 ;Уснули !
; - Что-то вывело из режима Sleep - будем смотреть, что именно -
clrwdt				;Обнуляем сторожевой таймер

btfss	Pir1,Tmr1if;Проверяем прерывание от Таймер1
goto	BTst;Не было - проверим PortB (кнопки)

call	TimCnt;Да - подсчитываем время, анализируем
movlw	.0;Номер канала измерения т-ры - 0-й
call	ADCrun;Измеряем т-ру

;Нормализация на 100 С

movf	ADresh,w
movwf	ArIn1
movwf	Tti;Результат измерения
; Температура в кодах АЦП
movlw	.212;Умножаем на (100/АЦП)*256
;(показания АЦП при кипении)
movwf	ArIn2
call	Mult8_8
movf	ArResH,w
call	Bin_Asc

; -------------------------------------------------
; ----- АНАЛИЗ СТЕПЕНИ НАГРЕВА -----
; Включаются нагреватели - Warm -  реле К3 включено - "1"
; Hot - реле К4 выключить - "0"
btfss	Sost,PsSt;Режим - пуск?
goto	Nastr;нет - настройка
movf	Ev1Czs,w;Проверяем прошедшее
subwf	Nchas,w;время
btfss	Status,C
goto 	Nottime;Еще не закончилось
bcf	PortA,Heat;Да - отключаемся
bcf	Porta,Warm;Нагрето, 
bsf	Porta,Hot;выключаем
goto	Nastr;и время закончилось
Nottime	
;Сравниваем с минимальной температурой 
movlw	.30	
subwf	Tust,w
movwf	Tum;Запоминаем как нижнюю температуру нагрева
movf	Tum,w;Проверим - уже достигли?
subwf	Tti,w;Сравним с текущей Tti
btfss	Status,C;Превысила?
goto	Cold;Нет - продолжаем греть
bcf	Porta,Warm;Да - выключаем часть нагревателей
movf	Tust,w;Сравниваем с установленной температурой
subwf	Tti,w;Вычитаем Tti-Tust
btfss	Status,C;Превысила?
goto	Cool;Нет - Холодно - включить
bcf	Porta,Warm;Нагрето, 
bsf	Porta,Hot;выключаем
goto	Nastr
Cold	bsf	Porta,Warm;Включаем обе группы
Cool	bcf	Porta,Hot;нагревателей

; -------------------------------------------------
Nastr;Не рабочий режим - настройка
call	Crs_1;В 1-ю строку
call	TempInd;Индикация температуры
movlw	b'11011111';символ Цельсия 
call	PrnSmb
movlw	'C'
call	PrnSmb
btfsc	Sost,UstT 
goto 	Tuw;Вывести сигнал установки времени
movlw	' '
call	PrnSmb
movlw	'<'
call	PrnSmb
movf	Ev1Czs,w
call	Bin_Asc
movf	Kod1,w;Индикация 
call	PrnSmb;десятков часов
movf	Kod0,w;Индикация
call	PrnSmb;единиц часов
movlw	b'11000000'
call	PrnSmb
movlw	'>'
call	PrnSmb
call	TimPrn
goto	PskStp

Tuw;Вывести сигнал установки времени
movlw	' '
call	PrnSmb
movlw	'*'
call	PrnSmb
movf	Ev1Czs,w
call	Bin_Asc
movf	Kod1,w;Индикация 
call	PrnSmb;десятков часов
movf	Kod0,w;Индикация
call	PrnSmb;единиц часов
movlw	b'11000000'
call	PrnSmb
movlw	'*'
call	PrnSmb

call	TimPrn
goto	PskStp;Вывести индикацию режима

movf	ADresh,w
movwf	ArIn1
call	Bin_Asc

movlw	' '
call	PrnSmb
movlw	'('
call	PrnSmb
call	TempInd;Индикация температуры
movlw	')'
call	PrnSmb
movlw	' '
call	PrnSmb
movlw	' '
call	PrnSmb
movlw	' '
call	PrnSmb
movlw	' '
call	PrnSmb

; Выводим подсказку во 2-ю строку
PskStp
call	Crs_2;Во 2-ю строку
movlw	'-'
call	PrnSmb

movf	Tust,w
movwf	ArIn1
movlw	.212;((100/АЦП)*256)*120 C
;(показания АЦП при кипении)
movwf	ArIn2
call	Mult8_8
movf	ArResH,w
call	Bin_Asc
call	TempInd;Индикация опорной температуры
movlw	' '
call	PrnSmb
movlw	'+'
call	PrnSmb


btfss	Sost,PsSt;Проверяем состояние Пуск или Стоп
goto	knPsk;0 (Стоп) - вывести сигнал "Пуск"
	;1 (Пуск) - вывести сигнал "Стоп"

TusStp	btfsc	Sost,UstT
goto	Ust4

movlw	' '		
call	PrnSmb
movlw	'('
call	PrnSmb
call	SecPrn;Выводим секунды - слева от Стоп
movlw	')'
call	PrnSmb
movlw	' '	
call	PrnSmb
movlw	'C';(С)
call	PrnSmb
movlw	b'10111111'
call	PrnSmb
movlw	'o'
call	PrnSmb
movlw	b'10111110';(п)
call	PrnSmb

goto	Loop0

Ust4
movlw	' '		
call	PrnSmb
movlw	' '		
call	PrnSmb
movlw	b'10110011'		
call	PrnSmb
movlw	b'11000011'		
call	PrnSmb
movlw	'x'		
call	PrnSmb
movlw	' '		
call	PrnSmb
movlw	b'10101001';(у)
call	PrnSmb
movlw	'c'
call	PrnSmb
movlw	b'10111111'	
call	PrnSmb
movlw	b'10101011';(Ч)
call	PrnSmb

goto	Loop0

knPsk
btfsc	Sost,UstT 
goto 	TusStp;Вывести сигнал установки времени

;Вывести индикацию кнопки "Пуск"  (Sost,PsSt)=0
movlw	' '
call	PrnSmb
movlw	b'10101000'
call	PrnSmb
movlw	'y'
call	PrnSmb
movlw	'c'
call	PrnSmb
movlw	b'10111010'
call	PrnSmb
movlw	' '
call	PrnSmb
movlw	'('
call	PrnSmb
call	SecPrn;Выводим секунды - справа от Пуск
movlw	')'
call	PrnSmb
goto	Loop0

movf	Sec,w;Проверяем, включен ли обратный 
btfss	Status,Z;отсчет (подсветка)
goto	Contr;Нет

goto	Loop0;датчики и возвращаемся

BTst	btfss	Intcon,RBIF
goto	Loop1;Сработал сторожевой таймер - 
	;возвращаемся
call	_01sec
btfss	PortB,Stp;Если не нажато "Стоп" - нечего ждать
goto	TuTst
call	_02sec;Ожидаем нажатия "Пуск" - установка времени
call	_02sec
call	_02sec
call	_02sec

TuTst
movf	PortB,w;Проверяем - если на PortB
movwf	PB;переход 0->1, то не реагируем
btfss	PB,Up;
goto	CBB
btfss	PB,Dn;
goto	CBB
btfss	PB,Psk;
goto	CBB
btfsc	PB,Stp
goto	Loop0;Не было перехода 1->0, т.е. нажатия
	;кнопки - возвращаемся
CBB
movlw	.30;Загружаем в регистр
movwf	Sec;ожидания 30 сек

Contr;goto	Tpr0

call	ButB;Была нажата одна из кнопок - PortB -
	;определим, какая и перейдем на
goto	Loop1


ComPrn	
call	TimPrn
; вывели прошедшее с момента сброса время
goto	Loop0;Возвращаемся

;

;		=====  П О Д П Р О Г Р А М М Ы  =====
;
	org	 h'200'

; --- Измерение АЦП по каналу, указанному в регистре W ---
ADCrun						;
	movwf  Ron0
	movlw  b'01000001'	;
	movwf  Adcon0
	btfsc  Ron0,.0
	bsf	Adcon0,.3
	btfsc  Ron0,.1
	bsf	Adcon0,.4
	call   _1ms		;Время на установление канала
	clrwdt				;
	bsf	Adcon0,Pusk	;Запускаем АЦП,(устанавливаем
WtRdy   btfsc  Adcon0,Pusk	;бит GO/DONE),
	goto   WtRdy		  ;ждем конца преобразования
	return
;
;-== Индикация температуры в условном виде (коды Bin-ASC) ===-
TempInd
movf	Kod2,w
call	PrnSmb;сотни единиц
movf	Kod1,w
call	PrnSmb;десятки - \ -
movf	Kod0,w
call	PrnSmb;единицы
return


;			   --- Таймер (255-{w})*4 мкс ---
;
Czas	clrwdt
	bcf	 Intcon,T0if
	movwf   tmr0		  ;Загружаем константу времени,
						  ;t=(255-{w})*4 мкс
takt
	btfss   Intcon,T0if;Если =1, т.е. таймер  обнулился,
	goto	takt		  ;т.е. прошло (255-{w})*4 мкс,
	return				;выходим из п/п

;		 ---  П/П - задержка на 0.2/0.1/0.01 сек/1 мс ---
_02sec  movlw  .200		;200*250*4 мкс = 200 мс = 0.2 с
	movwf  Cnt0
	goto   _1_ms
_01sec
	movlw  .100		;100*250*4 мкс = 100 мс = 0.1 с
	movwf  Cnt0		;
	goto   _1_ms
_10ms   movlw  .10
	movwf  Cnt0
	goto   _1_ms
_1ms	movlw  .1
	movwf  Cnt0
_1_ms   movlw  .5			 ;
	call   Czas		;
	decfsz Cnt0,f		 ;
	goto   _1_ms		  ;Ждем 1 мс
	return
;	  ----------------------------------

org	h'300'
;	   ---- П/П - инициализация дисплея ----
;	   ---- для 4-х битового режима	 ----
IniDis
	call	_01sec
; ---
	movlw   b'100'		;
	movwf   PortB		 ;
	movlw   b'00110000';
	movwf   PortC		 ;
	clrf	PortB
	call	_10ms
; ---
	movlw   b'100'
	movwf   PortB		 ;
	movlw   b'00110000';
	movwf   PortC		 ;
	clrf	PortB
	call	_1ms
; ---
	movlw   b'100'
	movwf   PortB		 ;
	movlw   b'00110000';
	movwf   PortC		 ;
	clrf	PortB
	movlw   .220		  ;Ждем 4*(255-220)=100 мкс
	call	Czas
; ---
	movlw   b'100'
	movwf   PortB		 ;
	movlw   b'00100000';
	movwf   PortC		 ;
	clrf	PortB
	movlw   .220		  ;Ждем 4*(255-220)=100 мкс
	call	Czas

; --- Пересылаем еще раз - теперь протокол 4-битовый
	movlw   b'100'
	movwf   PortB		 ;
	movlw   b'00101111';Параметры дисплея:
	movwf   PortC		 ;4 бита, 2 строки, символ 5*7
	movwf   DisReg
	clrf	PortB
	movlw   b'100'
	movwf   PortB		 ;
	swapf   DisReg,w
	movwf   PortC
	clrf	PortB
	movlw   .245		  ;Ждем 4*(255-245)=40 мкс
	call	Czas
; ---
	movlw   b'100'
	movwf   PortB		 ;
	movlw   .8			;Выключить дисплей
	movwf   PortC		 ;
	movwf   DisReg
	clrf	PortB
	movlw   b'100'
	movwf   PortB		 ;
	swapf   DisReg,w
	movwf   PortC		 ;
	clrf	PortB
	call	_10ms

; ---
	movlw   b'100'
	movwf   PortB		 ;
	movlw   .1			;Включить и очистить дисплей
	movwf   PortC		 ;
	movwf   DisReg
	clrf	PortB
	movlw   b'100'
	movwf   PortB		 ;
	swapf   DisReg,w
	movwf   PortC		 ;
	clrf	PortB
	call	_10ms
; ---
	movlw   b'100'
	movwf   PortB		 ;
	movlw   .6			;Режим работы - инкремент курсора,
	movwf   PortC		 ;сдвига строки нет
	movwf   DisReg
	clrf	PortB
	movlw   b'100'
	movwf   PortB		 ;
	swapf   DisReg,w
	movwf   PortC		 ;
	clrf	PortB
	call	_10ms
; ---
	movlw   b'100'
	movwf   PortB		 ;
	movlw   b'00001111';Дисплей включен,  курсор включен
	movwf   PortC		 ;и мигает
	movwf   DisReg
	clrf	PortB
	movlw   b'100'
	movwf   PortB		 ;
	swapf   DisReg,w
	movwf   PortC		 ;
	clrf	PortB
	movlw   .245		  ;Ждем 4*(255-245)=40 мкс
	call	Czas
; ---
	movlw   b'100'
	movwf   PortB		 ;
	movlw   .2			;Курсор в начало
	movwf   PortC		 ;
	movwf   DisReg
	clrf	PortB
	movlw   b'100'
	movwf   PortB		 ;
	swapf   DisReg,w
	movwf   PortC		 ;
	clrf	PortB
	call	_10ms
  return	; Инициализация закончена

; -----------------------------------------------------
; --- П/П - очистка дисплея ---
ClrDis
	movlw   b'100'
	movwf   PortB		 ;
	movlw   .1			;Очистить дисплей
	movwf   DisReg
call	PC8_4
	clrf	PortB
	call	_10ms
	return
; ------------------------------------

; --- П/П - установка курсора в начало 1-й строки ---
Crs_1
	movlw   b'100'
	movwf   PortB		 ;
	movlw   b'10000000';Установить курсор в начало
	movwf   DisReg
call	PC8_4
	clrf	PortB
	movlw   .230		  ;Ждем 1.6*(255-230)=40 мкс
	call	Czas
	return
; --- П/П - установка курсора в начало 2-й строки ---
Crs_2
	movlw   b'100'
	movwf   PortB		 ;
	movlw   b'10101000';Установить курсор в начало
	movwf   DisReg
call	PC8_4
	clrf	PortB
	movlw   .245		  ;Ждем 1.6*(255-230)=40 мкс
	call	Czas
	return
; ------------------------------------
; --- П/П - установка курсора в определенную позицию ---
;		   В регистре w - адрес позиции курсора
CrsPos

	movwf   DisReg;
	bsf	 DisReg,.7	 ;Установить 7-й бит -
	;команда адресации курсора
	bsf	PortB,.2	;
call	PC8_4
bcf	 PortB,.2
	movlw   .245		  ;Ждем 1.6*(255-230)=40 мкс
	call	Czas
	return
; -----
; --- П/П - печать символа  на ж/к индикаторе ---
PrnSmb
	movwf   DisReg
bsf	PortB,.0
bsf	PortB,.2
call	PC8_4
bcf	PortB,.2
bcf	PortB,.1

	clrf	PortB
	movlw   .245		  ;Ждем 4*(255-245)=40 мкс
	call	Czas
	return
; -------------------------------------------------
; ----------------------
; -----------------------------------------------------------------
   org	 h'500'

DevRdy  movf	Cnt0,w
	addwf   PCL,f	  ;Готов к работе
	retlw   ' '
	retlw   h'A1'
	retlw   'o'
	retlw   h'Bf'
	retlw   'o'
	retlw   h'B3'
	retlw   .32
	retlw   h'BA'
	retlw   ' '
	retlw   'p'
	retlw   'a'
	retlw   h'B2'
	retlw   'o'
	retlw   h'Bf'
	retlw   'e'
	retlw   ' '
; ------------------------------------------------------------
Wrkg	 movf	Cnt0,w
	addwf   PCL,f	  ;Готов к работе
	retlw   ' '
	retlw   ' '
	retlw   'p'
	retlw   'a'
	retlw   b'10110010'
	retlw   'o'
	retlw   b'10111111'
	retlw   'a'
	retlw   b'11000110'
	retlw   ' '
	retlw   '!'
	retlw   '!'
	retlw   '!'
	retlw   ' '
	retlw   ' '
	retlw   ' '
; ------------------------------------------------------------
NeOt	movf	Cnt0,w
	addwf   PCL,f	  ;Готов к работе
	retlw   ' '
	retlw   'H'
	retlw   'e'
	retlw   ' '
	retlw   'o'
	retlw   b'10111111'
	retlw   b'10110011'
	retlw   b'10111011'
	retlw   'e'
	retlw   h'BA'
	retlw   'a'
	retlw   b'10111111'
	retlw   b'11000100'
	retlw   ' '
	retlw   '-'
	retlw   ' '

; ------------------------------------------------------------
IntTim  movf	Cnt0,w
	addwf   PCL,f	  ;Общее время
	retlw   '-'
	retlw   ' '
	retlw   'O'
	retlw   b'10110010'
	retlw   b'11100110'
	retlw   'e'
	retlw   'e'
	retlw   ' '
	retlw   ' '
	retlw   b'10110011'
	retlw   'p'
	retlw   'e'
	retlw   b'10111100'
	retlw   b'11000111'
	retlw   ' '
	retlw   '-'

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

org	h'550'
; ------------------------------------------------------------
; П/П  - преобразование из двоичного кода - 1 байт в ASCII - 3 байта
;	  Исходный байт - в регистре W
Bin10Asc
movwf	Dop10;Запоминаем дополнение до 10


Bin_Asc
movwf	Kod;Запоминаем исходный байт
clrf	Kod0;Обнуляем регистры - единицы,
clrf	Kod1;десятки,
clrf	Kod2;сотни

b_100	movlw	.100;Подсчитываем число сотен
subwf	Kod,w;Вычитаем из исходного байта 100
btfss	Status,C;Проверяем результат
goto	b_10;Результат отрицательный - выходим
movwf	Kod;Запоминаем промежуточный результат
incf	Kod2,f;Добавляем к сотням 1
goto	b_100;и снова вычитаем 100

b_10	movlw	.10;Подсчитываем число десятков
subwf	Kod,w;Вычитаем из исходного байта 10
btfss	Status,C;Проверяем результат
goto	b_1;Результат отрицательный - выходим
movwf	Kod;Запоминаем промежуточный результат
incf	Kod1,f;Добавляем к десяткам 1
goto	b_10;и снова вычитаем 10

b_1; Остались единицы
movf	Kod,w;
movwf	Kod0;Запоминаем единицы

b_0; Представляем результат в виде, удобном для отображения
movf	Kod2,w;
btfss	Status,Z;Проверяем - сотни = 0?
goto	Cen;Нет
movlw	.32;Да - заполняем пробелом
movwf	Kod2;
goto	Cen_0;

Cen	movlw	.48;Представляем в ASCII
addwf	Kod2,f;
goto	Dec;Остальные цифры - тоже

Cen_0	movf	Kod1,w;
btfss	Status,Z;Проверяем - десятки = 0?
goto 	Dec;Нет
movlw	.32;Да - заполняем пробелом
movwf	Kod1;
goto	Dec_0;
Dec	movlw	.48;Представляем в ASCII
addwf	Kod1,f;
Dec_0	movlw	.48;Представляем в ASCII
addwf	Kod0,f;
return	;
; -----------------------------------------------------------------
; --- Вывод времени на индикатор ---
; Только Часы, минуты и секунды
TimPrn	

movf	Nchas,w
call	Bin_Asc
movf	Kod1,w
call	PrnSmb
movf	Kod0,w
call	PrnSmb

movlw	':'
call	PrnSmb

movf	Nmin,w
call	Bin_Asc
movf	Kod1,w
call	PrnSmb
movf	Kod0,w
call	PrnSmb
return
SecPrn
movf	Nsec,w
call	Bin_Asc
movf	Kod1,w
call	PrnSmb
movf	Kod0,w
call	PrnSmb

return
; -----------------------------------------------------------------
; --- Подсчет общего времени работы ---
TimNul
clrf	Nsec
clrf	Nmin
clrf	Nchas
clrf	Nsut

TimCnt
incf	Nsec,f;Увеличиваем секунды
movlw	.60;Сравниваем -
subwf	Nsec,w;насчитали 60?
btfss	Status,C;Проверяем
goto	TimEnd
incf	Nmin,f;Увеличиваем минуты
clrf	Nsec;Обнуляем секунды
movlw	.60;Сравниваем -
subwf	Nmin,w;насчитали 60?
btfss	Status,C;Проверяем
goto	TimEnd
incf	Nchas,f;Увеличиваем часы
clrf	Nmin;Обнуляем минуты
call	DatWr;Сохраняем данные в ПЗУ
movlw	.24;Сравниваем -
subwf	Nchas,w;насчитали 24?
btfss	Status,C;Проверяем
goto	TimEnd
incf	Nsut,f;Увеличиваем сутки
clrf	Nchas;Обнуляем часы
TimEnd		;Подсчитали общее время
return
; -----------------------------------------------------------------

; -----------------------------------------------------------------
;  Восстанавливаем данные
Res_Data
clrwdt
bcf	status,RP1;Возвращаемся
bcf	status,RP0;на банк 0
movlw	h'60';Загружаем начальый адрес,
movwf	Fsr;где расположены данные

bsf	status,RP1;Устанавливаем банк, в котором
bcf	status,RP0;регистры EEADR и EEDATA - 2-й банк
clrf	EEADR

Dat_res 

bsf	status,RP0;Устанавливаем Банк 3
bcf	EECON1,EEPGD;Обращаемся к памяти данных
bcf	EECON1,WREN;Запрет записи данных
bsf	EECON1,RD;Команда чтения
bsf	status,RP1;Устанавливаем банк, в котором
bcf	status,RP0;регистры EEADR и EEDATA - Банк 2
movf	EEDATA,w;Читаем очередной байт

bcf	status,RP1;на банк 0
bcf	status,RP0;на банк 0
movwf	INDF
bsf	status,RP1;Устанавливаем банк, в котором
bcf	status,RP0;регистры EEADR и EEDATA - Банк 2
incf	EEADR,f;Переходим на следующие
incf	Fsr,f;адреса
movlw	h'73';
xorwf	EEADR,w;
btfss	Status,Z;
goto	Dat_res;
bcf	status,RP1;Возвращаемся
bcf	status,RP0;на банк 0

return
; -----------------------------------------------------------------

; --- Обмен тетрад при выводе на индикатор (PortC) ---
PC8_4	movf	PortC,w		
andlw	h'0F';
movwf	DisRg1
movf	DisReg,w
andlw	h'F0'
xorwf	DisRg1,w
	movwf   PortC		 ;Пересылаем старшую тетраду
bcf	PortB,.2
;	bcf	PortB,.0
;	bsf	PortB,.0
bsf	PortB,.2
	swapf   DisReg,f	  ;Обмениваем тетрады
	movf	PortC,w
andlw	h'0F';
movwf	DisRg1
movf	DisReg,w
andlw	h'F0'
xorwf	DisRg1,w
	movwf   PortC		 ;Пересылаем младшую тетраду
return
; -----------------------------------------------------------------
;   -----  Анализируем кнопки на PortB  -----
ButB
bcf	PortC,.3;Включить подсветку
btfss	PB,Dn;Нажата кнопка "-"?
goto 	Tdn
btfss	PB,Up;Нажата кнопка "+"?
goto	Tup
goto	AAA

Tdn	btfss	Sost,UstT;Установка времени?
goto	Tmpdn;Нет, температуры
;Устанавливаем время
movf	Ev1Czs,w;Проверим, не "0" ли?
btfss	Status,Z;
decf	Ev1Czs,f;Уменьшить выдержку - часы

return

Tmpdn	decf	Tust,f;Уменьшили t"C на шаг
return

Tup	btfss	Sost,UstT;Установка времени?
goto	Tmpup;Нет, температуры
;Устанавливаем время
movlw	.24;Проверим -
subwf	Ev1Czs,w;Установлено 24 часа?
btfsc	Status,Z;
return	;Да - выходим
btfsc	Sost,UstT;Установка времени?
incf	Ev1Czs,f;Увеличить выдержку - часы
btfsc	Sost,Timm;Установка минут?
incf	Ev1Min,f;Увеличить выдержку - минуты

return

Tmpup	incf	Tust,f;Увеличили t"C на шаг
return

AAA; Другие кнопки, кроме "+" и "-"
StPs	btfss	PB,Stp;Нажата кнопка "Stp"?
goto	Sset;да - переходим
btfss	PB,Psk;Нажата кнопка "Psk"?
goto	Pset;да - переходим
return

Pset
clrf	Nsec		  ;Обнуляем
clrf	Nmin		  ;текущее
clrf	Nchas		 ;время
btfsc	Sost,UstT
goto	UstOff
bsf	Sost,PsSt;;Было "Стоп" - поставим "Пуск"
bsf	Porta,Warm;Включаем
bcf	Porta,Hot;нагреватели
bcf	Sost,UstT;Отключаем установку времени
bsf	T2con,Tmr2on;Включаем Таймер2 - звук
call	_02sec;
call	_02sec;
call	_02sec;
bcf	T2con,Tmr2on;Выключаем Таймер2
bsf	PortA,Heat;Включаем индикацию режима нагрева
return

UstOff	bsf	Sost,PsSt;;Было "Стоп" - поставим "Пуск"
bcf	Porta,Warm;Отключаем
bsf	Porta,Hot;нагреватели
bcf	Sost,UstT;Отключаем установку времени
return

Sset
btfss	PortB,Psk;Нажата дополнительно кнопка 
	;"Пуск" после "Стоп"?
goto	Timust;Да - переход на установку времени
bcf	Sost,PsSt;;Была нажата только "Пуск" - поставим 

"Стоп"
bcf	Porta,Warm;Отключаем
bsf	Porta,Hot;нагреватели
bcf	PortA,Heat;Отключаем индикацию режима нагрева
return

Timust	bsf	Sost,UstT;Включаем флаг установки времени
bcf	Sost,PsSt;;Было "Стоп" - оставим "Стоп"
bsf	T2con,Tmr2on;Включаем Таймер2 - звук
call	_02sec;
bcf	T2con,Tmr2on;Выключаем Таймер2

return



; -----------------------------------------------------------------
   org	 h'700'
; -----------------------------------------------------------------
;   П/П - перемножение 2-х байтов
; Исходные данные - сомножители - в регистрах ArIn1 и ArIn2,
; регистр ArIn1H вместе с ArIn1 образуют длинный регистр
; Результат - в регистрах ArResH и ArResL 
Mult8_8
; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;	movlw	b'00000001'
;	movwf	ArIn1
;	movlw	b'00000001'
;	movwf	ArIn2
; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

clrf	ArResH;Обнуляем регистры результата
clrf	ArResL;	--------  ||  --------
clrf	ArIn1H;	--------  ||  --------
movf	ArIn1,w;Проверяем входные регистры,
btfsc	Status,Z;если=0, то
goto	MltRes;и результат будет нулевой
;	movf	ArIn2,w;будет нулевой
;	btfsc	Status,Z;
;	goto	MltRes;
;   Оба сомножителя не равны 0 - будем перемножать,
;   получаем частную сумму 
MltSum
movf	Ncyfr,w; !!! Контроль
movf	ArResH,w; !!! Контроль
movf	ArResL,w; !!! Контроль
movf	ArIn1H,w; !!! Контроль
movf	ArIn1,w; !!! Контроль

movf	ArIn2,w; !!! Контроль
btfsc	Status,Z;2-й сомножитель равен "0"?
goto	MltRes;Да - закончено умножение	
btfss	ArIn2,.0;Нет - очередной бит = "1"?
goto	MltNxt0;Нет - сдвигаем регистры без суммирования

   	movf	ArIn1,w;Младший байт 1-го сомножителя добавляем к 
addwf	ArResL,f;младшему байту результата
movf	ArResL,w; !!! Контроль
clrw	;Обнуляем регистр w
btfsc	Status,C;Если был перенос,
addlw	.1;то добавим в старший байт 1
addwf	ArResH,w;Старший байт результата складываем
addwf	ArIn1H,w;со старшим байтом сдвигового регистра 
movwf	ArResH;1-го сомножителя
; Получена очередная частная сумма - сдвигаем регистры
MltNxt0	bcf	Status,C;Обнуляем перенос
rlf	ArIn1,f;Сдвигаем влево длинный регистр
rlf	ArIn1H,f;1-го сомножителя
bcf	Status,C;Обнуляем перенос
movf	ArIn2,w; !!! Контроль
rrf	ArIn2,f;Сдвигаем вправо 2-й сомножитель
goto	MltSum;Да - образуем очередную частную сумму

MltRes		;Умножение закончено
movf	ArResH,w; !!! Контроль
movf	ArResL,w; !!! Контроль

return
; -----------------------------------------------------------------
; -----------------------------------------------------------------
;   П/П - деление 2-х байтов
; Результат - в регистрах ArResH (целая часть) и ArResL (дробная)
; Исходные данные - делимое в регистре ArIn1, делитель - ArIn2
; При возврате бит переноса С является сигнальным -
; С = 0 -нормальный процесс, С = 1 - деление на 0
Div8_8
; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;	movlw	b'00001000'
;	movwf	ArIn1
;	movlw	b'00000011'
;	movwf	ArIn2
; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
clrf	ArResH;Обнуляем регистры результата
clrf	ArResL;	--------  ||  --------

movf	ArIn1,w;Проверяем входной регистр - делимое,
btfsc	Status,Z;если=0, то
goto	DivRes;и результат будет нулевой
movf	ArIn2,w;
btfsc	Status,Z;Если делитель равен 0,
goto	DivErr;то ошибка
;   Оба сомножителя не равны 0 - будем делить,
;   получаем частную разность
movlw	.8;Устанавливаем 16 сдвигов -
movwf	Ncyfr;длинное деление
;   Выравниваем делитель, если делитель меньше 
Wyrvn	movf	ArIn2,w;
subwf	ArIn1,w;
btfss	Status,C;
goto	Wyrov;
bcf	Status,C;
rlf	ArIn2,f;
incf	Ncyfr,f;
movf	Ncyfr,w;; !!! Контроль
btfss	Status,C;
goto	Wyrvn;
Wyrov	rrf	ArIn2,f;

DifDiv	movf	Ncyfr,w; !!! Контроль
movf	ArIn2,w;
subwf	ArIn1,w;Получаем частную разность
rlf	ArResL,f;Сдвигаем регистры результата
rlf	ArResH,f;вместе с битом переноса

btfss	ArResL,.0;Проверяем, остаток положителен (С=1)?
goto	ShftRmd;Да - переходим
movwf	ArIn1;Нет - восстанавливаем
ShftRmd	bcf	Status,C;
rlf	ArIn1,f;

movf	ArResH,w; !!! Контроль
movf	ArResL,w; !!! Контроль

decfsz	Ncyfr,f;
goto	DifDiv
DivRes
bcf	Status,C;Нормальный возврат - С = 0

movf	ArResH,w; !!! Контроль
movf	ArResL,w; !!! Контроль
	return
DivErr	bsf	Status,C;Возврат по ошибке -
return	;перенос С = 1
; -----------------------------------------------------------------


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

; Пропало питание 220 В - нужно переписать данные в ЭППЗУ 
;
DatWr
clrwdt
bcf	Intcon,GIE

bcf	status,RP1;Банк
bsf	status,RP0;1-й
bcf	PIE2,EEIE

bcf	status,RP1;Банк
bcf	status,RP0;0-й
bcf	PIR2,EEIF;Обнуляем запрос прерывания от EEPROM

movlw	h'60';Загружаем начальный адрес,
movwf	Fsr;где расположены данные
bsf	status,RP1;Устанавливаем банк, в котором
bcf	status,RP0;регистры EEADR и EEDATA - 2-й
clrf	EEADR
bsf	status,RP0;Банк 3-й
bcf	EECON1,EEPGD;
bsf	EECON1,WREN;Разрешение записи данных

Dat_sto

bcf	status,RP1;0-й
bcf	status,RP0;0-й
movf	INDF,w;Берем данные по адресу,
bsf	status,RP1
movwf	EEDATA;указанному FSR
bsf	status,RP0;Банк 3-й

;   -------------------------
movlw	h'55';Обязательная 
movwf	EECON2;последовательность
movlw	h'AA';команд
movwf	EECON2;
bsf	EECON1,WR;Команда записи
;   -------------------------
clrwdt

bcf	status,RP1;
bcf	status,RP0;Банк 0-й

wtEE	btfss	PIR2,EEIF;Ждем прерывания по
goto	wtEE;окончании записи
bcf	PIR2,EEIF;Обнуляем запрос прерывания

bsf	status,RP1;Устанавливаем банк, в котором
bcf	status,RP0;регистры EEADR и EEDATA - 2-й
incf	EEADR,f;Переходим на следующие
incf	Fsr,f;адреса
movlw	.19;Сохраняем 19 регистров
xorwf	EEADR,w;
btfss	Status,Z;
goto	Dat_sto;
bsf	status,RP0;
bcf	EECON1,WREN;
bsf	status,RP0;
bcf	status,RP1;
bcf	PIE2,EEIE
bcf	status,RP0
return

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



;			<<<<<  Конец текста программы  >>>>>
	end
----------------------------------------------------------

Мне необходимо (в скобках будут к Вам вопросы):

1) Составить блок-схему этого кода (в чем лучше сделать ее? Я просто в коде не умею разбираться. Есть ли программы, которые делают блок-схемы автоматически?)

2) Нарисовать схему в электронном виде (какую программу Вы для этого лучше посоветуете, чтобы потом рисунок можно было вставить в Word).

3) Переделать схему для процессора AVR (вот я в этом вообще не разбираюсь! я в панике! кто что посоветует?)

4) Переделать программу под процессор AVR (а это вообще темный лес! Кто в этом разбирается? Кто что посоветует сделать? Сложно ли вообще всё это?)

5) Сделать блок-схему для программы на процессоре AVR (ну это как 1 пункт).

Заранее благодарен за ответы. Диплом горит, я в ужасе, мне страшно! 5 лет фигней прострадал, а теперь маюсь. Каюсь, что это ужасно, но факт остается фактом. Надеюсь на Вашу помощь. Если нужна будет схема, то ответьте хотя бы на второй вопрос, и я Вам ее выложу.

Изменено пользователем alkl
О.. УЖАС!!! Изменил теги

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    484

А чем же всётаки вас не устраивает PIC16F876 ? Зачем под другой МК переделывать если всё уже готово ?

Переделать схему для процессора AVR

НУ в этом проблем небудет никаких. Выбрать AVR по возможностям который не уступает PIC16F876.

Переделать программу под процессор AVR

А вот это действительно тёмный лес !!! Легче заного переписать прогу, чем переделывать с одного на другой.

Сделать блок-схему для программы на процессоре AVR

Если алгаритм тот-же будет, то блок-схемы будут одинаковые.

Может у автора прошивки есть блок-схема. Где Вы взяли её ?

Схему выложите, посмотрим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Guedda    1
А чем же всётаки вас не устраивает PIC16F876 ? Зачем под другой МК переделывать если всё уже готово ?

У меня диплом "Исследование и УСОВЕРШЕНСТВОВАНИЕ терморегулятора для сушильной печи". Т.е., мне необходимо усовершенствовать. Мой научник сказал, что усовершенствование будет, если я попросту поменяю процессор, и схему для этого процессора.

НУ в этом проблем небудет никаких. Выбрать AVR по возможностям который не уступает PIC16F876.

Подскажете, именно какой? Я просто в них абсолютно не разбираюсь.

А вот это действительно тёмный лес !!! Легче заного переписать прогу, чем переделывать с одного на другой.

Можно и заново написать. Еще раз повторяю - я ни в чем этом не разбираюсь. Ниже будет преведено, почему.

Если алгаритм тот-же будет, то блок-схемы будут одинаковые.

отлично бы было. Так в чем-же всё таки делать блок-схемы?

Может у автора прошивки есть блок-схема. Где Вы взяли её ?

Вот это одно из заданий мне. Возможно даже и есть (эта схема + программа - моего научника). Но он хочет, чтобы я сделал.

Схему выложите, посмотрим.

Как найду сканер - выложу. Или подскажите программу, в которой я бы быстро сворганил эту схему.

Просто та схема нарисована от руки.

А теперь я обьясню, почему я в этом ничего не понимаю (чтобы не возникло вопросов, почему я такой ужасный идиот). Просто напросто я уходил перед дипломом в академ, а за год прибавился новый предмет (МК-техника), и остался только один свободный науч. руководитель. Поэтому мне ничего не оставалось, как выбрать его. Он мне предложил одну на выбор из тем, и я выбрал именно эту, так как другие были гораздо сложнее (допустим, измеритель АЧХ пьезоматериалов).

Уж пожалуйста, помогите, чем, как говорится, можете. Я очень расчитываю на Вас! Да я туп и безграмотен... Но надо это сделать :( Если можете - давайте ссылки, я буду ботанить!!! Но диплом просто 26 июня. И без вашей помощи я не справлюсь.

Заранее благодарен за всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
fredo    0

Нарисуй пока хотя бы от руки схему, или просто опиши что подключено к контроллеру.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
fredo    0

Guedda

Там наверно еще нагреватель должен быть.

Дисплей, термопара, кнопки какие то конкретно должны быть или можно самому выбрать?

Тебе достаточно будет самого простого AVRa, например Atmega48. (кстати он почти на порядок дешевле PIC16F876, так что это уже довольно серьезное усовершенствование)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Guedda    1

Кнопки, я думаю, любые. Нагреватель, вроде как, стоит (на рисунке слева спиральки). Дисплей (очень плохо написано) вроде как EP/WRS (написано черной гелевой ручкой)

Спасибо за то, что назвали замену. А по поводу блок-схем, и в чем рисовать схему регулятора? Кто что использует для этого?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ragnarok    0

если, не подсказываете по моему вопросы, скажите хотя бы, где можно найти примеры с мк интел 8051, работающих устройств

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
wowa    4
Друзья, нужна помощь. Я учусь в техническом ВУЗе, и получил задание на курсовую работу спроектировать кодовый замок.....

Насколько мене известно большинство 8051 клонов не содержат АЦП.. Так же АЦП внешний.. Экранированый провод от ручки... Может быть бы было лучше сделать кнопки сенсорные??? Будет как бы нажатие на кнопку и сразу сопротивление :) Причём можно будет сделать средне арифметическое сопротивления и результат будет точнее :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ragnarok    0

АЦП,естественно, внешний, но все же думаю он будет отдельно,т.к. среднеее мне кажется будет трудно посчитать, с учетом того,что в схемотехнике я ни черта не смыслю. я хотел бы спросить с чего мне начать этот замок?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
wowa    4

Я бы начал с схемотехники: Нарисовать схему на которой будет блок питания, процесор с обвязкой, подключенное реле или електромагнит, разём на клавиатуру и подключен выбраный внешний АЦП с усилителем тока... Потом бы это собрал на макетке и начал писать програму... Ещё надо будет собрать какой програматор или использовать чипы с бутлоудером...

Изменено пользователем wowa

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Migray    5

51 ядро с неплохими АЦП - ADuC8xx

Есть несколько примеров для медицины.

Есть кардиограф, можно его приспособить. Кардиограмма человека - вещь довольно индивидуальная.

Даже если меняется пульс, общий рисунок меняется не сильно, ну если конечно не брать предельные нагрузки.

А определять сопротивление тела человека, и на этом признаке его идентифицировать - такое задание очень много говорит об уровне знаний препода.

У одного и того-же человека эта характеристика отличается в разы в зависимости от кучи параметров.

1. Выпил

2. Хорошо выпил :)

3. Жарко стало или наоборот замерз

4. Волнуется или спокоен как танк

и т.д.

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

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

P.S. При использовании ADuC-а внешний АЦП не обязателен.

Изменено пользователем Migray

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: karomag
      Добрый день.
      Экспериментирую с подключение 7-сегментного индикатора к мк stm32. Индикатор с общим катодом. Соответственно для вывода цифры необходимо на анод каждого сегмента подать 1, а на общий катод 0. И тут я не могу понять какие токи будут через порты. Теоретически, пины МК подключенные через резистор 300 Ом к аноду (напряжение МК 3.3 В) то ток будет 4 мА, тогда на общем катоде должно быть 7 * 4 = 28 мА (цифра 8, т.е. горят все сегменты). Т.е. это небольшое, но превышение макс тока на ногу 20 мА. И надо общий вывод подключать через транзисторный ключ.
      Взял мультиметр. Результаты замера: ток каждого сегмента ~2.5 мА, ток общего катода 5 мА. Вот тут я подумал о школе Хогвардс))) Как все таки рассчитывается все таки ток на общем выводе? 
    • Автор: art_budka
      Ищу подрядчика для разработки проекта робота-рисовальщика. Есть бюджет, ТЗ. 
      Устройство представляет собой манипулятор передвигающий головку в плоскости XY в пределах жесткой рамы на которой установлены двигатели и направляющие перемещения. Головка представляет собой блок, отвечающий за передвижение закрепленного в фиксаторе объекта-пера по оси Z на расстояние до 20 мм. Фиксатор на элементе подъёма головки должен обеспечить жесткое закрепление предметов массой 10 - 80 грамм - кистей, шариковых ручек, карандашей и маркеров диаметром от 5 до 20 мм.
      Решение необходимо для обеспечения точных, многократно повторяющихся перемещений “пера” над плоской поверхностью. Для формирования движений в устройстве должна быть реализована электромеханическая схема, подключенная посредством USB-интерфейса к персональному компьютеру для отправки команд на манипулятор и получения обратной связи от контроллера манипулятора. 
      ТЗ, смета и бюджет через art_budka@rambler.ru 
    • Автор: green_whale
      Доброго времени суток.
      Собственно, сразу к делу. Необходимо измерить вч напряжение (частота порядка 20кГц, максимальная амплитуда 75мВ) с помощью микроконтроллера (скорее всего будет использоваться Arduino).
      Форма входного сигнала - пила (возрастает от минимального значения до максимального). Сигнал однополярный.
      Измерить нужно именно максимальное значение входящего сигнала. Измерение должно быть весьма точным (желательно, чтобы погрешность не превышала 1-2%).
      Есть пару идей :
      1. Сгладить сигнал, используя пиковый детектор (сможет ли сигнал такой частоты и формы зарядить конденсатор?).
      2. Использовать цап для генерации постепенно снижающегося напряжения и аналоговый компаратор.

      Надеюсь, кто-нибудь уже решал подобную проблему и сможет помочь советом или схемой.
    • Гость мистер_чувак
      Автор: Гость мистер_чувак
      Здравствуйте. Нашёл свои старые китайские портативные колонки, которые давно уже разобрал и потерял некоторые провода. Помогите разобраться, что к чему соединять, чтобы работало.
      фотка1
      фотка2
      фотка3
      фотка4
      фотка5
      фотка6
      фотка7
    • Автор: butyavk
      Компания "Диаконт" приглашает на собеседование по вакансии инженер-программист микроконтроллеров.
      Мы производим и поставляем современные приборы управления электроприводами для различных отраслей отечественной промышленности.
      Пополняем нашу команду программистов (готовы принять 2-3 кандидатов с различным опытом работы)!

      Основные обязанности:
      Разработка программного обеспечения для блоков управления приводами и др. вычислительных систем.
      Программирование на C++ микроконтроллеров фирмы Texas Instruments и НИИЭТ на базе ядра ARM Cortex-M4.
      Поддержка и доработка существующего программного обеспечения.
      Участие в научно-исследовательских и опытно-конструкторских работах.
      Участие во внедрении систем на объектах (редкие командировки).

      Требования к кандидатам:
      Хорошее знание схемотехники;
      Знание методов разработки и проектирования ПО для микроконтроллеров и опыт работы с их периферией;
      Знание основ управления электроприводами и ТАУ;
      Знание языков программирования высокого уровня (C++, C);
      Знание современных методов разработки ПО (ООП, ...);
      Знание английского языка (чтение технической документации);
      Приветствуется знание Python, Matlab/Octave;
      Дополнительным плюсом будет опыт автоматизированного тестирования встроенного ПО.

      Условия:
      Оплата полностью белая (на руки в зависимости от знаний и опыта от 50 000 руб до 100000 руб). Но, готовы обсуждать!;
      Карьерный и профессиональный рост;
      Предприятие с комфортными условиями труда на севере города;
      ДМС;
      График работы понедельник - пятница 9:00-17:40;
      Плавающее начало работы с 8:00-10:00;
      Льготное питание в столовой на территории предприятия;...

      Ключевые навыки
      Программирование микроконтороллеров
      C/C++
      Управление электродвигателями

      Адрес
      Санкт-Петербург, ул. Учительская 2, м. Гражданский проспект

      Тип занятости
      Полная занятость, полный день

      Резюме лучше отправлять на rykov@diakont.com 
  • Сообщения

    • Добрый день! Резисторы проблему не решили. Снял осциллограмму. Частота колебаний изменяется в зависимости от положения регулятора громкости. В пределах 25-38 Гц.
    • Подключаю индикатор  ИЦЛ2-12/8Л к микроконтроллеру. Набросал схему (сразу скажу номиналы и типы элементов условны, ещё не считал, за это пинать не надо) Возникли вопросы. 1. Решение по питанию накала через стабилитрон по мимо того что 600 мВт мощности на резисторе гасить, нормальное (мне кажется нет, но хочу уйти от трансформаторов)?  Всю конструкцию потом питать хочу от адаптера 12 В. До 24 В буду повышать через DCDC преобразователь. 2. Прочитал что в ВЛИ можно понизить анодное напряжение до 12 В гореть будет тусклее, но жизнь элементу продлит. Тогда при питании накала через стабилитрон, уже рассеиваться на резисторе будет 300 мВт. Я хочу это проверить (устроит ли яркость свечения при 12 В), но в даташите указано анодное и сеточное импульсное напряжение 24 В. Если я просто подключу накал к батарейке и подам постоянное 24 В индикатору плохо не станет? 3. Вывод 22 и 13 индикатора это и накал и катод. Но вывод 22 как написано в даташите распылён по колбе. Так вот к минусу питания вывод 13, а на вывод 22 напряжение накала так верно или наоборот или нет разницы?  
    • Разделение нужно ровно потому, что  ЕДИНСТВЕННЫМ назначением логического результата является управление ветвлением. А то, что в Си принято, что логический результат преобразуется в число - это особенность языка,  которая может быть реализована ТОЛЬКО ПОСЛЕДОВАТЕЛЬНОСТЬЮ КОМАНД. То есть численный результат, даже если он был получен параллельно с логическим НЕ ПРИГОДЕН для Си. Его нужно преобразовать в 0 или 1. Открываете мануал на XC16 и читаете сами. Это несекретный мануал, есличо.
    • Гость pixel
      Приветствую. Есть вот такой девайс. Вроде ничего сложного, но после программирования интервалов увидел, что с выходных контактов ничего не выходит. Т.е. Реле щелкает, индикатор сверху загорается, а на контактах напряжения нет. Залез внутрь, вроде ничего горелого нет. Подскажите как протестить? 
    • если есть желание, сам проверь его на частоте 800 кГц. если потери в нем тебе понравятся, то порекомендуешь этот порошок.
    • Процитируйте, пожалуйста - это ведь не секретная инфа?
    • Автор, а где в тексте первоисточника есть НАМЕК на феррит? катушка без сердечника ... только на оправке.... которая может быть изготовлена из подручного материала... диэлектрического... гвозь "сотка" не подойдет...