Pic Basic pro для начинающих
|
|
Python |
Дата: Пт, 19.02.2010, 23:50 | Сообщение # 121 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 11.02.2010
Статус:
Offline
|
Quote (terrarus) Было точно такое дело оказался неисправным LCD. Как раз это и свидетельствует о том что LCD исправен (по крайней мере большинство так реагирует при подаче питания) и контрастность регулировать ненадо (если бы небыло резистора он бы вообще ничего не показывал) . Если в верхней строчке черные прямоугольники это значит что индикатор не принимает никаких сигналов гдето ошибка в подключении к контроллеру или в программе... Возможно обрыв RS или E... Добавлено (19.02.2010, 23.50.37) --------------------------------------------- Добрых всем выходных! Не могу заставить реагировать на изменение уровня на ноге rb0. В цикле без проблем, но слишком громоздко неуспевает считать все импульсы, нужно через прерывания, но как? Пните пожалста, что то туго вьезжаю... Вот часть кода : @ device PIC16F628A, INTRC_OSC, WDT_OFF, PWRT_ON, MCLR_OFF, PROTECT_OFF 'ОБЪЯВЛЯЕМ ПЕРЕМЕННЫЕ CNT VAR WORD OLDCNT VAR WORD 'НАСТРАИВАЕМ ПОРТЫ CMCON = %00000111 'КОМПАРАТОРЫ - ВЫКЛ, ВСЁ ЦИФРА 'OPTION_REG.7 = 0 'ВКЛЮЧАЕМ ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ TRISA = %00111100 TRISB = %00000011 INTCON = %10010000 'РАЗРЕШАЕМ АППАРАТНЫЕ ПРЕРЫВАНИЯ ON INTERRUPT GOTO PULSE 'НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ GOTO INIT PULSE: CNT=CNT+1 RETFIE INIT: cnt=1 oldcnt=0 PORTA=0 PORTB=0 RPT: LCDOUT $FE,2 LCDOUT "COUNT = " LCDOUT $FE, $C0 LCDOUT DEC Cnt GOTO RPT END
Сообщение отредактировал
Python - Пт, 19.02.2010, 20:11
|
|
|
|
Dmitry |
Дата: Сб, 20.02.2010, 03:11 | Сообщение # 122 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
ну как бы стоит подучить тех английский, чтоб полноценно пользоваться хелпом. Образец оформления прерывания из хелпа: DISABLE ' Disable interrupts in handler myint: led = 1 ' Turn on LED when interrupted RESUME ' Return to main program ENABLE ' Enable interrupts after handler кроме того, еще надо разрешить периферийные прерывания, т.к. порт B - это периферия. Т.е. в 6-м бите в INTCON поставить единичку.
|
|
|
|
Python |
Дата: Сб, 20.02.2010, 15:45 | Сообщение # 123 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 11.02.2010
Статус:
Offline
|
Спасибо за совет обязательно ускорю темпы изучения Если я правильно понял: INTCON = %01000000 'РАЗРЕШАЕМ ПРЕРЫВАНИЯ RB0 ON INTERRUPT GOTO PULSE DISABLE PULSE: CNT=CNT+1 RESUME ENABLE а почему DISABLE и ENABLE лежат за пределами подпрограммы обработки прерывания, какая то заморочка с счетчиком команд? еще один вопрос... прерывание происходит (в теории) только при изменении состояния линии порта? тоесть если RB0=1 произойдет только одно прерывание, и только после того как RB0 станет =0, произойдет еще одно прерывание? Добавлено (20.02.2010, 15.45.19) --------------------------------------------- Ничего не получается INTCON = %01000000 'РАЗРЕШАЕМ ПРЕРЫВАНИЯ RB0 ON INTERRUPT GOTO PULSE DISABLE PULSE: CNT=CNT+1 RESUME ENABLE INIT: CNT=1 OLDCNT=0 PORTA=0 PORTB=0 'НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ RPT: if OLDCNT<>CNT THEN LCDOUT $FE,2 LCDOUT "CNT = " LCDOUT DEC Cnt OLDCNT=CNT ENDIF GOTO RPT END На индикаторе CNT = 32736 уже при включении и никакой реакции на импульсы RB0 что же делать ума не приложу, наверное его нет, прикладывать нечего...
Сообщение отредактировал
Python - Сб, 20.02.2010, 14:05
|
|
|
|
Dmitry |
Дата: Сб, 20.02.2010, 16:00 | Сообщение # 124 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
тьфу ты, а биты GIE и INTE зачем отключил? Надо писать INTCON = %11010000
|
|
|
|
Python |
Дата: Сб, 20.02.2010, 17:26 | Сообщение # 125 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 11.02.2010
Статус:
Offline
|
после первого импульса начинает считать с огромной скоростью и ни какой реакции на последующие импульсы... включены подтягивающие резисторы(программно) на плюс, вывод через оптрон на минус
Сообщение отредактировал
Python - Сб, 20.02.2010, 17:47
|
|
|
|
pic_anton |
Дата: Сб, 20.02.2010, 19:12 | Сообщение # 126 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
58
Замечания:
±
На сайте с 18.02.2010
Статус:
Offline
|
Хотелось бы вернуться к ЛСД если я все правильно понел то он рабочий просто надо разобраться со схемой
Век живи, Век учись, и всего не постичь!!!
|
|
|
|
Python |
Дата: Сб, 20.02.2010, 20:49 | Сообщение # 127 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 11.02.2010
Статус:
Offline
|
Define LCD_DREG PORTB 'порт Б для данных Define LCD_DBIT 4 'начиная c RB4 (т.е. RB4, RB5, RB6, RB7) Define LCD_RSREG PORTB 'RS тоже вешаем на порт Б Define LCD_RSBIT 2 'на вывод RB2 Define LCD_EREG PORTB 'Е на порту Б тоже висеть будет Define LCD_EBIT 3 'на 3-ем бите т.е. RB3 DEFINE LCD_LINES 2 'на индикаторе 2 строки (количество знакомест PBP не интересует) расшифровываем дальше (провода): управление: вывод 1 и вывод 5 ЖКИ на минус вывод 2 ЖКИ на плюс вывод 3 ЖКИ на резистор потом на минус (контрастность) вывод 4 ЖКИ на RB2 камня вывод 6 ЖКИ на RB3 камня данные: вывод 11 ЖКИ на RB4 камня вывод 12 ЖКИ на RB5 камня вывод 13 ЖКИ на RB6 камня вывод 14 ЖКИ на RB7 камня при таком подключении работает железно в данный момент
Сообщение отредактировал
Python - Сб, 20.02.2010, 20:50
|
|
|
|
Dmitry |
Дата: Сб, 20.02.2010, 23:51 | Сообщение # 128 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Quote (Python) после первого импульса начинает считать с огромной скоростью и ни какой реакции на последующие импульсы Правильно, надо еще ускорить темпы изучения изыка. Потому как в даташите в описании регистра INTCON написано: bit 1 INTF: RB0/INT External Interrupt Flag bit 1 = The RB0/INT external interrupt occurred (must be cleared in software) Это означает, что при срабатывании прерывания по ножке RB0 бит 1 регистра INTCON автоматически устанаваливается в 1. Это так называемый флаг (т.е. признак) прерывания. А в скобках написано - должен быть сброшен программно. Потому как если ему перед выходом из прерывания не присвоить 0, то после выхода из прерывания оно будет тотчас же вызвано опять и так до бесконечности. Т.е. обработчик прерывания должен выглядеть так: DISABLE PULSE: CNT=CNT+1 INTCON.1 = 0 RESUME ENABLE
Сообщение отредактировал
Dmitry - Сб, 20.02.2010, 23:53
|
|
|
|
Python |
Дата: Вс, 21.02.2010, 01:42 | Сообщение # 129 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 11.02.2010
Статус:
Offline
|
Огромное спасибо, сам бы я долго въезжал... вроде бы заработало, только нет точности пропускает иногда импульсы, наверное потому что рукой кручу движок энкодера, скорость неодинаковая, если кручу резко - пропускает около 400 сотен импульсов... а может и оптрон дает инерционность, развязка нужна или нет, когда разные источники питания у камня свой у энкодера свой, или стоит через высокочастотный транзистор попробовать... Могут оптроны быть сильно инерционными? в частности оптрон - PC817, энкодер - AUTONICS E40S8-1000-3-T-24, может кто сталкивался
Сообщение отредактировал
Python - Вс, 21.02.2010, 02:03
|
|
|
|
Dmitry |
Дата: Вс, 21.02.2010, 03:10 | Сообщение # 130 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Та не, pc817 рукой замучить не получится, он десятки (если не сотни) килогерц может передавать, имхо. Причина пропусков скорее всего в том, что применяется программное прерывание (в PicBasic Pro другого и нет). Т.е. сначала завершается очередная basic-команда, затем проверяется условие прерывания и т.д. А команды вывода на LCD - они длинные, и пока lcdout выполняется, через RB0 успевает проскочить несколько неучтенных импульсов. Выход в использовании аппаратного прерывания. В PicBasic Pro это только на ассемблере, в Протоне можно и на бейсике аппаратное прерывание писать. При использовании аппаратного прерывания пофиг, сколько времени выполняется текущая команда, проц прервется посреди команды, чтобы обработать прерывание, главное, чтобы обработчик прерывания был как можно короче, чтобы во время обработки очередного прерывания не успел проскочить еще один импульс.
Сообщение отредактировал
Dmitry - Вс, 21.02.2010, 03:13
|
|
|
|
Alexandr280480 |
Дата: Вс, 21.02.2010, 08:33 | Сообщение # 131 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
96
Замечания:
±
На сайте с 23.01.2010
Статус:
Offline
|
Всем привет! Есть вопросик, по РВР следующего содержания: - имею два массива (фиксированный график с осями х и y), некоторые значения массива х имеют отрицательное значение, в реальности это нормально, предположим уличная температура. Как РВР объяснить, что интервал может быть как плюс так и минус? Также возникли проблемы с выводом на LCD этих значений.
Купить за деньги может ВСЁ, А ты попробуй сделай САМ!!!
|
|
|
|
terrarus |
Дата: Вс, 21.02.2010, 10:06 | Сообщение # 132 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Alexandr280480, А Протону ничего про отрицательные числа объяснять не нужно, он их прекрасно понимает! И даже дробные с плавающей запятой понимает!
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|
terrarus |
Дата: Вс, 21.02.2010, 10:18 | Сообщение # 133 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Quote (Python) Могут оптроны быть сильно инерционными? в частности оптрон - PC817 хороший оптрон, работать может на частте 80 кГц. длительность фронтов 3-4 микросекунды. Думаю дело не в оптроне. приведите пож. полный листинг программы и желательно схему подключения энкодера, а заодно и ЖКИ. С энкодерами приходилось работать, может быть смогу помочь.
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|
Python |
Дата: Вс, 21.02.2010, 12:23 | Сообщение # 134 |
Группа:
Пользователи
Ранг:
Пытаюсь разобраться
Сообщений:
45
Замечания:
±
На сайте с 11.02.2010
Статус:
Offline
|
Программа @ device PIC16F628A, INTRC_OSC, WDT_OFF, PWRT_ON, MCLR_OFF, PROTECT_OFF 'НАСТРОЙКА ВЫВОДОВ ЖКИ Define LCD_DREG PORTB Define LCD_DBIT 4 Define LCD_RSREG PORTB Define LCD_RSBIT 2 Define LCD_EREG PORTB Define LCD_EBIT 3 DEFINE LCD_LINES 2 PAUSE 4 LCDOUT $FE, 1 'ОБЪЯВЛЯЕМ ПЕРЕМЕННЫЕ CNT VAR WORD OLDCNT VAR WORD 'НАСТРАИВАЕМ ПОРТЫ CMCON = %00000111 'КОМПАРАТОРЫ - ВЫКЛ, ВСЁ ЦИФРА OPTION_REG.7=1 'ОТКЛЮЧАЕМ ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ TRISA=%00000000 TRISB=%00000011 INTCON=%11010000 'РАЗРЕШАЕМ ПРЕРЫВАНИЯ RB0 cnt=1 oldcnt=0 PORTA=0 PORTB=0 ON INTERRUPT GOTO PULSE 'НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ DISABLE PULSE: CNT=CNT+1 INTCON.1=0 RESUME ENABLE RPT: IF OLDCNT<>CNT THEN LCDOUT $FE,2 LCDOUT "CNT = " LCDOUT $FE, $C0 LCDOUT DEC Cnt OLDCNT=CNT ENDIF GOTO RPT END У энкодера используется одна фаза A, мне нужно считать кол-во импульсов (независимо вперед/назад) и на основании полученной величины выполнять определенные действия Питание на энкодер 24 VDC, на плюс оптрона от фазы А через резистор 500 ом, минус оптрона на минус питания энкодера Люди еще один нюанс... Где можно скачать Протон? Постоянно слышу только положительные отзывы, но реально найти рабочую ссылку немогу, везде какаято лажа... Мыло: sky132@mail.ru Может кто рачщедритца Я работаю в Микро Коде Студио (MicroCode Studio) с PIC BASIC PRO
Сообщение отредактировал
Python - Вс, 21.02.2010, 13:35
|
|
|
|
holyuser |
Дата: Вс, 21.02.2010, 13:04 | Сообщение # 135 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
228
Замечания:
±
На сайте с 12.12.2007
Статус:
Offline
|
Привет, Alexandr280480 Если значения температуры получаются от термодатчика DS18B20, то их можно хранить в массиве в том виде, в каком они приняты. Там отрицательным температурам соответствуют значения более 2000 (07D0h), а старший бит результата - знаковый. Ниже пример вывода на ЖКИ температуры (со знаком) в PBP: Code ....
temp var word ; RAW температура от DS18B20 sign var byte ; знак температуры result var byte ; целая часть результата remainder var word ; дробная часть результата
....
if temp > 2000 then ; отрицательная температура temp = 65535 - temp + 1 ; вычисление абс. значения sign = 45 ; ASCII код символа "-" result = temp / 16 ; вычисление целой части remainder = (temp // 16) * 625 / 1000 ;вычисление дробной части else ; неотрицательная температура sign = 43 ; ASCII код символа "+" result = temp / 16 ; вычисление целой части remainder = (temp // 16) * 625 / 1000 ;вычисление дробной части endif
lcdout $FE,128,sign,#result,".",#remainder," C " ; вывод на ЖКИ .... Добавлено (21.02.2010, 13.04.37) ---------------------------------------------
Quote (terrarus) Alexandr280480, А Протону ничего про отрицательные числа объяснять не нужно, он их прекрасно понимает! И даже дробные с плавающей запятой понимает! Уважаемый terrarus, если я не ошибаюсь, то это ветка PBP, причем здесь Протон? Если ответить по сути вопроса нечего, то лучьше не спамить.
|
|
|
|