Jump to content

Recommended Posts

Все вроде бы правильно, но! вторую команду lcdout я бы переставил (см.

ниже), так как на ее исполнение требуется на много больше чем 100мкС.

это ошибка!? Проверь Протеусом-сообщи результат! Сам до него ни как не

доберусь;(

Может проще использовать TMR0 с предделителем?

DEFINE LCD_DREG PORTC 'LCD data port B

DEFINE LCD_DBIT 4 'LCD data starting bit 0 or 4

DEFINE LCD_RSREG PORTC 'LCD register select port D.1

DEFINE LCD_RSBIT 1 'LCD register select bit 1

DEFINE LCD_EREG PORTC 'LCD enable port D.3

DEFINE LCD_EBIT 3 'LCD enable bit

DEFINE LCD_BITS 4 'LCD bus size 4 or 8

DEFINE LCD_LINES 2

DEFINE LCD_COMMANDUS 2000 'Command delay time in us

DEFINE LCD_DATAUS 50 'Data delay time in us

DEFINE OSC 20

od var byte

w1 var word

od100 var byte

od1km var word

F var word

st var bit

i var word

@ device WDT_OFF

OPTION_REG = $C7

trisB=255

LCDOUT $FE, 1,"Privet Andrey",#portb

pause 500

st=1

F=0

w1=1

intcon=$C0

T1CON=0

On Interrupt Goto signal

m:

if st=1 then

if PortB.7=1 and w1=1 then start

if PortB.7=0 and w1=0 then stoping

endif

goto m

start:

TMR1H=254

TMR1L=12

T1CON=1

PIE1=1

w1=0

high portc.0

goto ex

stoping:

PIE1=0

T1CON=0

od1km=F*3

LCDOUT $FE, 2, #od1km, " ", #F, " "

w1=1

F=0

low portc.0

ex:

st=1

goto m

Disable

signal:

f=f+1

TMR1H=254

TMR1L=12

PIR1=0

st=1

Resume

Enable

Share this post


Link to post
Share on other sites

О!!

Спасибо за ответ!!!

Я уже подумал ветка заброшена--вот и несмотрел.

Попробовал переставленный вариант--тоже неправильные показания!!!

При входных импульсах 10мс--показывает 82(отрезка)

при 12мс--99

что делать незнаю???!!!!!

бился и так и эдак результат нулевой.

Share this post


Link to post
Share on other sites

В РВР есть PULSIN для измерения длительности импульса. Если используется кварц на 20 МГц, то возвращается результат с инкрементом 2 мкс (например, если результат 200, то длина импульса 200х2 мкс).

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Новинки и уникальные решения Molex. На что обратить внимание и почему»

15 апреля приглашаем на вебинар, который будет интересен разработчикам и инженерам-схемотехникам, интересующимся тенденциями рынка, новыми перспективными решениями для соединений «провод-провод», «провод-плата», «плата-плата». Для инженеров КИПиА и IT будут освещены уникальные решения Molex для «удлинения» интерфейсов HDMI, DisplayPort и USB даже в условиях сильного зашумления, а также семейство бесконтактных датчиков Contrinex. Помимо этого, будет уделено внимание дальнейшему развитию направления антенн, где Molex имеет ряд интересных и уникальных решений.

Подробнее

Дело в том что при исполнении команды Pulsin--ничего параллельно делать нельзя--микроконтроллер тупо будет ждать конца импульса считая отрезки по 2 мксек.

А если длина импульса 1-50 мсек--а при этом надо еще следить за другим входом и регистрировать на нем количество приходящих импульсов--тогда команда Pulsin неподходит.

Поэтому пришлось написать свою программу подсчета длительности импульса--и теперь надо разобраться почему она неправильно считает.

Share this post


Link to post
Share on other sites

1)

m:

if st=1 then

if PortB.7=1 and w1=1 then start

if PortB.7=0 and w1=0 then stoping

endif

goto m

Вот тут нету ошибки? Один ENDIF и 3 IF. На сколько помню, каждому IF должен бвть свой ENDIF.

