Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

Проблема с кодом

Чт июн 14, 2012 21:44:51

Помогите пожалуйста, совсем отчаялся. Сварганил написал код MPlab не хочет его компилить ругается вот так
Код:
Error[113]   D:\SDB\16F628ATEMP.ASM 37 : Symbol not previously defined (_DATA_CP_OFF)

Не пойму в чем проблема ведь слово начальной конфигурации было в самом начале в шаблоне все того же MPlab, еще заметил странности попытался зачистить регистр ANSEL, что тоже не получилось
Код:
Error[113]   D:\SDB\16F628ATEMP.ASM 90 : Symbol not previously defined (ANSEL)
хотя проверял несколько раз такой регистр есть. если удалить эти строки то при отладке МК работает как то странно. Допустим порт А0 установлен на выход, и при подаче на него лог 1 ничего не происходит(смотрел в View->Watch) использовал стандартное средство MPLAB SIM. не работает так же ни в протеусе ни на железе(хотя не уверен что само железо рабочее). В принципе не работает уже в начале(и надеюсь только в начале) и для исправления этой ошибки схема не нужна но все же выложу(так же буду благодарен если согласитесь поискать еще ошибок, тогда в личку напишу что там вообще происходит). [url][URL=http://radikal.ru/F/i036.radikal.ru/1206/6e/a885a87c9935.jpg.html]Изображение[/url][/url]
Вложения
примечания.txt
Небольшие примечание(нужны только тем кто решился разобраться во всем коде)
(164 байт) Скачиваний: 205
16F628ATEMP.ASM
собственно код
(9.25 KiB) Скачиваний: 240

Re: Проблема с кодом

Чт июн 14, 2012 22:22:06

Algor писал(а):проверял несколько раз такой регистр есть.

Где он есть? В МК?
В подключаемом файле (p16F628A.inc) видимо нет.

По первому слову тожо, там же написано в комментах, что эти директивы должны быть в инклюдах.
Какой-то файл вы не подключили, в котором описаны эти директивы, вот он и ругается.

Re: Проблема с кодом

Чт июн 14, 2012 22:35:43

У PIC16F628A нет регистра ANSEL. А чтобы использовать все выводы как цифровые - надо отключить компараторы. В даташите есть пример:
Код:
CLRF       PORTA        ;Initialize PORTA by setting output data latches
MOVLW      0x07         ;Turn comparators off and
MOVWF      CMCON        ;enable pins for I/O functions
BCF        STATUS, RP1
BSF        STATUS, RP0  ;Select Bank1
MOVLW      0x1F         ;Value used to initialize data direction
MOVWF      TRISA        ;Set RA<4:0> as inputs
                        ;TRISA<5> always
                        ;read as ‘1’.
                        ;TRISA<7:6>
                        ;depend on oscillator
                        ;mode

Re: Проблема с кодом

Чт июн 14, 2012 23:23:46

Спасибо большое отключу компараторы, позволит ли это использовать PORTA, 4 как цифровой выход(просто знаю что там свои тонкости он же подключен к таймеру счетчику), а насчет того что не все файлы подключил можно ли поподробнее. Их же всего 2 надо 16F628ATEMP.ASM и P16F628A.INC я их скинул в папку с проектом, что еще надо?
И насколько я понял из
Код:
TRISA<5> always
                        ;read as ‘1’.
                        ;TRISA<7:6>

порт А 5 всегда настроен на вход и настроить его на выход возможности нет?

Re: Проблема с кодом

Чт июн 14, 2012 23:49:24

Файл p16f628a.inc не нужно копировать в папку проекта, в свойствах проекта должны быть указаны пути где искать инклуды.
Константа DATA_CP_OFF пишется без подчеркивания вначале.
У PIC12 и PIC16 вывод на котором MCLR всегда работает только как цифровой вход.
Вывод RA4 с открытым стоком, его надо подтянуть резистором на Vdd.

Re: Проблема с кодом

Пт июн 15, 2012 00:33:24

Зачем присоединять RA4 через резистор к питанию, резистор должен быть на сколько, 1КОм? И как его тогда вообще можно использовать?

Re: Проблема с кодом

Пт июн 15, 2012 08:24:08

Если регистры серии 74HC, резистор на RA4 может быть 10кОм или еще больше.
Не лучше ли будет соединить регистры последовательно (вывод DS(14) первой микросхемы вход, а далее Q7S(9) с DS следующей, SHCP(11) параллельно) и для обновления дисплея просто ввести новые данные для всех сегментов всех разрядов. С использованием 74HC595 динамическая индикация не нужна, их выходы сохраняют состояние до следующего импульса на выводе STCP (12). Выводы OE (13) можно посадить на Vss.

Re: Проблема с кодом

Пт июн 15, 2012 10:25:21

Немного не понятно как будет работать RA4 через резистор присоединенный к питанию, а в остальном мысль конечно интересная но оставлю уже как есть, тем более что динамическую подсветку не использую, а ОЕ довольно часто. Обновил принципиальную схему, вроде все косяки убрал. И еще насколько легко 74НС убить статикой(просто может от этого ничего не пашет)

Re: Проблема с кодом

Пт июн 15, 2012 10:30:28

Изображение

Re: Проблема с кодом

Пт июн 15, 2012 12:21:17

В предыдущем варианте RA4 был использован как разрешение четвертого индикатора, тогда резистор был нужен чтобы задать высокий уровень на этом выводе.
В новом варианте RA4 не использован, значит и резистор не нужен.
Что касается 74HCxxx, просто так их не убить, нужен серьезный разряд.

Re: Проблема с кодом

Пт июн 15, 2012 16:40:37

Исправил код в соответствии с исправленной принципиальной схемой, и еще парочка доработок из тех что вы все мне посоветовали(спасибо всем большое), код теперь компилится но в протеусе МК по прежнему не подает признаков жизни(на железе протестирую ближе к вечеру, но почему то уверен что результат будет тот же). Помогите пожалуйста найти ошибку.
Вложения
16F628ATEMP.ASM
(9.34 KiB) Скачиваний: 515

Re: Проблема с кодом

Пт июн 15, 2012 16:59:33

Код без коментов, так что спрашивайте. Хотя он такой примитивный что и так понятно вроде.

Re: Проблема с кодом

Пт июн 15, 2012 18:49:14

В отладчике пытаюсь посмотреть как работает код, команды bsf не устанавливает нужный мне бит.(((
В смысле порт настроен правильно, выполняется BSF PORTA,1 а в меню View->Watch в этих регистрах по прежнему нули!!(
Я уже в отчаянье подскажите в чем может быть проблема??(использую отладчик MPLAB SIM)

Re: Проблема с кодом

Пт июн 15, 2012 19:17:35

В самом начале кода (стр.89)
Код:
   MOVLW   0x1F         ;Value used to initialize data direction
   MOVWF   TRISA

В этом случае PORTA,1 будет входом. Microchip как то посоветовал как запомнить назначение битов направления 0 - похож на O(output), 1 - I(input).
И еще, PORTA и TRISA находятся в разных банках, поэтому надо сначала выставить нужный банк, а потом модифицировать значения. Кстати это относится и к другим регистрам. Надо аккуратнее работать с банками. Есть псевдокомманда ассемблера BANKSEL, например
Код:
        BANKSEL PORTA
        CLRF    PORTA
        BANKSEL TRISA
        CLRF TRISA

Все выводы PORTA на выход и у всех низкий уровень.

Re: Проблема с кодом

Пт июн 15, 2012 20:30:58

Огромное спасибо!!! И еще такой вопрос как избежать подобных ошибок при работе с константами(или это не актуально?)?

Re: Проблема с кодом

Сб июн 16, 2012 09:15:18

ОЗУ поделено на банки потому что в коде команды на адрес выделено 7 бит, остальные биты адреса это RP1 и RP0 регистре STATUS.
По той же причине (11 бит адреса в коде команды) прямые переходы и вызовы подпрограмм возможны в пределах страниц размером 2K. Чтобы перейти по адресу за пределами страницы, надо недостающие биты записать в PCLATH.

Re: Проблема с кодом

Сб июн 16, 2012 14:16:16

Последняя проблема. Отладил код. Вроде все работает, порты настроил в veiw->watch все значения меняются. в протеусе не работает
если заземлить разрешение на запись в регистрах сдвига все работает. Прогонял пошагово
Код:
CALL   rasshifrovka1   
   BCF   PORTA,1            
   CALL   Otobrajenie

команда BCF PORTA,1 обнуляет значение второго бита(это видно в veiw->watch) в протеусе и на железе там 1.
Как такое вообще возможно?????
Выкладываю все файлы
файл протеуса 111 как раз тот где эта нога на землю и на индикаторе все отображается(по крайней мере отображается это уже хорошо)
Вложения
sdb.rar
(72.62 KiB) Скачиваний: 139

Re: Проблема с кодом

Сб июн 16, 2012 16:36:33

команда BCF PORTA,1 обнуляет значение второго бита(это видно в veiw->watch) в протеусе и на железе там 1.

следующая команда ставит бит
CALL rasshifrovka1
BCF PORTA,1
CALL Otobrajenie
BSF PORTA,1

zaderjka
MOVLW 0C4h
MOVWF N0
cyl1
MOVLW 0FFh
MOVWF N1
cyl2
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ N0,1
GOTO cyl2
DECFSZ N1,1
GOTO cyl1
RETURN

здесь бесконечный цикл
Подпрограмма Otobrajenie написана в лоб.

Re: Проблема с кодом

Сб июн 16, 2012 19:51:38

Ну перед тем как устанавливается 1 вызывается подпрограмма отображения. Сегменты не подсвечиваются из чего я сделал выдод что RA1 не сбрасывается(ведь если заземлить разрешение то все в порядке). А код примитивный потому что писал еще в начале сема пока еще не сильно освоился с ассемблером и пиками вообще(да и щас еще печально как видите), так что каюсь но переписать времени нет.(хотя экзамен уже сдал так что наверно все же перепишу все как надо). А ошибки у меня в слове конфигурации, оттого и не пашет ничего, так что пока тему можно закрывать. Еще раз всем спасибо.
Тема закрыта