Printable Version of Topic
Click here to view this topic in its original format
Forums > Глюкодром > Парочка строк на Бейсике, для pic


Posted by: Always Green on 26-06-2006, 02:28
Господа програмисты, помогите решить проблемку.
Черкните пару строчек на пикбэйсике.
Задача - прочитать уровень сигнала, скажем на PORTA.1 . Если высокий, то выставить третье состояние, скажем на PORTA.2, если низкий, выставить высокий уровень там же.
Очень нужно наладить одну схемку на pic16f628a - заменил рекомендуемые схемой транзисторы и оптопары на имеющиеся под рукой и как результат придется подбирать резисторы и кондеры.

Для освоения Ассемблера я староват, а Бейсик в самый раз. Если не влом, киньте ссылочку с описанием команд пикбейсика, желательно на русском. Поиском что-то не ищется, наверное не те слова в поиск вставляю...

Posted by: TAHKEP on 26-06-2006, 10:34
Наверное, смогу написать такое, но только на pic'овском asm'e :( Кроме того, разве у PIC16 можно поставить порт в третье состояние? Его вроде бы в таком случае на вход ставят?

Posted by: Vlad_il on 26-06-2006, 11:02
1. Что ты имееш виду под 3-м состоянием?

Насколько я помню PIC-и один из портов можно настрить под аналог тогда на ЦАП-е можно выстовить что хочеш.

Маленький совет: хочеш работать нормально с PIC-ми учи C.

Posted by: TAHKEP on 26-06-2006, 11:39
QUOTE (Vlad_il @ 26-06-2006, 11:02):
Маленький совет: хочеш работать нормально с PIC-ми учи C.
Зачем? Все эти надстройки -- бейсики, С для написания несложных програм на PIC не нужны вообще. Выучить 33 команды PIC'овского ASM гораздо проще и продуктивней, имхо.

Posted by: Vlad_il on 26-06-2006, 12:24
Ню-Ню. Смотря какая программа. У нас проги были довольно сложные плюс экран, клавиатура и часы. Плюс с 10-ок аналоговых и дигитальных сенсоров и большое колечество релюшек. Нам не всегда C хатало из за сложных матиматических расчетов с точностью в 10-м знаке после запятой. Частенько начальник на форт переходил.

Posted by: TAHKEP on 26-06-2006, 12:55
Дык я ж написал -- "несложных". Если есть сложная математика -- да, С сильно облегчит жизнь. Но если прога типа поглядеть что на одном порту и что-то сделать на другом -- вполне подходит асм. Кроме того в железках, которые должны активно работать в реальном времени асм имхо тоже предпочтительнее -- точно знаешь, что за команда выполняется в любой момент времени. Ну и это -- иногда довольно "развесистую" прогу нужно утоптать в "маленький" проц.

Posted by: Always Green on 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), да и наверное это лишнее, во всяком случае, на данном этапе...

Posted by: TAHKEP on 26-06-2006, 18:10
QUOTE (Always Green @ 26-06-2006, 12:55):
TAHKEP, в крайнем случае подойдет и ассемблер, но только в HEX, а то у меня нечем в хекс перевести...
Качни с Microchip.com Mplab IDE (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002 Пригодится имхо в любом случае
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:

Posted by: Vlad_il on 27-06-2006, 10:09
QUOTE (TAHKEP @ 26-06-2006, 15:10):
P.S. Щас прийдёт ув. Vlad_il и будет громко смеяться :wink:
А вот и не приду. ЗЫ. :diablo:

Posted by: Always Green on 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.
"Почти понятно" потому что, вроде получается что в любом случае, нольли на входе или единица, все равно выполняется команда
CODE
BCF      PORTх,у


Ну а метка InitPORTS вообще выше моего понимания... То есть если не выполнить инициализацию, порты не будут работать ни на прием ни на отдачу? Это что-то вроде правил этикета, по которым прежде чем взять блюдо со стола надо предложить его другим?
QUOTE:
Ставим первый канал порта на вход (1) остальные на вывод (0)
То есть те входы, которые не работают на ввод работают как выходы? А как же ножки, к которым подключен кварц (RA7 и RA6)? Они то и не входы и не выходы?

В общем, вернусь с дачи, буду думать. Зря топик в глюкодром перенесли - тут еще флеймить и флеймить.... :)

Posted by: TAHKEP on 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 прописаны

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)