Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: ivan_fd  
Pic Basic pro для начинающих
Python Дата: Пт, 19.02.2010, 23:50  |                                                                                                                Сообщение # 121
Группа: Пользователи
Ранг:  Пытаюсь разобраться
Сообщений: 45
Репутация: 0   ±
Замечания:   ±
На сайте с 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
ЯНДЕКС Дата: 19.02.2010
Dmitry Дата: Сб, 20.02.2010, 03:11  |                                                                                                                Сообщение # 122
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 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)
---------------------------------------------
Ничего не получается sad

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
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

тьфу ты, а биты GIE и INTE зачем отключил? Надо писать
INTCON = %11010000
Python Дата: Сб, 20.02.2010, 17:26  |                                                                                                                Сообщение # 125
Группа: Пользователи
Ранг:  Пытаюсь разобраться
Сообщений: 45
Репутация: 0   ±
Замечания:   ±
На сайте с 11.02.2010

Статус: Offline

после первого импульса начинает считать с огромной скоростью и ни какой реакции на последующие импульсы...
включены подтягивающие резисторы(программно) на плюс, вывод через оптрон на минус

Сообщение отредактировал Python - Сб, 20.02.2010, 17:47
pic_anton Дата: Сб, 20.02.2010, 19:12  |                                                                                                                Сообщение # 126
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 58
Репутация: 0   ±
Замечания:   ±
На сайте с 18.02.2010

Статус: Offline

Хотелось бы вернуться к ЛСД если я все правильно понел то он рабочий просто надо разобраться со схемой


Век живи, Век учись, и всего не постичь!!!
Python Дата: Сб, 20.02.2010, 20:49  |                                                                                                                Сообщение # 127
Группа: Пользователи
Ранг:  Пытаюсь разобраться
Сообщений: 45
Репутация: 0   ±
Замечания:   ±
На сайте с 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 камня

при таком подключении работает железно в данный момент

Прикрепления: 0724350.jpg (31.1 Kb)

Сообщение отредактировал Python - Сб, 20.02.2010, 20:50
Dmitry Дата: Сб, 20.02.2010, 23:51  |                                                                                                                Сообщение # 128
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Quote (Python)
после первого импульса начинает считать с огромной скоростью и ни какой реакции на последующие импульсы

Правильно, надо еще ускорить темпы изучения изыка. smile
Потому как в даташите в описании регистра 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
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 6   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 23.01.2010

Статус: Offline

Всем привет!
Есть вопросик, по РВР следующего содержания:
- имею два массива (фиксированный график с осями х и y), некоторые значения массива х имеют отрицательное значение, в реальности это нормально, предположим уличная температура.
Как РВР объяснить, что интервал может быть как плюс так и минус?
Также возникли проблемы с выводом на LCD этих значений.


Купить за деньги может ВСЁ,
А ты попробуй сделай САМ!!!
ЯНДЕКС Дата: 21.02.2010
terrarus Дата: Вс, 21.02.2010, 10:06  |                                                                                                                Сообщение # 132
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 17   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Alexandr280480, А Протону ничего про отрицательные числа объяснять не нужно, он их прекрасно понимает! И даже дробные с плавающей запятой понимает!

Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
terrarus Дата: Вс, 21.02.2010, 10:18  |                                                                                                                Сообщение # 133
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 17   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Quote (Python)
Могут оптроны быть сильно инерционными? в частности оптрон - PC817

хороший оптрон, работать может на частте 80 кГц. длительность фронтов 3-4 микросекунды.
Думаю дело не в оптроне. приведите пож. полный листинг программы и желательно схему подключения энкодера, а заодно и ЖКИ. С энкодерами приходилось работать, может быть смогу помочь.


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Python Дата: Вс, 21.02.2010, 12:23  |                                                                                                                Сообщение # 134
Группа: Пользователи
Ранг:  Пытаюсь разобраться
Сообщений: 45
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 5   ±
Замечания:   ±
На сайте с 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, причем здесь Протон?
Если ответить по сути вопроса нечего, то лучьше не спамить.
Поиск: