Свежие обсуждения
Микроконтроллеры

Ликбез по программированию PIC

1 85 99

Не грузится вот эта страница
http://pro-radio.ru/controllers/2108-85/
чистый лист, хотя новое сообщение "dmi, сегодня, 10:54" на странице http://pro-radio.ru/fresh/more/ вижу.
Более ранние страницы темы "Ликбез по программированию PIC" могу просмотреть без проблем.

 

АК: Не грузится
Уже ОК.

 

dmi: Есть версия: величина напряжения читается не не с потенциометра?
для начала - проверить напряжение вольтметром на нужной ножке МК

по коду: лучше сделать по другому, в порт, куда подключены светодиоды записать значение АЦП. Тогда по свечению светодиодов в двоичном коде можно будет проконтролировать диапазон 0...255 (АЦП переключить в 8-ми разрядный режим)

Ваш код неработоспособен в представленом виде. Нужно так:
while( 1 )
{
ADCON0 |= 4; // начинаем преобразование АЦП
while (....) //ждем окончание преобразования
n=значение_АЦП //читаем из АЦП

... // потушить все LEDы (B0...B3)
switch( n )
{
case 0: ... // зажечь LED В0
case 1: ... // зажечь LED В1
case 2: ... // зажечь LED В2
case 3: ... // зажечь LED В3
default: ... // зажечь все LEDы (B0...B3)
}
}

т.е. запустить преобразование АЦП, подождать его завершение (или настроить на "автоматическое ожидание"), потом результат присвоить переменной n. Цапускать АЦП нужно перед каждым считыванием (т.е. когда нужно обновить показания результата АЦП)

 

Здраствуйте Всем!)))Я хотел попросить помощи,просто Я недавно начал изучать программирование микроконтроллеров!И взял себе задачку Вот как она звучит(Есть микроконтроллер pic16f84a и есть 5-ть кнопок и 5-ть светодиодов.При нажатии на 1-ю кнопку должен загорется первый светодиод,при отпускание светодиод должен потухнуть.при нажатии 2-ой кнопки должен загореться второй светодиод и так проделать с остальными оставшиемся,где порты RA0-RA1 и RB5-RB7 задейственны как входы)Для решение Этой задачи взял Ваш код,которые здесь обсуждались.Я его переделал но светодиоды не хотят загораться.Я хотел попросить У вас помощи,где я на касячил в программе,а то уже мозги кипят скоро можно будет суп делать
Вот предоставляю мой исходник:
List P=16f84a
include <p16f84a.inc>
;-----------------------------------
;Список Битов Конфигурации
;-----------------------------------
__CONFIG 03FF5h
;-----------------------------------
;Описание регистров
;-----------------------------------
PORTA EQU 05h
PORTB EQU 06h
TRISA EQU 85h
TRISB EQU 86h
STATUS EQU 03h
PR0 EQU 5h
TEMP EQU 072h
;----------------------------------
;Начало программы
;----------------------------------
ORG 0
GOTO START
;----------------------------------
;Описание нашей программы,Проинициализируем нашу программу
;----------------------------------
START bsf STATUS,PR0
movlw b'00011' ; Устанавливаем вход\выход портаА
movwf TRISA ; Где RA0,RA1 установлены,как входы,а RA2-RA4 как выходы

movlw b'11100000' ;
movwf TRISB ; 1-Вход,2-Выход
bcf STATUS,PR0

movlw b'11100' ; Задали начальное значение выхода порта
movwf PORTA ; (Светодиоды погашены)
movlw b'0001111' ; Задали начальное значение выхода порта
movwf PORTB ; (Светодиоды погашены)
;----------------------------------
;Начало циклов
;----------------------------------
Loop movlw b'11100'
movwf PORTA
movf PORTA,w
andlw b'00011'
movlw TEMP
;Начало самого цинка
Knopka_1 movlw b'00010' ; Нажимаем на первую кнопку
xorwf TEMP,w ; Сравниваем с TEMP если равны то w=o
btfss STATUS,Z ; Если нет,то устанавливаем флаг z и пропускаем одну команду
goto Knopka_2 ; Переход на кнопку 2
movlw b'10100' ; Зажигаем первый светодиод
goto Loop ; Возращение программы
Knopka_2 movlw b'00001' ; Нажимаем на 2-ю кнопку
xorwf TEMP,w ; Cравниваем с TEMP если равны то w=0
btfss STATUS,Z ; Если нет,то устанавливаем флаг z и пропускаем одну команду
goto VKnopka ; Переход на Vknopka
movlw b'01100' ; Зажигаем 2-ой светодиод порта А
goto Loop ; Переход на начало
VKnopka movlw b'11111' ; Гасим все светодиоды
goto Loop ; Переход на начало
Loop_1 movlw b'00011111'
movwf PORTB
movf PORTB,w
andlw b'11100000'
movlw TEMP

Knopka_11 movlw b'11000000' ; Нажимаем на первую кнопку
xorwf TEMP,w ; Сравниваем с TEMP если равны то w=o
btfss STATUS,Z ; Если нет,то устанавливаем флаг z и пропускаем одну команду
goto Knopka_22 ; Переход на кнопку 2
movlw b'00011110' ; Зажигаем первый светодиод
goto Loop_1 ; Возращение программы
Knopka_22 movlw b'10100000' ; Нажимаем на 2-ю кнопку
xorwf TEMP,w ; Cравниваем с TEMP если равны то w=0
btfss STATUS,Z ; Если нет,то устанавливаем флаг z и пропускаем одну команду
goto Knopka_33 ; Переход на Vknopka
movlw b'00011101' ; Зажигаем 2-ой светодиод порта А
goto Loop_1 ; Переход на начало
Knopka_33 movlw b'01100000' ; Нажимаем на 2-ю кнопку
xorwf TEMP,w ; Cравниваем с TEMP если равны то w=0
btfss STATUS,Z ; Если нет,то устанавливаем флаг z и пропускаем одну команду
goto VKnopka_1 ; Переход на Vknopka
movlw b'00011011' ; Зажигаем 2-ой светодиод порта А
goto Loop_1 ; Переход на начало
VKnopka_1 movlw b'11111111' ; Гасим все светодиоды
goto Loop_1 ; Переход на начало
end
Заранее Благодарю))))Выслушаю всю критику так что не стесняйтесь

 

И снова Я прилогаю В файле свой код

146616.rar

 

Если в программу включен файл p16f84a.inc, то описание регистров делать не надо - они уже описаны в этом файле.
Зачем делать математические операции над регистрами для установления флага "нуля" если можно сразу проверить нужный бит:
.....
movf PORTA,w ; читаем порт
movlw TEMP ; сохраняем значение
btfss TEMP, 2 ; (или btfsc TEMP,2) проверяем второй бит
......
Программа станет намного короче и в ней будет легче разбираться.

 

Labionda: movlw b'11100' ; запись числа b'11100' в W
Это ПРИНЦИПИАЛЬНО НЕВЕРНО.
Из самого синтаксиса команды movlw b'11100' очевидно, что это и есть запись в W числа b'11100' ..Не надо тратить время и место в листинге на написание того, что "масло масляное". Тут комментария по сути ПРОСТО НЕТ!
Комментарий должен отражать ЧТО ИМЕННО ДЕЛАЕТ КОМАНДА В ВАШЕЙ КОНКРЕТНОЙ ЗАДАЧЕ, например пояснить, чем у вас является b'11100' .
Если начинающий программист не усвоит этого простого правила, его ждет тупик, ибо профессионалы постоянно пользуются собственными наработанными кусками кода в последующих задачах. А без комментария фрагменты трудны для быстрого восприятия (легче снова написать), поэтому свои же наработки через некоторое время будут фактически недоступны..

 

Labionda:
А вы в MPLAB ( а лучше в PROTEUS ! ) пошагайте в оладке и посмотрите на какой строке кода не происходит того что должно произойти по комментариям к программе.
Я проходил в MPLAB но не че не нашел(Ошибок),может Я че-то не верно делаю!Вот попросил помощи у ВАС!

SAK:саписобА за Ваш совет,что при включение файла p16f84a.inc,то включаются автоматически все регистры специального назначения,незнал если честно
Может все таки кто не будь подскажет,где были допущены ошибки..

146689.asm

 

для начала - научитесь читать результаты компиляции - Warning, Error, Message
поправьте "граматику" - уберите лишние пробелы, бита STATUS,PR0 несуществует(есть RP0), адрес 072h для 84А недопустим.
не надо лгать - Вы не могли пройти MPLAB с такими ошибками.
Evgeny Korabelnikov на ваши вопросы не отвечает?

 

Во-первых Я не вру)))
Во-вторых Я проходил в MPLABE первым исходником а не вовторым,который я выложил!просто SAK написал что при включение файла p16f84a.inc то регистры можно неописывать ну Я вот и переправил исходник свой и выложил заново и не указал адрес PR0(RP0)))
AnSi:
СпасибА Вам,за у точнее)))Это просто моя описка была страшная,ну про PR0 ,но я ведь в первом исходнике указал адрес PR0 и это не повлияла на
работу!А MPLAB не показывает на ошибку адреса 072h)))
Извените,если я что не првильно пишу.Просто относительно недавна начал только изучать микроконтроллеры,просто самому интересно стало!
Вот выкладываю еще раз свой исходник самый первый!MPLAB не на что не ругается

146709.asm