Onixx Опубликовано 13 мая, 2008 Поделиться Опубликовано 13 мая, 2008 Здравствуйте! Уважаемые форумчане, помогите разобраться в большом количестве информации. Имеется задача создать примитивное информационное табло: 1)создать светодиодную матрицу 4*4, из двухцветных (зелено-красных, 3 вывода) светодиодов, по сути 32 диода, светодиоды самые простые 150 мВт. 2)матрица управляется микроконтроллером с компьютера через какой-либо интерфейс, без всяких внешних программаторов. Желательно интерактивное управление(нажал мышкой по кнопке диод загорелся), но можно и просто записать программу в память контроллера. 3)Каждый светодиод управляется отдельно, имеет 16 уровней яркости(1 байт) 4)Питание от бытовой сети Вопросы: 1) Какой недорогой, доступный в продаже, известный(в плане различных программных и схемных решений) контроллер выбрать? 2) Какой, совместимый с контроллером, драйвер СДУ(редуктор) под мои светодиоды выбрать? я понимаю что ШИМ можно реализовать программно, но возможно количество и мощность светодиодов будет увеличиваться. Да и как –то красивее получается 3) Какие-либо советы по функциональной схеме (принципиальные моменты). Если подобные конкретные вопросы рассматривались(общей информации много), просьба дать ссылки. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Migray Опубликовано 13 мая, 2008 Поделиться Опубликовано 13 мая, 2008 (изменено) 1. Провокация "религиозной войны". По доставаемости - сам где обитаешь? Доступность схем и решений по моему сейчас для любого МК не проблема. Для чего делаешь, условия применения (температура, ЭМП и т.д.) Надежность важна, или это игрушка/диплом, мигает да и ладно? Если выделенные пункты важны, выбор несколько ограничивается, если нет - бери любой попавшийся. Или выбирать будет тот, кто выразит желание помочь. В смысле что он сам знает, такой МК и будет 2. ШИМ конечно реализовать просто, но 32 канала ... Посмотри сюда, может что и приглянется. Вот только с 2-цветными светодиодами сложнее, лучше было-бы раздельные, управлять проще. Интерфейс, по которому управляется TLC5922 или TLC5941 очень простой, стыкуется с любым МК. По поводу программатора. Тот или иной все равно потребуется. Бояться этого не надо, они простые. Частенько хватает преобразователя RS-232 -> TTL Этот-же преобразователь тебе может пригодиться для связи готового устройства с персоналкой. С питанием проблем быть не должно. Определишься с числом и мощностью светодиодов, подсчитаете суммарную мощность светодиоды+МК+связь с компом, тогда и БП сделаете. Изменено 13 мая, 2008 пользователем Migray 0 Как советовать, так все чатлане ... Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
alibedog Опубликовано 18 мая, 2008 Поделиться Опубликовано 18 мая, 2008 Может кто поможет с курсчачом ? вот задание.... Разработать МК – систему (ТАЙМЕР) для включения/выключения электрических цепей агрегатов автоматизированного фотообрабатывающего комплекса. Количество этапов обработки на одной линии комплекса – 8, количество линий – 4. Продолжительность каждого этапа в зависимости от вида обработки составляет 100 -600 секунд. Время паузы между операциями – 5 с. Запуск каждой линии осуществляется с пульта оператора. Поэтапное расписание работы каждой линии устанавливается путем загрузки из ПЭВМ через последовательный канал ввода. Управляющий ток для включения/выключения агрегатов комплекса - 20 мА. Отладить модули разработанной программы с помощью симулятора. Оценить потребляемую мощность устройства. Тип МК: Atmel AT89С51 или посоветуйте с чего начать..))) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
alts Опубликовано 19 мая, 2008 Поделиться Опубликовано 19 мая, 2008 С изучения архитектуры МК, возможностей переферии. Конкретизировать задание в разрезе сначала одной линии, как то: точность выдержки параметров вкл/выкл по времени, последовательность...синхронность линий нужна или нет. А уже потом пытаться решить задачу имеющимися средствами. В принципе - ничего особо сложного. Но потребует сосредоточения мыслительных способностей... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexi Опубликовано 19 мая, 2008 Поделиться Опубликовано 19 мая, 2008 Сюда буду сносить все темы каксающиеся лабараторных, практических и прочих работ и заданий. И я тоже (alkl) 0 Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz. ICQ: 288449055 Ссылка на комментарий Поделиться на другие сайты Поделиться
Einstein Опубликовано 19 мая, 2008 Поделиться Опубликовано 19 мая, 2008 Добрый день Пико строители)).... дела насущные как говорится... скоро сдавать курсовую... поэтому решил начать ее делать... а тех задание у меня разработать на 24 пике приемо-передатчик, с частотной модуляцией. для начала решил разобраться с передатчиком, посему несколько вопросов. Для реализации думаю использовать ШИМ модуль который уже имеется в пиках но есть некоторая сложность)).... генерировать то он генерирует только не могу разобраться как изменить частоту. Может кто нибудь покажет примеры работы с ШИМ модулями желательно с комментариями. Просто пока еще разбираюсь может и дойдет до меня что там и как, но чтобы не терять времени решил и у знатоков спросить пишу кстати, говоря на С так что примеры на нем приветствуються))). А то что то на форуме .... про PIC24 ничего нету ...неужели народ еще не использует?))) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Guedda Опубликовано 22 мая, 2008 Поделиться Опубликовано 22 мая, 2008 (изменено) Добрый день, уважаемые знатоки. У меня диплом, который переворачивает всю мою жизнь. Есть сушильная печь, и есть терморегулятор для нее на основе PIC16F876. Одной из целей моей дипломной работы есть усовершенствование терморегулятора, т.е. переделать под новый процессор. какой процессор Вы мне посоветуете, чтобы меньше было изменений в схеме (более новый, что ли)? Извиняюсь за такой глупый вопрос. Просто не разбираюсь в них. Заранее благодарен за ответ. Изменено 22 мая, 2008 пользователем Guedda 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
fredo Опубликовано 22 мая, 2008 Поделиться Опубликовано 22 мая, 2008 Guedda Одной из целей моей дипломной работы есть усовершенствование терморегулятора, т.е. переделать под новый процессор. А какие параметры вы хотите улучшить? Чем вас не устраивает PIC16F876? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
kolot Опубликовано 23 мая, 2008 Поделиться Опубликовано 23 мая, 2008 Привет всем! Нужна помощь! Решил собрать схему управления 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, в долгу не останусь. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 23 мая, 2008 Поделиться Опубликовано 23 мая, 2008 Классный диплом светодиодами моргать. А в чём проблема то собстно ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
kolot Опубликовано 23 мая, 2008 Поделиться Опубликовано 23 мая, 2008 Проблема в том, что собраное устройство не работает. Помогите найти ошибку!!! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ragnarok Опубликовано 24 мая, 2008 Поделиться Опубликовано 24 мая, 2008 Друзья, нужна помощь. Я учусь в техническом ВУЗе, и получил задание на курсовую работу спроектировать кодовый замок на базе микропроцессора интел 8051 с 12-кнопочной клавиатурой, и открытием только в том случае, когда сопротивление руки открывающего мало отличается от заданного. Как взяться за дело - даже не знаю.((( Предполагаю, что код с клавиатуры будет обрабатываться прошивкой, что же до руки - то на ручку будет подаваться напряжение, небольшое)) вольтметр измерит напряжения на ручке, сигнал пойдет в АЦП, а после в микропроцик. Беда в том,что я не знаю, на какие входы что подавать. Помогите пожалуйста! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Guedda Опубликовано 25 мая, 2008 Поделиться Опубликовано 25 мая, 2008 (изменено) Извините за то, что в первом сообщении допустил глупость написать полную ересь. Сейчас исправлю. Так как я не имел подобных случаев в своей учебе, а диплом сделать надо, то у меня есть к Вам вопросы. Задание на диплом мое таково: Есть схема терморегулятора для сушильной печи (на основе МК 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 лет фигней прострадал, а теперь маюсь. Каюсь, что это ужасно, но факт остается фактом. Надеюсь на Вашу помощь. Если нужна будет схема, то ответьте хотя бы на второй вопрос, и я Вам ее выложу. Изменено 25 мая, 2008 пользователем alkl О.. УЖАС!!! Изменил теги -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 25 мая, 2008 Поделиться Опубликовано 25 мая, 2008 А чем же всётаки вас не устраивает PIC16F876 ? Зачем под другой МК переделывать если всё уже готово ? Переделать схему для процессора AVR НУ в этом проблем небудет никаких. Выбрать AVR по возможностям который не уступает PIC16F876. Переделать программу под процессор AVR А вот это действительно тёмный лес !!! Легче заного переписать прогу, чем переделывать с одного на другой. Сделать блок-схему для программы на процессоре AVR Если алгаритм тот-же будет, то блок-схемы будут одинаковые. Может у автора прошивки есть блок-схема. Где Вы взяли её ? Схему выложите, посмотрим. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Guedda Опубликовано 25 мая, 2008 Поделиться Опубликовано 25 мая, 2008 А чем же всётаки вас не устраивает PIC16F876 ? Зачем под другой МК переделывать если всё уже готово ? У меня диплом "Исследование и УСОВЕРШЕНСТВОВАНИЕ терморегулятора для сушильной печи". Т.е., мне необходимо усовершенствовать. Мой научник сказал, что усовершенствование будет, если я попросту поменяю процессор, и схему для этого процессора. НУ в этом проблем небудет никаких. Выбрать AVR по возможностям который не уступает PIC16F876. Подскажете, именно какой? Я просто в них абсолютно не разбираюсь. А вот это действительно тёмный лес !!! Легче заного переписать прогу, чем переделывать с одного на другой. Можно и заново написать. Еще раз повторяю - я ни в чем этом не разбираюсь. Ниже будет преведено, почему. Если алгаритм тот-же будет, то блок-схемы будут одинаковые. отлично бы было. Так в чем-же всё таки делать блок-схемы? Может у автора прошивки есть блок-схема. Где Вы взяли её ? Вот это одно из заданий мне. Возможно даже и есть (эта схема + программа - моего научника). Но он хочет, чтобы я сделал. Схему выложите, посмотрим. Как найду сканер - выложу. Или подскажите программу, в которой я бы быстро сворганил эту схему. Просто та схема нарисована от руки. А теперь я обьясню, почему я в этом ничего не понимаю (чтобы не возникло вопросов, почему я такой ужасный идиот). Просто напросто я уходил перед дипломом в академ, а за год прибавился новый предмет (МК-техника), и остался только один свободный науч. руководитель. Поэтому мне ничего не оставалось, как выбрать его. Он мне предложил одну на выбор из тем, и я выбрал именно эту, так как другие были гораздо сложнее (допустим, измеритель АЧХ пьезоматериалов). Уж пожалуйста, помогите, чем, как говорится, можете. Я очень расчитываю на Вас! Да я туп и безграмотен... Но надо это сделать Если можете - давайте ссылки, я буду ботанить!!! Но диплом просто 26 июня. И без вашей помощи я не справлюсь. Заранее благодарен за всё. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
fredo Опубликовано 25 мая, 2008 Поделиться Опубликовано 25 мая, 2008 Нарисуй пока хотя бы от руки схему, или просто опиши что подключено к контроллеру. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Guedda Опубликовано 25 мая, 2008 Поделиться Опубликовано 25 мая, 2008 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ragnarok Опубликовано 25 мая, 2008 Поделиться Опубликовано 25 мая, 2008 так,что мне никто не подскажет по поводу кодового замка? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
fredo Опубликовано 25 мая, 2008 Поделиться Опубликовано 25 мая, 2008 Guedda Там наверно еще нагреватель должен быть. Дисплей, термопара, кнопки какие то конкретно должны быть или можно самому выбрать? Тебе достаточно будет самого простого AVRa, например Atmega48. (кстати он почти на порядок дешевле PIC16F876, так что это уже довольно серьезное усовершенствование) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Guedda Опубликовано 25 мая, 2008 Поделиться Опубликовано 25 мая, 2008 Кнопки, я думаю, любые. Нагреватель, вроде как, стоит (на рисунке слева спиральки). Дисплей (очень плохо написано) вроде как EP/WRS (написано черной гелевой ручкой) Спасибо за то, что назвали замену. А по поводу блок-схем, и в чем рисовать схему регулятора? Кто что использует для этого? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ragnarok Опубликовано 25 мая, 2008 Поделиться Опубликовано 25 мая, 2008 если, не подсказываете по моему вопросы, скажите хотя бы, где можно найти примеры с мк интел 8051, работающих устройств 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
wowa Опубликовано 25 мая, 2008 Поделиться Опубликовано 25 мая, 2008 Друзья, нужна помощь. Я учусь в техническом ВУЗе, и получил задание на курсовую работу спроектировать кодовый замок..... Насколько мене известно большинство 8051 клонов не содержат АЦП.. Так же АЦП внешний.. Экранированый провод от ручки... Может быть бы было лучше сделать кнопки сенсорные??? Будет как бы нажатие на кнопку и сразу сопротивление Причём можно будет сделать средне арифметическое сопротивления и результат будет точнее 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ragnarok Опубликовано 25 мая, 2008 Поделиться Опубликовано 25 мая, 2008 АЦП,естественно, внешний, но все же думаю он будет отдельно,т.к. среднеее мне кажется будет трудно посчитать, с учетом того,что в схемотехнике я ни черта не смыслю. я хотел бы спросить с чего мне начать этот замок? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
wowa Опубликовано 25 мая, 2008 Поделиться Опубликовано 25 мая, 2008 (изменено) Я бы начал с схемотехники: Нарисовать схему на которой будет блок питания, процесор с обвязкой, подключенное реле или електромагнит, разём на клавиатуру и подключен выбраный внешний АЦП с усилителем тока... Потом бы это собрал на макетке и начал писать програму... Ещё надо будет собрать какой програматор или использовать чипы с бутлоудером... Изменено 25 мая, 2008 пользователем wowa 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Migray Опубликовано 25 мая, 2008 Поделиться Опубликовано 25 мая, 2008 (изменено) 51 ядро с неплохими АЦП - ADuC8xx Есть несколько примеров для медицины. Есть кардиограф, можно его приспособить. Кардиограмма человека - вещь довольно индивидуальная. Даже если меняется пульс, общий рисунок меняется не сильно, ну если конечно не брать предельные нагрузки. А определять сопротивление тела человека, и на этом признаке его идентифицировать - такое задание очень много говорит об уровне знаний препода. У одного и того-же человека эта характеристика отличается в разы в зависимости от кучи параметров. 1. Выпил 2. Хорошо выпил 3. Жарко стало или наоборот замерз 4. Волнуется или спокоен как танк и т.д. Вообще пошарься на сайте, Аналоговые Девайсы много апликух выкладывают. Чипы, как и большинство современных, программируются через последовательный порт, можно программировать и в схеме. P.S. При использовании ADuC-а внешний АЦП не обязателен. Изменено 25 мая, 2008 пользователем Migray 0 Как советовать, так все чатлане ... Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.