Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 21.01.2015, 22:35   #1
zz-juve
Junior Member
 
Регистрация: 20.11.2009
Сообщений: 17
Вес репутации: 100/38
zz-juve will become famous soon enoughzz-juve will become famous soon enough
По умолчанию Не могу понять что не так PIC16F874

Осваиваю данный мк. Написал простую программу...
Код:
list p=16f874
 #include<p16F874.inc>
 __config _CP_OFF & _WDT_OFF & _PWRTE_ON &_RC_OSC

 ORG   0x000
 MOVLW b'10000000'
 MOVWF OPTION_REG ;отключил подтягивающие резисторы
 MOVLW b'00000000'
 MOVWF INTCON     ;запретил прерывания
 MOVLW b'00000000'
 MOVWF PIE1
 MOVLW b'00000000'
 MOVWF PIE2
 CLRF  PORTA
 CLRF  PORTB
 CLRF  PORTC
 CLRF  PORTD
 CLRF  PORTE
 MOVLW 0x06
 MOVWF ADCON1     ;настроил порт А и порт Е на цифровые
 MOVLW b'00000000'
 MOVWF TRISA      ;порт А выход
 MOVLW b'11111111'
 MOVWF TRISB      ;порт В вход      
 MOVLW b'11111111'
 MOVWF TRISC      ;порт С вход
 MOVLW b'11111111'
 MOVWF TRISD      ;порт D вход
 MOVLW b'00010000'
 MOVWF TRISE      ;порт Е выход
START1
 BSF   PORTE,2    ; 1 на выходе 2 порта Е при появлении питания 
 BTFSC PORTB,0    ; нажимаем кнопку один, переходим к метке IN1 и включается соответствующий светодиод PORTE,0
 GOTO IN1
 BTFSC PORTC,0    ; нажимаем кнопку один, переходим к метке IN1 и включается соответствующий светодиод PORTE,1
 GOTO IN2
 GOTO START1      ; если кнопки не работают
IN1
 BCF   PORTC,0    ; цикл включения первого светодиода и отключения второго
 BSF   PORTE,0
 BCF   PORTE,1
 GOTO START1
IN2
 BCF   PORTB,0    ; цикл включения второго светодиода и отключения первого
 BSF   PORTE,1
 BCF   PORTE,0
 GOTO START1

 END
и что-то не так... не работает в протеусе и в железе тем более.
Прошу направить в поиске верного решения проблемы.
zz-juve вне форума   Ответить с цитированием
Старый 21.01.2015, 22:49   #2
Ученый
Senior Member
 
Регистрация: 27.02.2007
Адрес: Москва
Возраст: 69
Сообщений: 590
Вес репутации: 1705/69
Ученый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant future
По умолчанию Re: Не могу понять что не так PIC16F874

Обратите внимание, в каких банках расположены используемые регистры. PORTx и TRISx - точно в разных. Перед использованием надо выбирать нужный банк (banksel имя_регистра).
__________________
Не знать - не стыдно, стыдно не учиться.
Ученый вне форума   Ответить с цитированием
Старый 22.01.2015, 05:12   #3
Guaho
Senior Member
 
Аватар для Guaho
 
Регистрация: 28.06.2013
Возраст: 47
Сообщений: 730
Вес репутации: 1674/47
Guaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant future
По умолчанию Re: Не могу понять что не так PIC16F874

Тут много вопросов по Вашей программе. Не лучшим образом сделано начало - не стоит налезать на адрес обработчика прерываний, а лучше сразу прописать "пустой" обработчик на будущее, так спокойнее будет:
Код:
;====== СТАРТ ПОСЛЕ СБРОСА ==============================================================================
              org       0000h  
              bcf       INTCON,GIE ;Все прерывания запрещаются глобально.
              goto     begin                ;Переходим на метку begin.
   
  ;====== Обработчик прерываний ==============================================================================
              org       0004h
  int        retfie    ;Пока что "пустой" обработчик, т.к. прерывания не используем.
   
  ;====== Инициализация ===========================================================
  begin    .......     ;Системная инициализация: настройка периферии, прерываний, портов и т.п.
              .......     ;Инициализация переменных при старте программы.
   
  ;====== НАЧАЛО ПРОГРАММЫ ===================================================
              .....
