Always Green
@ 26-06-2006, 02:28
Господа програмисты, помогите решить проблемку.
Черкните пару строчек на пикбэйсике.
Задача - прочитать уровень сигнала, скажем на PORTA.1 . Если высокий, то выставить третье состояние, скажем на PORTA.2, если низкий, выставить высокий уровень там же.
Очень нужно наладить одну схемку на pic16f628a - заменил рекомендуемые схемой транзисторы и оптопары на имеющиеся под рукой и как результат придется подбирать резисторы и кондеры.
Для освоения Ассемблера я староват, а Бейсик в самый раз. Если не влом, киньте ссылочку с описанием команд пикбейсика, желательно на русском. Поиском что-то не ищется, наверное не те слова в поиск вставляю...
TAHKEP
@ 26-06-2006, 10:34
Наверное, смогу написать такое, но только на pic'овском asm'e :( Кроме того, разве у PIC16 можно поставить порт в третье состояние? Его вроде бы в таком случае на вход ставят?
Vlad_il
@ 26-06-2006, 11:02
1. Что ты имееш виду под 3-м состоянием?
Насколько я помню PIC-и один из портов можно настрить под аналог тогда на ЦАП-е можно выстовить что хочеш.
Маленький совет: хочеш работать нормально с PIC-ми учи C.
TAHKEP
@ 26-06-2006, 11:39
QUOTE (Vlad_il @ 26-06-2006, 11:02) |
Маленький совет: хочеш работать нормально с PIC-ми учи C. |
Зачем? Все эти надстройки -- бейсики, С для написания несложных програм на PIC не нужны вообще. Выучить 33 команды PIC'овского ASM гораздо проще и продуктивней, имхо.
Vlad_il
@ 26-06-2006, 12:24
Ню-Ню. Смотря какая программа. У нас проги были довольно сложные плюс экран, клавиатура и часы. Плюс с 10-ок аналоговых и дигитальных сенсоров и большое колечество релюшек. Нам не всегда C хатало из за сложных матиматических расчетов с точностью в 10-м знаке после запятой. Частенько начальник на форт переходил.
TAHKEP
@ 26-06-2006, 12:55
Дык я ж написал -- "несложных". Если есть сложная математика -- да, С сильно облегчит жизнь. Но если прога типа поглядеть что на одном порту и что-то сделать на другом -- вполне подходит асм. Кроме того в железках, которые должны активно работать в реальном времени асм имхо тоже предпочтительнее -- точно знаешь, что за команда выполняется в любой момент времени. Ну и это -- иногда довольно "развесистую" прогу нужно утоптать в "маленький" проц.
Always Green
@ 26-06-2006, 12:55
QUOTE (Vlad_il @ 26-06-2006, 11:02) |
1. Что ты имееш виду под 3-м состоянием? |
На выходах без всяких команд третье состояние - "отключен" (высокое сопротивление в обе стороны, к земле и к питанию. К примеру, я подал на выход высокий уровень, потом низкий. Ну а потом хочу отключить вообще нафиг - а если при этом на вход работает, мне пофиг.
QUOTE |
Выучить 33 команды PIC'овского ASM гораздо проще и продуктивней, имхо. |
С пиками работать практически не собираюсь, просто сейчас надо настроить всего одну неработающую по входам схему.
Экономить память мне тоже ни к чему, посему непроизводительный бейсик мне тоже подходит.
К примеру команда бейсика pause 1000 после компилирования превращается в кучу строчек на ассемблере. Что для полного чайника легче - одна строчка бейсика или куча строчек ассемблерас циклами, обращениями к стекам, регистрам и прочим ужасам программирования :fear2:, и все ради экономии нескольких байт?
Что касается всяких си, паскалей, фортранов и прочих эсперанто, а так же до, ре, ми - на microchip.com есть бесплатный компилятор с picбейсика а как чайнику компилировать си?
TAHKEP, в крайнем случае подойдет и ассемблер, но только в HEX, а то у меня нечем в хекс перевести... (из хекса в ассемблере я могу посмотреть через icprog). Если горишь желание помочь, несмотря на жару, то тогда задание конкретнее - читаем RB1 и RA1. Если на RB1 единица, то на RB6 ноль и наоборот. Если на RA1 единица, то на RB7 ноль и наоборот.
В идеале конечно, мне надо выловить на RA1 наличие-отсутствие импульсов 22кгц, но так сильно напрягать не буду, тем более что не знаю, какой кварц подберу (сейчас 11,0294, а рабочая прошивка рассчитана на 14,31818), да и наверное это лишнее, во всяком случае, на данном этапе...
TAHKEP
@ 26-06-2006, 18:10
QUOTE (Always Green @ 26-06-2006, 12:55) |
TAHKEP, в крайнем случае подойдет и ассемблер, но только в HEX, а то у меня нечем в хекс перевести... |
Качни с Microchip.com
Mplab IDE Пригодится имхо в любом случае
QUOTE (Always Green @ 26-06-2006, 12:55) |
(из хекса в ассемблере я могу посмотреть через icprog). Если горишь желание помочь, несмотря на жару, то тогда задание конкретнее - читаем RB1 и RA1. Если на RB1 единица, то на RB6 ноль и наоборот. Если на RA1 единица, то на RB7 ноль и наоборот. |
На мой непросвещенный вгляд, может быть подойдёт такой код:
CODE |
...
InitPORTS ; Инициализация портов
BANKSEL TRISA ; Выбираем банк, в котором нах. TRISA
MOVLW B'00000010' ; Ставим первый канал порта на вход (1) остальные на вывод (0)
MOVWF TRISA ; Прописываем такую настройку для PORTA
MOVWF TRISB ; и PORTB
BANKSEL PORTA ; Возвращаемся в банк, где лежат регистры портов
WORK ; Главный рабочий цикл, сначала проверим PORTA
BTFSS PORTA,1 ; Если на RA1 -- ноль
GOTO RA7_1 ; -- переходин на установку в RA7 единички
BCF PORTA,7 ; -- иначе -- RA7=0
GOTO CHKPORTB ; Переходим на проверку PORTB
RA7_1
BSF PORTA,7 ; RA7=1
CHKPORTB ; Проверка PORTB
BTFSS PORTB,1 ; Если на RB1 ноль
GOTO RB6_1 ; -- переходин на установку в RB6 единички
BCF PORTB,6 ; -- иначе -- RB6=0
GOTO WORK ; Повторяем опрос портов
RB6_1
BSF PORTB,6 ; RB6=1
GOTO WORK ; Повторяем опрос портов
...
END |
HEX этого куска
CODE |
:020000040000FA
:020000002028B6
:100040008316031302308500860083120313851C78
:100050002B2885132C288517861C30280613272863
:040060000617272830
:00000001FF |
P.S. Щас прийдёт ув. Vlad_il и будет громко смеяться :wink:
Vlad_il
@ 27-06-2006, 10:09
QUOTE (TAHKEP @ 26-06-2006, 15:10) |
P.S. Щас прийдёт ув. Vlad_il и будет громко смеяться :wink: |
А вот и не приду. ЗЫ. :diablo:
Always Green
@ 27-06-2006, 20:20
TAHKEP, спасибо!
Опробую через неделю - уехал на дачу. Вернулся только потому что там сдох телевизор и надо купить новый.
QUOTE (TAHKEP @ 26-06-2006, 18:10) |
CODE | ...
InitPORTS ; Инициализация портов
BANKSEL TRISA ; Выбираем банк, в котором нах. TRISA
MOVLW B'00000010' ; Ставим первый канал порта на вход (1) остальные на вывод (0)
MOVWF TRISA ; Прописываем такую настройку для PORTA
MOVWF TRISB ; и PORTB
BANKSEL PORTA ; Возвращаемся в банк, где лежат регистры портов
WORK ; Главный рабочий цикл, сначала проверим PORTA
BTFSS PORTA,1 ; Если на RA1 -- ноль
GOTO RA7_1 ; -- переходин на установку в RA7 единички
BCF PORTA,7 ; -- иначе -- RA7=0
GOTO CHKPORTB ; Переходим на проверку PORTB
RA7_1
BSF PORTA,7 ; RA7=1
CHKPORTB ; Проверка PORTB
BTFSS PORTB,1 ; Если на RB1 ноль
GOTO RB6_1 ; -- переходин на установку в RB6 единички
BCF PORTB,6 ; -- иначе -- RB6=0
GOTO WORK ; Повторяем опрос портов
RB6_1
BSF PORTB,6 ; RB6=1
GOTO WORK ; Повторяем опрос портов
...
END |
|
начиная с метки Work (я так правильно понимаю, что то что InitPORTS, WORK, RA7_1, CHKPORTB, RB6_1 - это всё метки?) практически
все понятно. BTFSS наверное то же самое что "IF то что после меня равно 0" Наверное имеется небольшая описка, в задании если RA1=0, то не RA7=1, а RB7=1.
"Почти понятно" потому что, вроде получается что в любом случае, нольли на входе или единица, все равно выполняется команда
Ну а метка InitPORTS вообще выше моего понимания... То есть если не выполнить инициализацию, порты не будут работать ни на прием ни на отдачу? Это что-то вроде правил этикета, по которым прежде чем взять блюдо со стола надо предложить его другим?
QUOTE |
Ставим первый канал порта на вход (1) остальные на вывод (0) |
То есть те входы, которые не работают на ввод работают как выходы? А как же ножки, к которым подключен кварц (RA7 и RA6)? Они то и не входы и не выходы?
В общем, вернусь с дачи, буду думать. Зря топик в глюкодром перенесли - тут еще флеймить и флеймить.... :)
TAHKEP
@ 28-06-2006, 12:37
QUOTE (Always Green @ 27-06-2006, 20:20) |
(я так правильно понимаю, что то что InitPORTS, WORK, RA7_1, CHKPORTB, RB6_1 - это всё метки?) |
Да
QUOTE (Always Green @ 27-06-2006, 20:20) |
BTFSS наверное то же самое что "IF то что после меня равно 0" |
BTFSS расшифровывается как "Bit Test F Skip if Set" т.е. пропустить следующую команду если N-ный бит регистра F равен 1 (т.е. в нашем случае, в зависимости от состояния RA1 или RB1 будет либо выполнена либо пропушена следующая за BTFSS команда GOTO)
QUOTE (Always Green @ 27-06-2006, 20:20) |
Наверное имеется небольшая описка, в задании если RA1=0, то не RA7=1, а RB7=1. |
Виноват :( Тогда изменяем BCF PORTA,7 на BCF PORTB,7 и BSF PORTA,7 на BSF PORTB,7
QUOTE (Always Green @ 27-06-2006, 20:20) |
"Почти понятно" потому что, вроде получается что в любом случае, нольли на входе или единица, все равно выполняется команда BCF PORTх,у |
Имхо таки нет :) Пусть на RA1=1 Тогда При проверке BTFSS будет пропущена следующая команда GOTO RA7_1 и выполнена будет команда BCF PORTA,7, а затем (командой GOTO CHKPORTB) будет осуществлён переход на проверку состояния следующего входа. Если же на RA1=0 то GOTO НЕ будет пропущена и будет осуществлён переход на метку RA7_1 и выполнена команда BSF PORTA,7
QUOTE (Always Green @ 27-06-2006, 20:20) |
Ну а метка InitPORTS вообще выше моего понимания... То есть если не выполнить инициализацию, порты не будут работать ни на прием ни на отдачу? |
По умолчанию в этом pic'е все порты работают как входы. Если Вы будете что-то писать в порт (записью нужных значение в управляющий регистр PORTx) работающий как вход, то на вывод сам он не встанет и изменять своё состояние не будет. Что бы он стал выводом его надо настроить с помощью управляющего региcтра TRISx, установив в соответствующем разряде 0 (ноль). Легко запомнить 1-I-Input, 0-O-Output :wink:
QUOTE (Always Green @ 27-06-2006, 20:20) |
Ставим первый канал порта на вход (1) остальные на вывод (0) То есть те входы, которые не работают на ввод работают как выходы? А как же ножки, к которым подключен кварц (RA7 и RA6)? Они то и не входы и не выходы? |
Тут всё немножко сложнее, то чем будут эти ножки проца -- обычными I/O портами или входами импульсов от кварца определяется настройкой источника тактирующего сигнала. Эта настройка задаётся в специальном слове конфигурации проца при программировании или может быть указана в коде программы с помощью команды __CONFIG Тогда при генерации HEX настройки уже будут в этот HEX прописаны