2) В самих доках по PBP написано, что нужно использовать GOTO Label как можно меньше и лучше юзать GOSUB ... RETURN. Это тоже может вызывать глюки. Допишите в каждую подрограмму st=1 и вызывайте из подрограммы m start и stoping через GOSUB ... RETURN.

Share this post


Link to post
Share on other sites
                     

Выбираем преобразователь для портативных устройств

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

Читать статью

m:

if st=1 then

if PortB.7=1 and w1=1 then start

if PortB.7=0 and w1=0 then stoping

endif

goto m

ошибки нет--если после if исполняется один оператор то endif ставить ненадо!!!

поменял на gosub и return

теперь при входных импульсах 10мс--показывает 88-89 отрезков(результат бегает от 88-89)

т.е. регистрирует входной импульс длительностью 8.8-8.9 мсек---короче теряется 1.1-1.2 мсек

Share this post


Link to post
Share on other sites
m:

if st=1 then

if PortB.7=1 and w1=1 then start

if PortB.7=0 and w1=0 then stoping

endif

goto m

ошибки нет--если после if исполняется один оператор то endif ставить ненадо!!!

поменял на gosub и return

теперь при входных импульсах 10мс--показывает 88-89 отрезков(результат бегает от 88-89)

т.е. регистрирует входной импульс длительностью 8.8-8.9 мсек---короче теряется 1.1-1.2 мсек

Комментарий: после конструкции If ... Then лучше всегда ставить endif, т.к. возможны недокументированные глюки, что я неоднократно замечал, читая получившийся после компиляции файл ассемблера.

Все временные интервалы лучше задавать через прерывание по таймеру и по возможности прогонять на симуляторе.

В Вашем случае необходимо использовать АППАРАТНОЕ прерывание, а именно конструкцию DEFINE INTHAND метка, и далее на ассемблере сохранение регистров при входе в прерывание и восстановление при выходе из прерывания. Читайте мануал, там есть пример, как это сделать.

Edited by narzan

Share this post


Link to post
Share on other sites

Привет программисты! Помогите начинающему Делаю автомат управления освещением аквариума на PIC16F874 и LCD WH0802. Пишу на PicBasic. Половину программы написал, а дальше что-то не могу. Короче как автомат должен работать: Включаю, на дисплее надпись "введите время", выставляю, потом надпись "установите интервал" ( например включение света от 8.00 до 21.00 ), после того как все настроил на дисплее идет время и в зависимости от времени включается/выключается свет. Программу часов я написал, всякие надписи типа "введите время" я смогу сделать, настроить интервал включения тоже сам смогу, но я не знаю как выставлять время. Алгоритм проги, которую я написал:

объявил переменные:

i var byte

w var byte

a var byte

i - часы

w - минуты

a - секунды

теперь сама программа

main:

for i = 0 to 23

for w = 0 to 59

for a = 0 to 59

LCDOUT $FE, 1, #i, ":", #w, ":", #a

pause 1000

next a

next w

next i

goto main

прога рабочая, проверено.

Я пробовал выставлять время так:

if portc.0 = 0 then M = M (переменная) + 1

if portc.1 = 0 then w = m

т.е. если кнопка, подключенная к портС.0 нажата например 5 раз, то

переменная М = 5, если нажата вторая кнопка, то минуты = 5, но так не катит. Подскажите, как можно настраивать время


Экономьте электричество, выключайте Num Lock!

Share this post


Link to post
Share on other sites

Данила

Для развития проекта, его лучше выложить со схемой в протеусе.

И потихоньку совершенствовать. по ходу учится.

Share this post


Link to post
Share on other sites

Опишите плз. полный алгоритм действий для 1-wire!!!

Для ds1820 уже разобрался (содрал пример с сайта), но вот как считать напругу с ds2450 не могу понять.

Если не сложно набросайте пример работы с ds2450 под picbasic pro

PLZ

Share this post


Link to post
Share on other sites

