Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.84.32] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Люди кто может помогите с контрольной заочнику
Задание такое есть PIC любой базового семейства схемка прилогаеться Нужно измерять напряжение от 0.6 до 1.1 вольта и держать включенным один светодиод при выходе напряжения за предел включить второй светодиод и выдать на динамик звук с частотой 200 Гц. Написал вот такое начало программы list p=16C71 #include <P16C71.inc> __CONFIG _CP_OFF & _WDT_OFF & _RC_OSC ;***** Variable definitions ****************************************** ; Описание регистров, битов и переменных STATUS EQU 03H ; Регистр STATUS PORTB EQU 06H ; Регистр порта В ADCON0 EQU 08H ; Регистр управления АЦП ADRES EQU 09H ; Регистр результата АЦП ; преобразования INTCON EQU 0BH ; Регистр управления прерыва ; ниями OPTREG EQU 81H ; Регистр OPTION TRISB EQU 86H ; Регистр конфигурации порта В ADCON1 EQU 88H ; Регистр конфигурации АЦП RP0 EQU 5H ; Бит переключения страниц в ; регистре STATUS C EQU 2H ; Флаг переноса/заема в регистре ; STATUS F0 EQU 0CH ; Просто флаг ;********************************************************************** ORG 0 ; Начальный адрес после сброса GOTO BEG ; Переход на начало программы ORG 100 ; Начальный адрес программы ; (следующая команда будет ; расположена по адресу 100H) BEG ; Инициализация микроконтроллера BSF STATUS,RP0 ; Включить первую страницу ПД BCF OPTREG,7 ; Отключить активную нагрузку ; от выводов порта В BCF TRISB,0 ; Установить бит 0 порта В на ; вывод CLRF ADCON1 ; Установить входы порта А как ; аналоговые, опорное ; напряжение для АЦП равно Vdd BCF STATUS,RP0 ; Включить нулевую страницу ПД MOVLW B '11000000' ; Разрешить прерывания только MOVWF INTCON ; от АЦП (все остальные прерыва- ; ния запрещены !) MOVLW 0C1H ; Синхронизация АЦП от ; собственного генератора. MOVWF ADCON0 ; Разрешить работу АЦП ; ; Ввод и преобразование сигналов U1 BCF ADCON0,3 ; Установить входной канал AIN4 BCF ADCON0,4 BSF ADCON0,2 ; Начать процесс преобразования ; сигнала U1 LOOP2 BTFSS ADCON0,2 ; Ждать окончания преобразова- ; ния сигнала U1 GOTO LOOP2 MOVF ADRES,0 ; Результат преобразования ; сигнала U1 записать в W BCF ADCON0,1 ; Сбросить флаг окончания пре- ; образования ADIFв регистре ; ADCON0 Если я прав и книжка не врет то в W у меня записанно значение полученное с АЦП еще вот такая подпрограммка преобразования числа в код для индикатора bcd_table andlw 0x0F addwf PCL, А retlw b'00111111' ;0 retlw b'00000110' ;1 retlw b'01011011' ;2 retlw b'01001111' ;3 retlw b'01100110' ;4 retlw b'01101101' ;5 retlw b'01111101' ;6 retlw b'00000111' ;7 retlw b'01111111' ;8 retlw b'01101111' ;9 Вопрос как собственно разделить полученный результат преобразования в три переменных (единицы десатые и сотые доли вольта)что бы вывести их на индикаторы. Если кто может помогите сделать или дайте пример похожей программы разанее спасибо Прикреплённый файл111.JPG (99.21 Кбайт, скачиваний: 679) |
Сообщ.
#2
,
|
|
|
Цитата Wer_wolf @ Вопрос как собственно разделить полученный результат преобразования в три переменных (единицы десатые и сотые доли вольта)что бы вывести их на индикаторы. Wer_wolf про калибровку слышал??? Заводишь 1 таблицу - значения преобразования АЦП, 2 таблица - значения индикатора. После АЦП сравниваешь результат из первой таблицы со значением, полученным АЦП и по индексу выдергиваешь из второй таблицы наборы байт для отправки на индикатор. Далее соответственно проверяешь выход значения за пределы нормы. Сама калибровка: Подаешь нужное напряжение на вход АЦП и заносишь полученный после преобразования результат в таблицу, и так до тех пор пока не решишь, что полученных значений АЦП тебе достаточно. Сразу оговорюсь - дело индивидуальное для каждой конкретной микросхемы, поэтому пишут дополнительные программы (зашиваются в ПИК и имеют свой пользовательский интерфейс) чтобы можно было откалибровать новую микросхему взамен вышедшей из строя. |
Сообщ.
#3
,
|
|
|
тоесть значение АЦП сравнивать со значением в таблице и тогда выбирать сколько собственно это вольт на входе
а примерчик такого можеш показать |
Сообщ.
#4
,
|
|
|
Цитата Wer_wolf @ тоесть значение АЦП сравнивать со значением в таблице и тогда выбирать сколько собственно это вольт на входе Да, и из второй таблицы выбирают цепочку байт соответствующее этому напряжению для показа на индикаторе. Цитата Wer_wolf @ а примерчик такого можеш показать Могу. ПИК какой??? В МРЛАБ подойдет???? |
Сообщ.
#5
,
|
|
|
пик любой базового семейства 16с71 или 16с72
MPlab полностью устроит сам в нем вояю И если моно подскажи как в нем сделать симуляцию работы АЦП что бы посмотреть прогу в действии. |
Сообщ.
#6
,
|
|
|
Цитата Wer_wolf @ И если моно подскажи как в нем сделать симуляцию работы АЦП что бы посмотреть прогу в действии. Если в симуляторе то только записью в регистр АЦП числа и установкой флага окончания преобразования. Аппаратную часть (само преобразование) только внутрисхемной отладкой в процессе работы ПИК"а.(В IDE должен быть установлен внутрисхемный отладчик + подключена отладочная плата для ПИК"а, практически полностью идентичная рабочей). Цитата Wer_wolf @ пик любой базового семейства 16с71 или 16с72 Прицепи даташит на этот контроллер (если есть отличия) или на мыло medved_68@mail.ru у меня из 16 только 62х, 87х. Или там нет отличий по регистрам АЦП и сканает 16F87X???? |
Сообщ.
#7
,
|
|
|
Деление на кусочки сделал
А теперь вопрос как сделать такую штуку если у меня три переменные Z1,Z2,Z3 в них храниться число от 0 до 9 как мне сделать табличку что бы из нее в зависимости от значения ячейки выбрать в переменную код для индикатора что бы потом загрузить эту переменную в порт Вот сами коды '00111111' ;0 '00000110' ;1 '01011011' ;2 '01001111' ;3 '01100110' ;4 '01101101' ;5 '01111101' ;6 '00000111' ;7 '01111111' ;8 '01101111' ;9 а вот как слелать их выбор получше я не предстовляю |
Сообщ.
#8
,
|
|
|
Wer_wolf поглядел вчера твою посылку...не совсем то что надо, но да бог с ним. Вопрос: Пишешь для той схемы, что привел на рисунке??? Если да то учти что там необходима динамическая индикация т.к. три статических сегмента сидят на 1 ШД и выбираются дешифратором. Т.Е. в каждый момент времени гореть будет только 1 сегмент.Следовательно надо предусмотреть буфер экрана, куда записываются три байта, которые выводятся на индикатор, настроить встроенный таймер на интервал срабатывания с частотой > 80 Гц.(иначе будет заметно мерцание индикаторов) и в подпрограмме обработки прерывания от таймера поочередно выводить сначала байт данных в порт В затем три бита на дешифратор которые соответствуют выбору этого индикатора. Что бы посчитать частоту срабатывания таймера необходимо определиться с тактовой частотой ПИК, т.е. номинал кварцевого резонатора + определить по формуле частоту машинного цикла и время выполнения команд.
Добавлено Цитата Wer_wolf @ А теперь вопрос как сделать такую штуку если у меня три переменные Z1,Z2,Z3 в них храниться число от 0 до 9 как мне сделать табличку что бы из нее в зависимости от значения ячейки выбрать в переменную код для индикатора что бы потом загрузить эту переменную в порт Используй память данных и команды извлечения из памяти данных в регистры ПИК"а |
Сообщ.
#9
,
|
|
|
Спасибо тебе за помощь написал как мог вроде все пошет смущает только один момент вот тут кусочек
clrf IntCon ; Запрет всех прерываний. movlw b'11000001' ; Синхронизация от RC генератора, канал RA0(AN1) movwf ADCON0 bsf ADCON0,2 ; Включение начала преобразования. btfsc ADCON0,2 ; Проверка ( Преобразование закончилось или нет ). Goto $-1 ; Преобразование не закончено. movfw AdresH ; Переписываем результат преобразования movwf TekH ; в старший текущий регистр. bsf STATUS,RP0 ; Банк 1. movlw 7Fh ; 7Fh - адрес регистра TekL. movwf FSR ; Запись мл. регистра АЦП по movfw AdresL ; косвенной адресации movwf IndF ; в регистр TekL. bcf STATUS,RP0 ; Банк 0. MOVF AdresL,0 писал не сам нащел в сети и не знаю насколько н правельный по идеие тут в W должно оказаться значение преобразования АЦП Если нет то подправь пожалуйста вход подаеться на 0 ногу порта А Контроллер PIC16c72 |
Сообщ.
#10
,
|
|
|
[quote=Wer_wolf,1175768923,1511713]movfw AdresH ; Переписываем результат преобразования
movwf TekH ; в старший текущий регистр. bsf STATUS,RP0 ; Банк 1. movlw 7Fh ; 7Fh - адрес регистра TekL. movwf FSR ; Запись мл. регистра АЦП по movfw AdresL ; косвенной адресации movwf IndF ; в регистр TekL. bcf STATUS,RP0 ; Банк 0. MOVF AdresL,0[/quote] movf AdresH,0 ; Переписываем результат преобразования [/quote] movf AdresL,0 ;Перекидываем в аккумулятор По умолчанию MPLAB пробивает 1 = оставить данные в регистре (не зеркалить в аккумулятор. После этого у тебя в регистре TekH = старший байт результата, в регистре 017F=младший байт=аккумулятор. |
Сообщ.
#11
,
|
|
|
[QUOTE=medved_68,1175774869,1511916][quote=Wer_wolf,1175768923,1511713]movfw AdresH ; Переписываем результат преобразования
movwf TekH ; в старший текущий регистр. bsf STATUS,RP0 ; Банк 1. movlw 7Fh ; 7Fh - адрес регистра TekL. movwf FSR ; Запись мл. регистра АЦП по movfw AdresL ; косвенной адресации movwf IndF ; в регистр TekL. bcf STATUS,RP0 ; Банк 0. MOVF AdresL,0[/quote] movf AdresH,0 ; Переписываем результат преобразования [/quote] movf AdresL,0 ;Перекидываем в аккумулятор По умолчанию MPLAB пробивает 1 = оставить данные в регистре (не зеркалить в аккумулятор. После этого у тебя в регистре TekH = старший байт результата, в регистре 017F=младший байт=аккумулятор.[/QUOTE] Ты не мог бы прривести полностью косочек кода от инициализации АЦП до получения результата в W Я раньше никогда ничего не делал с АЦП А с контроллерами работаю только на урове MPLAB Тоесть никогда ничего не собирал на нем по настоящему поэтому если с языком более мения разобрался то вот тут возникают большие проблеммы особенно если учесть что сэмулировать в MPLAB работу АЦП немогу |
Сообщ.
#12
,
|
|
|
Цитата Wer_wolf @ Ты не мог бы прривести полностью косочек кода от инициализации АЦП до получения результата в W Прикреплённый файлACP.zip (1.24 Кбайт, скачиваний: 264) |
Сообщ.
#13
,
|
|
|
Цитата medved_68 @ Цитата Wer_wolf @ Ты не мог бы прривести полностью косочек кода от инициализации АЦП до получения результата в W Спасибо огромное вроде что то делал теперь только ждать резюме препода по этому всему |
Сообщ.
#14
,
|
|
|
Цитата Wer_wolf @ Спасибо огромное вроде что то делал теперь только ждать резюме препода по этому всему А динамическое обновление индикатора сделано??? Ведь только 1 сегмент будет без этого светиться. |
Сообщ.
#15
,
|
|
|
Вот посмотри тут еще твоего кусочка не добавил потому что не совсем его понял
И схема немного другая Прикреплённый файлmain2.zip (7.41 Кбайт, скачиваний: 315) |