Далее. Убедитесь в том, что Вы явно указали все параметры глобального конфига (директива "__CONFIG") - чтобы не осталось параметров, обойдённых вниманием, но из-за которых вдруг почему-то контроллер работает не так, как мы хотим. То же самое касается настройки периферийных модулей: пропишите настройку всех модулей после сброса (либо посмотрите по даташиту состояние каждого модуля после сброса, и на эту информацию опирайтесь - если какой-либо модуль сам приходит в нужное Вам состояние после сброса, то его можно и не настраивать).
Далее - банки, как написал Ученый. Не забудьте только в конце всех настроек периферии переключиться на нулевой банк.
Написание текста программы: для удобства можно вынести код инициализации в отдельную подпрограмму - чтобы не "захламлять" начало программы.
Комментарии: они у Вас не совсем корректные. Например,
" BTFSC PORTB,0 ; нажимаем кнопку один". Это ведь команда проверки состояния бита порта, но не команда нажатия на кнопку. Правильнее будет: "проверяем, нажата ли кнопка один". Далее, посмотрите в свой код:
BTFSC PORTB,0 и BTFSC PORTC,0 - к обеим этим командам стоит комментарий "нажимаем кнопку один". Ошибка либо в комментарии, либо в коде. К каким линиям порта подключены кнопки? - вот в чём вопрос. Схему Вы не привели, а зря. Хотя бы словесно описали её! А то ведь непонятно, то ли в комментах ошибка, то ли в коде. Да и вообще: как у Вас включены кнопки? Судя по коду, каждая кнопка у Вас подключена одним контактом к "+" питания, а вторым - ко входной линии порта. Так? Вы же не зря отключаете внутреннюю подтяжку, как раз для такого случая она не нужна. Но, скажите, а резисторы от ног порта, к которым подключены кнопки, у Вас установлены? Если да, то каким номиналом? Если нет - плохо, будете "в железе" помехи ловить, т.к. при отжатых кнопках "кнопочные" входы будут "висеть в воздухе". Не говоря уже о том, что само такое включение кнопок - не лучший вариант с точки зрения помехоустойчивости. Нажатие кнопок должно формировать лог. 0 на входе контроллера - вот правильный подход.
Далее, смотрим на строку: IN1 "BCF PORTC,0". К этой линии подключена одна из кнопок, если я не ошибаюсь. Не пойму, зачем нужна эта команда?
Ещё: в реальной жизни существует такая штука, как "дребезг контактов". В Вашем примере не приняты меры для его подавления, поэтому "в железе" отработка нажатий на кнопки будет "глючить". Самое простое решение - написать подпрограмму замедляющего цикла на 20 мс и делать двойную проверку состояния:
- Кнопка нажата? Если да, выдерживаем паузу 20 мс.
- Ещё раз проверяем - нажата? Если да, выполняем нужное действие; если нет - переходим к новому витку глобального цикла.
Ну и напоследок. Есть такая замечательная штука, как симулятор (MPLAB SIM). Вы можете просмотреть, что происходит, как Ваша программа выполняется, пошагово, и таким образом отловить ошибки. Вот, к примеру, ошибка с банками, о которой упомянул Учёный: если бы Вы прогнали свою программу в симуляторе, то увидели бы, например, что регистр TRISD не изменился, хотя Вы пытаетесь записать в него число b'00010000'...

Последний раз редактировалось Guaho; 22.01.2015 в 05:25.
Guaho вне форума   Ответить с цитированием
Старый 22.01.2015, 18:35   #4
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 40
Сообщений: 3,246
Вес репутации: 3684/115
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Не могу понять что не так PIC16F874

Цитата:
Сообщение от zz-juve Посмотреть сообщение
Осваиваю данный мк. Написал простую программу...
и что-то не так... не работает в протеусе и в железе тем более.
Прошу направить в поиске верного решения проблемы.
А что означает "не работает"?
Видимо надо описать что означает "работает" , а потом на это ссылаться и задавать вопросы.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что за зверь - Скатерограмма Edua Общетехнические вопросы 17 01.03.2013 23:33
Не могу понять vit333vit Вопросы начинающих 10 26.03.2009 13:06


Часовой пояс GMT +3, время: 08:26.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot