|
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 Заранее Благодарю))))Выслушаю всю критику так что не стесняйтесь |
|
|
Если в программу включен файл 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 |
|