тоже начал мучать picbasic, тут возник вопрос: как подцепить и написать прогу под управление валкодером в пикбесике, конкретно под tda7313?

Share this post


Link to post
Share on other sites

Народ как в Pic Basic вывести на LSD байт в шестнадцатиричном виде?


Нас невозможно сбить с пути, нам пофигу куда идти

Share this post


Link to post
Share on other sites

Люди! не могу разобраться с командой : FOR....NEXT. Кто нибудь для примера, дайте простенькую прогу с этой командой.

И желательно с пояснением!

Share this post


Link to post
Share on other sites

подскажите пожалуйста в чем проблема?

элементарная програмка (включения и выключения светодиода)

loop:

high 10

pause 1000

low 10

pause 1000

goto loop

компилируется и на пик симуляторе запускается только на половину...

светодиод загорается но тухнуть не хочет...

пытаюсь написать ее же и скомпилировать в прилогающемся к пик симулятору бейсик компиляторе

так пишет что в строчке "pause 1000" ошибка...

в чем дело?

помогите разобраться пожалуйста?

Share this post


Link to post
Share on other sites

Уведите какой именно BASIC компилятор используете...

А есть там вообще подпрограма pause? и какой параметр берёт на вход? Может быть это в секундах? Тогда всё правильно у вас работает :) Потухнет через через 16 с копейкой секунд :) Какую именно ошибку выдайт в этой строке? Я на бейсике не писал ничего с времён школы.. лет 20 уже...

Share this post


Link to post
Share on other sites
тоже начал мучать picbasic, тут возник вопрос: как подцепить и написать прогу под управление валкодером в пикбесике, конкретно под tda7313?

Тоже сижу мучаю прогу под ЭНКОДЕР (2 шт, подключены к RB4:7)- PicBasicPRO

На даный момент имею:

'****************************************************************
'*  Name	: Обработчик сигналов энкодера					  *
'*  Author  : Lev@											  *
'*  Notice  : Copyright © 2009 Lev@						   *
'*		  : All Rights Reserved							   *
'*  Date	: 20.10.2009										*
'*  Version : 1.0											   *
'*  Notes   :												   *
'*		  :												   *
'****************************************************************
REGIN VAR BYTE
FLAGIN VAR BYTE

TRISB = %11110000	   	' Направление порта В			   
OPTION_REG = %10000000	  ' Подтягив. резисторы
ON INTERRUPT GOTO INT   	' При прерывании переход к подпрограмме
INTCON = %10001000		  ' Разрешение глоб. прерываний, прерывания по изм. RB7:RB4   
REGIN=0			  ' Очистка всех ячеек регистров
FLAGIN=0						  

' Заносим состояние входов в память
IF PORTB.4=1  THEN 
REGIN.0=1	
ELSE 
REGIN.0=0
ENDIF
IF PORTB.5=1  THEN 
REGIN.1=1	
ELSE 
REGIN.1=0
ENDIF
IF PORTB.6=1  THEN 
REGIN.2=1	
ELSE 
REGIN.2=0
ENDIF
IF PORTB.7=1  THEN 
REGIN.3=1	
ELSE 
REGIN.3=0
ENDIF			   

Main:					   ' < Основная программа
GOTO Main			   	' Зацикливание осн. программы >

DISABLE					 ' < Запрет всех прерываний
INT:					' Метка подпрограммы - обработчика прерываний
IF INTCON.0 = 0 THEN ET ' Проверка флага прерываний - было ли прерывание по изм. RB7:RB4

IF PORTB.4 <> REGIN.0 THEN 
 FLAGIN.0=1			  ' Установить флаг прерывания от соотв. входа RB4
   IF FLAGIN.1=1 THEN	 ' Проверка наличия изменения сигнала на парном выводе
	 PORTB.0=1			' Если да - импульс
	 PAUSE 100			' Формируем задежку импульса 0,1с
	 PORTB.0=0			' Конец импульса
	 FLAGIN.0=0			' Обнуляем флаг прерывания от соотв. входа RB4
	 FLAGIN.1=0			' Обнуляем флаг прерывания от соотв. входа RB5
   ENDIF
ENDIF
 IF PORTB.5 <> REGIN.1 THEN 
 FLAGIN.1=1			  ' Установить флаг прерывания от соотв. входа RB5
   IF FLAGIN.0=1 THEN	 ' Проверка наличия изменения сигнала на парном выводе
	 PORTB.1=1			' Если да - импульс
	 PAUSE 100			' Формируем задежку импульса 0,1с
	 PORTB.1=0			' Конец импульса
	 FLAGIN.0=0		   ' Обнуляем флаг прерывания от соотв. входа RB4
	 FLAGIN.1=0		   ' Обнуляем флаг прерывания от соотв. входа RB5
   ENDIF
ENDIF
IF PORTB.6 <> REGIN.2 THEN 
 FLAGIN.2=1			  ' Установить флаг прерывания от соотв. входа RB6
   IF FLAGIN.3=1 THEN	 ' Проверка наличия изменения сигнала на парном выводе
	 PORTB.2=1			' Если да - импульс
	 PAUSE 100			' Формируем задежку импульса 0,1с
	 PORTB.2=0			' Конец импульса
	 FLAGIN.2=0			' Обнуляем флаг прерывания от соотв. входа RB6
	 FLAGIN.3=0			' Обнуляем флаг прерывания от соотв. входа RB7
   ENDIF
ENDIF
IF PORTB.7 <> REGIN.3 THEN 
 FLAGIN.3=1			  ' Установить флаг прерывания от соотв. входа RB7
   IF FLAGIN.2=1 THEN	 ' Проверка наличия изменения сигнала на парном выводе
	 PORTB.3=1			' Если да - импульс
	 PAUSE 100			' Формируем задежку импульса 0,1с
	 PORTB.3=0			' Конец импульса
	 FLAGIN.2=0			' Обнуляем флаг прерывания от соотв. входа RB6
	 FLAGIN.3=0			' Обнуляем флаг прерывания от соотв. входа RB7
   ENDIF
ENDIF
ET:					' Подготовка к выходу из обработчий
INTCON.0=0		 ' Сброс флага прерываний по изм. RB7:RB4
RESUME
ENABLE					  ' Разрешение всех прерываний >
END

Это еще не конец. Еще допишу правильный выход из обработки. Потом скорее всего в асемблере откоректирую... :)

подскажите пожалуйста в чем проблема?

элементарная програмка (включения и выключения светодиода)

loop:

high 10

pause 1000

low 10

pause 1000

goto loop

компилируется и на пик симуляторе запускается только на половину...

светодиод загорается но тухнуть не хочет...

пытаюсь написать ее же и скомпилировать в прилогающемся к пик симулятору бейсик компиляторе

так пишет что в строчке "pause 1000" ошибка...

в чем дело?

помогите разобраться пожалуйста?

Если используешь Basic Compiler встроенный в PIC Simulator IDE - то там нету такой процедуры - юзай хелп к нему. А можешь как я - учить PicBasicPRO к нему есть поболее документации. (Кста Ты ею и пользуешься судя по всему, токо Basic Compiler это совсем другой язык)

Качай вот сдесь компилятор сцылка

Edited by wowa

Share this post


Link to post
Share on other sites

Вопрос:

Допустим есть B VAR BYTE как сделать побитную выборку? т.е. х=В0, В1, ... В7

Edited by Lev@

Share this post


Link to post
Share on other sites

Не знаю синтаксиса языка PicBasic, но побитную выборку можно сделать с помощью лог. операций AND и OR

Share this post


Link to post
Share on other sites
Не знаю синтаксиса языка PicBasic, но побитную выборку можно сделать с помощью лог. операций AND и OR

сам только учусь.

по логике вещей должно быть что-то похожее на

x VAR bit
B VAR byte

For i=0 to 7
x=B(i)
Next i

Но почему-то не хочет так работать...

Edited by Lev@

Share this post


Link to post
Share on other sites

А с чего это оно будет работать ? У вас В это что массив какой-то ? :)

Не знаю как в барсике, но в СИ если нужно работать с числом на уровне битов можно использовать битовое поле.

Edited by a_sergeevich

Будьте проще и люди к вам потянутся.

Share this post


Link to post
Share on other sites

И как это сделать?

Правилами запрещено цитировать предедущий пост. Пока вам предупреждение. Wowa.

Share this post


Link to post
Share on other sites

Для Си кратко:

Битовые поля

Внутри структурных типов могут быть организованы, так называемые, битовые поля. Такое поле начинается с младшего бита того слова, в котором оно будет размещаться. Битовые поля размещаются внутри 8-ми битных слов. Если поле не удается разместить в текущем байте структуры, то размещение продолжается в следующем байте. Битовые поля никогда не пересекают границу между 8-ми битовыми областями, выделенными для данной структуры. Например:

struct {

unsigned hi : 1;

unsigned dummy : 6;

unsigned lo : 1;

} foo @ 0x10;

В данном случае структура будет занимать один байт по адресу 0х10. При этом поле hi будет соответствовать нулевому биту, а lo – 7-му биту регистра по адресу 0х10. Младший бит поля dummy будет располагаться в первом, а старший – в 6-м битах регистра 0х10. Если структура описана, как показано выше, то она будет размещена по абсолютному адресу, и память под ее размещение выделяться не будет.

Если необходимо определить битовое поле, которое содержит неиспользуемые области, то можно указать безымянные поля:

struct {

unsigned hi : 1;

unsigned : 6;

unsigned lo : 1;

} foo @ 0x10;

Как это сделать на РВР я не знаю. Я честно сразу, когда заинтересовался пиками, тоже ломанул на РВР, но потом понял его ущербность и перешёл на Си и компиль-среда разработки микроСи, но сейчас учусь на HI-TEC там библиотек готовых меньше, что сподвигает более углубленному изучению :) и об этом решении ни грамма не жалею. Иногда то, что на первый взгляд выглядит просто потом выходит боком, да и консультацию по Си дадут 100% на форуме быстрее чем на барсике, а по нему могут вообще не дать, но это ИМХО.

Ещё Вам тут правильно подсказали, что чтение отдельных битов можно осуществлять с помощью побитовых операций в Си это & (И), |(ИЛИ) не путать с логическими операциями !!!.

Т.е смысл в том, что с помощью операции & и маски мы ненужные биты выключаем, а нужный считываем, например:

n = 00110101;

допустим нам надо узнать значение нулевого бита, тогда применяя маску 00000001

с = n & 00000001; мы передадим в "с" значение нулевого бита т.е 1, затем уже делаем с ним что нам надо.

00110101

&&&&&&&

00000001

---------

00000001

Чтобы включить биты (т.е, которые установлены в ноль) используем побитовую операцию ИЛИ (|)

n = 00110101;

c = 00000001;

c = c | n;

в результате "с" равно 00110101 т.е с == n

00000001

|

00110101

---------

00110101

Надеюсь объяснил понятно, уж аналог Си-шных побитных операций в барсике найдёте сами :)

Удачи и все же совет переходите на Си.

Edited by wowa

Будьте проще и люди к вам потянутся.

Share this post


Link to post
Share on other sites

Тогда это еще проще сделать на ASM - с помощью сравнения с "1" или "0" BTFSC и BTFSS ! Будет самый простой и КОРОТКИЙ код! ;)

Edited by Lev@

Share this post


Link to post
Share on other sites

В микроСи вообще доступ к битам осуществляется просто и наглядно:

char D;

bit0 = D.F0;

bit1 = D.F1 ну и т.д.

Честно асм вообще не знаю не лежит у меня к нему душа, как то на Си для себя мне проще и быстрее да и замарок меньше, хотя если Вы знаете асм накой Вам вообще этот барсик сдался ? :)


Будьте проще и люди к вам потянутся.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By MirVsem
      Добрый день.
      Есть интересные модули ибп для слаботочки до 1А.
      m.aliexpress.ru/item/4000109380893.html
       По цене идеально подходит для зоопарка роутеров, IoT устройств... Переключение на резерв (туда-обратно) без просадки. Зарядка литиевой банки как положено, всякие защиты от перегрузки и прочее. Казалось бы все замечательно. 
      НО как всегда не без ложки дёгтя.
       Защита от переразрядки работает неадекватно. Хотя возможно это не сама защита, а повышающий модуль. На пороге ~3в у него срабатывает циклический перезапуск и так пока банка не просядет ниже 3в. Точно померять нечем.
      Из наблюдений. Проверил напряжение переключается с 12в на 9в и щелчки. Естественно нагрузка в это время дико насилуется (роутер свистит минут 5 пока полностю не отключится)
      Вопрос к гуру. Возможно ли что-то доработать в даном модуле чтобы исправить этот досадный баг?
    • By Юлия Михайлова
      Требуються люди умеющие работать с микроконтролерами esp 32 и stm32 , так же будет плюсом опыт работы с raspberry , требования опыт работы не мение 1,5 года , возраст не старше 35 лет , готовы взять на удаленную работу просьба отправлять резюме , и звонить по номеру +380 (68) 227 82 52
    • Guest Роман
      By Guest Роман
      Добрый день, форумчане. Такая задача. Хочу создать несколько устройств на светодиодах. Задача каждого в том, чтобы от движения (датчик вибрации, наклона) светодиод начинал моргать, переливаться и т.д. Подпитывается всё от батарейки, конечно же как можно меньших размеров (таблетка).
      Собственно я уже реализовал такое пробное устройство на ATtiny13, вибродатчике 18015 и батарейке CR1220. Всё работает, но хотелось бы это дело и удешевить и уменьшить в размерах, если это конечно же возможно. Особо в параметрах МК я не разбираюсь, но могу сказать что мне от неё точно нужно:
      1) Маленький размер
      2) Как минимум 1 канал ШИМ (а лучше 3, для переливания трёх светодиодов RGB)
      3) Память на 1Кб (программу для одного такого устройства приложу ниже, может её можно и сократить, но не факт что такую же, но на три диода получится ужать)
      4) Низкое потребление или возможность подключения режимов с низким потреблением.
      5) Работа от 3В. (от таблетки)
      6) Возможность программирования через Arduino UNO (но другие варианты тоже рассматриваю, просто Arduino уже есть)

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

      Очень надеюсь на Вашу помощь. Заранее большое Вам спасибо!
      Прикладываю обещанный мною код:
      int vib = 4; int led = 0; long loopTime = 5000; void setup() { pinMode(led, OUTPUT); pinMode(vib, INPUT); } void loop() { if (digitalRead(vib)){ unsigned long currentMillis = millis(); while(millis()-currentMillis<=loopTime) { for(int fadeValue = 0; fadeValue <=255; fadeValue+=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 255; fadeValue >=0; fadeValue-=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 0; fadeValue <=255; fadeValue+=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 255; fadeValue >=0; fadeValue-=5){ analogWrite(led,fadeValue); delay(2); } digitalWrite(led, LOW); delay(600); } } }  
    • By Sambler
      У меня была похожая тема,  я решил проблему установив в include util/delay.h
      Но возникла еще одна ошибка, не могу понять, что оно хочет


      p.s. Я обещал, что предыдущая - последняя тема, но я ошибся, не думал, что тут 2 разные программы будут. В этот раз 100 процентов последняя тема и пойду сдавать работы Ы)

       

    • By LemonTV
      Есть картинка из сайта с фьюзами, есть программа avrdude_prog3.3 Как выставить правильно фьюзы чтобы не испортить мк? Незнаю как это сделать есть прямые и инверсные фьюзы, ГДЕ СТАВИТЬ ГАЛОЧКИ И КРУЖОЧЕК НА ПРЯМЫХ ИЛИ ИНВЕРСНЫХ?


×
×
  • Create New...