Консультация № 180829
17.11.2010, 22:22
55.00 руб.
0 15 1
Здравствуйте, уважаемые эксперты! Прошу Вас помочь с решением следуюшей задачи:
- написать программу в среде MPLab для вывода чисел 1,2,3,5 на индикатор микроконтроллера PIC16F84 последовательно с интервалом в полсекунды.
Составить блок - схему работы программы!
Спасибо!


Обсуждение

Неизвестный
18.11.2010, 10:04
общий
Уважаемые эксперты, здравствуйте! Вы не хотите решать эту задачу? или мала стоимость консультации?
давно
Посетитель
7438
7205
18.11.2010, 10:20
общий
Здравствуйте. Экий Вы быстрый...
Данный микроконтроллер лично мне незнаком, да, боюсь, другим тоже. Поэтому надо время, чтобы изучить.
Вы же не захотели облегчить задачу, дать описание языка... Ждите, у нас есть законные 5 суток, чтобы ответить.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
18.11.2010, 10:38
общий
Адресаты:
Здравствуйте, Игорь Витальевич! Хорошо, жду! В качестве дополнительной информации по микроконтроллеру PIC16F84 приложу учебные пособия!
Спасибо!
Прикрепленные файлы:
3eb0f65e280bea7214146f51701a60c6.rar
Неизвестный
18.11.2010, 10:47
общий
И еще вот самоучитель по программированию PIC контроллеров в прикрепленном файле.
Спасибо!
Прикрепленные файлы:
e46f5b095487af16cacb48bd1c651cff.pdf
Неизвестный
18.11.2010, 17:11
общий
Здравствуйте! Вот такая предполагаемая блок - схема:

давно
Посетитель
7438
7205
20.11.2010, 02:07
общий
Настала пора задать вопросики:

Что понимается под "индикатором микроконтроллера"? Просто порт В?
Надо ли делать семисегментное преобразование (если, допустим, индикатор подключен к порту В)?

Тяжело писать программу, которая пишется только под конкретную схемотехнику...

Кстати, Ваша картинка совершенно нечитабельна...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
21.11.2010, 06:02
общий
это ответ
Здравствуйте, Посетитель - 342555!
Забавный ассемблер... Итак, что мы имеем?
Программы для микроконтроллеров абстрактно не пишутся, а только под конкретную схему.
Исходя из примеров, приведенных в вопросе № 180728, я делаю вывод,
что зажигание всех 32 (4*8) сегментов индикаторов производится последовательно путем импульса
по выводу синхронизации порта В, состояние сегмента индикатора при этом берется с вывода данных того же порта.
Отсюда получаем следующий алгоритм:
1) Преобразуем требуемое число в сегментный код, показывающий, какие сегменты горят, какие нет
2) Отрабатываем эти 8 бит, тем самым рисуем число на первом индикаторе.
3) Гасим остальные 4 индикатора
4) Выдерживаем паузу
5) Рассматриваем следующее число и на пункт 1)
6) Зацикливаем до бесконечности
Вот такая получилась программа
Код:
        LIST    p=16F84

; Регистры общего назначения
PC equ 02h ; Счетчик команд
STATUS EQU 03h ; статус
PORTB EQU 06h ; порт В

; Управляющие регистры портов ввода-вывода
TRISB EQU 86h ; для порта В

; Биты регистра STATUS
RP0 EQU 05h ; бит выбора страницы

; Биты регистра PORTB
DAT EQU 04h ; бит данных
SYN EQU 05h ; бит синхронизации

CBLOCK 0CH ; блок рабочих регистров
WORK1 ; переменные для циклов
WORK2
NUM ; сегменты индикатора
ENDC

org 00h ; начало исполняемого кода
GOTO START

org 04h ; программа обработки прерываний
retfie ; отсутствует

; Основная программа
START
; Инициализация PORTB
MOVLW B'11001111' ; настройка порта В
BSF STATUS,RP0 ; выбор банка 1
MOVWF TRISB ; установка RB4, RB5 на вывод
BCF STATUS,RP0 ; выбор банка 0
;
BSF PORTB,DAT ; установка битов DAT, SYN
BSF PORTB,SYN ; в регистр PORTB

MAIN ;основной цикл
MOVLW 1
CALL ZAZHECH ;рисуем 1
CALL PAUSE ;пауза
MOVLW 2 ;2
CALL ZAZHECH
CALL PAUSE
MOVLW 3 ;3
CALL ZAZHECH
CALL PAUSE
MOVLW 5 ;5
CALL ZAZHECH
CALL PAUSE
GOTO MAIN

;=============================================
; Преобразование BCD -> 7 сегментный код
; 0 - горит
;=============================================
LCDTable
addwf PC,F ; W + PC -> PC
retlw b'11000000' ; ..FEDCBA = '0'
retlw b'11111001' ; .....CB. = '1'
retlw b'10100100' ; .G.ED.BA = '2'
retlw b'10110000' ; .G..DCBA = '3'
retlw b'10011001' ; .GF..CB. = '4'
retlw b'10010010' ; .GF.DC.A = '5'
retlw b'10000010' ; .GFEDC.A = '6'
retlw b'11111000' ; .....CBA = '7'
retlw b'10000000' ; .GFEDCBA = '8'
retlw b'10010000' ; .GF.DCBA = '9'

; Подпрограмма «Зажечь»
ZAZHECH
CALL LCDTable ; получаем в W сегменты индикатора
MOVWF NUM ; сохраним в NUM
MOVLW D'8' ; 8 бит
MOVWF WORK1 ; в счетчик WORK1
M01
BCF PORTB,DAT ; установка в 0 RB4 (чтобы горело)
BTFSC NUM,0 ; если 0 бит в регистре NUM = 0, то пропускаем
BSF PORTB,DAT ; команду, если нет, то установка RB4 в 1 (чтобы потухло)

; синхронизация PORTB
BCF PORTB,SYN
BSF PORTB,SYN
RRF NUM,1 ; сдвиг вправо, через перенос
DECFSZ WORK1,1 ; по всем 8 битам
GOTO M01 ; переход на метку M01

; погасим остальные 24 сегмента
; бит DAT обязательно = 1, т.к. последний бит везде = 1
MOVLW D'24' ; количество
MOVWF WORK1
M02
BCF PORTB,SYN
BSF PORTB,SYN
DECFSZ WORK1,1
GOTO M02

RETURN ; возврат из подпрограммы

; Подпрограмма «Пауза»
PAUSE
MOVLW D'128'
MOVWF WORK1 ; в счетчик WORK1
CLRF WORK2 ; очистка регистра
LOOP
DECFSZ WORK2,1 ; уменьшить счетчик WORK2, если он
GOTO LOOP ; не равен 0, то вернуться на метку LOOP
DECFSZ WORK1,1 ; уменьшить счетчик WORK1, если он
GOTO LOOP ; не равен 0, то вернуться на метку LOOP
RETURN ; возврат из подпрограммы

END

Блок-схема: block.doc (37.5 кб)
5
Отлично! Спасибо!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
21.11.2010, 19:35
общий
Адресаты:
Уважаемый Игорь Витальевич! Спасибо Вам за программу. Смогу проверить корректность ее работы в четверг. Насчет Ваших вопросов - с радостью бы ответил Вам, если бы сам разбирался в подобных понятиях. Сам же под индикатором я понимаю тот "экранчик" с 4мя портами, который стоит у нас на рабочих столах.
Неизвестный
21.11.2010, 19:38
общий
А сможете ли Вы помочь еще сделать блок - схему этой программы?
давно
Посетитель
7438
7205
23.11.2010, 15:04
общий
Я добавил блок-схему в ответ
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
23.11.2010, 15:12
общий
Адресаты:
Спасибо Вам!
Неизвестный
25.11.2010, 10:44
общий
Адресаты:
Здравствуйте! К счастью, программа компилируется верно, без ошибок, НО, к сожалению, выдает на дисплей не то, что нужно...Конкретных чисел в ней не видно.
давно
Посетитель
7438
7205
25.11.2010, 10:55
общий
К сожалению, у меня не было возможности проверить.
Я даже не знаю, как она должна правильно выводить, какова схемотехника.

Поэтому, опишите очень подробно, что реально происходит.
Что выводится? (какие горят сегменты, на каком индикаторе, меняются ли, как меняются)
Любая мелочь очень важна.

Можете, для наглядности, даже зарисовать и дать картинки...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
25.11.2010, 12:07
общий
Адресаты:
К сожалению, нам изменили формулировку задания. Требуется выводить числа от 0 до максимально возможного числа с использованием таймера прерываний на индикатор. Я добавлю новый платный вопрос , в который включу условие задания и блок - схему, данную преподавателем, по которой необходимо составить программу с точностью до обозначений. Поможете?
давно
Посетитель
7438
7205
25.11.2010, 12:15
общий
А как же
Надеюсь, что блок-схема осветит неясности...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа