Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Помогите разобраться новичку (как правильно?)
Помогите разобраться новичку
ivan_fd Дата: Ср, 29.01.2020, 16:15  |                                                                                                                Сообщение # 301
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1102
Репутация: 93   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Посмотрел. Скажу честно, мало, что понял из вашего кода.
Что он должен делать??? Секундомер??


Меня все время преследуют умные мысли...но я быстрее!!!
ЯНДЕКС Дата: 29.01.2020
xvovanx Дата: Ср, 29.01.2020, 16:55  |                                                                                                                Сообщение # 302
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 398
Репутация: 39   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата ivan_fd ()
Посмотрел. Скажу честно, мало, что понял из вашего кода.

+1
Цитата Anatoliy1000 ()
Подскажите почему:1. Секундомер, дальше 300 с чем-то обнуляется.
2. От кудо взято значение максимальной яркости
BusOut $51               '4/16
3. Почему в Протеусе выдает ошибку АЦП.
и вообще как настроить секундомер, что бы показывало сначала с сотыми секундами, а как пройдет 99 секунд, показывало без сотых...

Советую не сваливать сразу все в кучу в коде, потом тяжело разобраться и понять. Делайте маленькими наработками- подпрограмками. Отработайте и наладьте корректную работу АЦП входа, чтоб не давал ошибок. И вообще зачем вы используете АЦП для опроса нажатия кнопки непонятно. Потом добейтесь нормальной работы счетчика таймера. Все это желательно делать изначально с нормальноподключенным индикатором по D шине, а потом уже переходить к индикатору с I2C подключением. Насчет индикации с сотыми и без. Создайте переменную флаг, как достигло 99 сотых - флаг в единицу, а вывод на индикатор с условиями: если флаг 0 - выводим инфу так и так в нужные знакоместа, флаг 1 - выводим по другому. Как-то так.

П.С.очень советую прикупить готовую отладочную платку с панелькой для 16F877/18F562 с кнопками, индикатором и Сом портом. Я до сих пор на них (у меня даже две) отрабатываю модули программ из больших проектов.

Сообщение отредактировал xvovanx - Ср, 29.01.2020, 17:02
Anatoliy1000 Дата: Ср, 29.01.2020, 17:25  |                                                                                                                Сообщение # 303
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 136
Репутация: 0   ±
Замечания:   ±
На сайте с 02.03.2016

Статус: Offline

Цитата anatol ()
Тебе два человека ответили на предыдущий вопрос, а в ответ тишина.

Извините! С тем примером все получилось. Проблема была в том что сказал от кудо-то пример и все работало пока не начал вносить корректировки. Думал раз поставил вас плюс значит проблема решена. Впредь буду знать.
Цитата ivan_fd ()
Что он должен делать??? Секундомер??

Да.
Цитата xvovanx ()
И вообще зачем вы используете АЦП для опроса нажатия кнопки непонятно.

Хочу потом туда кнопки накидать.
Цитата xvovanx ()
Все это желательно делать изначально с нормальноподключенным индикатором по D шине

Что такое Д шина не понял. Я делал секундомер на таком МК только через сдвиговый регистр. Все нормально получилось. Хочу попробовать через такой протокол так как купил модуль готовый а потом увидел что он не на сдвиговом.
Цитата xvovanx ()
П.С.очень советую прикупить готовую отладочную платку с панелькой для 16F877/18F562 с кнопками, индикатором и Сом портом.

Дайте пожалуйста ссылку с описанием что это такое. Может у меня есть а я не знаю.
Вообще не понял почему данный пример не могу пошагово исполнить в отладке. Первый раз такое, при попытках шаговой отладки бросает в начало программы. Переменные живёт своей жизнью.


Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
ivan_fd Дата: Ср, 29.01.2020, 20:32  |                                                                                                                Сообщение # 304
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1102
Репутация: 93   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Если вы делали секундомер с другим индикатором, то здесь то же самое, только индикация другая.
В протеусе, у меня, нормальная пошаговая отладка.


Меня все время преследуют умные мысли...но я быстрее!!!
Anatoliy1000 Дата: Чт, 30.01.2020, 11:48  |                                                                                                                Сообщение # 305
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 136
Репутация: 0   ±
Замечания:   ±
На сайте с 02.03.2016

Статус: Offline

1.Хотел сначала делать на таймере 0. Стал разбираться у него нет точной настройки, как на Т1. Пришлось перейти на него. Для отсчета сотых самое то. Добавляю к ответу... Разобрался как на Т0 сделать и как будь-то точность лучше чем Т1)))
2. В таймере в сравнении с показателем индикатора и временем показанным в нижней строке протеуса разница в начале 0,1 секунда (одна десятая). Не знаю как будет в железе, но для забега на 100 метров это большая погрешность. Такая разница начинается почти с самого начала. Думаю это из-за задержки тактового внутреннего генератора. Пока как устранить не знаю. С увеличением времени эта разница увеличивается: 1 минут погрешность 0,3 сек. Добавляю к ответу... Забыл в начале программы задать начало отсчета для таймера)))
3. Хочу сделать секундомер универсальный для бега на разные дистанции (100 метров, кроссы), сигналом на заданные интервалы времени и счетчиком кругов. К сожалению из бюджетных (до 1000рэ) нет ни чего хорошего. А с телефоном в руке бегать неудобно. Подскажите какие корпуса можно придумать. пока думаю сделать: корпус от распределительной коробки в леруа. На радиокоте видел кто-то делает вариант с мини дисплеями, но это мне пока не по силам, показалось мудрено очень.


Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
Сообщение отредактировал Anatoliy1000 - Чт, 30.01.2020, 13:36
ivan_fd Дата: Чт, 30.01.2020, 14:53  |                                                                                                                Сообщение # 306
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1102
Репутация: 93   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Anatoliy1000
Мой вам совет. Не используйте программные прерывания. (On Interrupt GoTo My_Int).
Я вообще не понимаю зачем их придумали.
Отсюда у вас и точности нету.
Пишите On_Interrupt GoTo My_Int
И перетащите функцию прерывания в начало программы:

Код
Dim knopka As Word
Dim DIGIT[4] As Byte
Dim N As Byte
Dim I As Byte
Dim znak1 As Byte 'ñîòûå
Dim znak2 As Byte 'ñåêóíäû
Dim znak3 As Byte 'ìèíóòû
Dim znak4 As Word 'îáùåå ÷èñëî:
Dim sotie As Byte

GoTo Start

My_Int: ' Ìåòêà íà÷àëà ïîäïðîãðàììû îáðàáîòêè ïðåðûâàíèé
Context Save
;INTF = 1 ÷òî äåëàòü åñëè ïðîèçîøëî ïðåðûâàíèå îò òàéìåðà
; ìîæåò ýòà ÷àñòü è íå íóæíà åñëè ôëàã ìîæíî ÷èòàòü â îñíîâíîé ïðîãðàììå
;=============================================================
    If T0IF = 1 Then      ; åñëè ïðîèçîøëî ïðåðûâàíèå îò òàéìåðà 0
     T0IF = 0             ; Ñáðîñèòü ôëàã
     Inc sotie              ; èíêðåìåíò ðåãèñòðà tik
     TMR0 = 7  ; îáíóëèòü òàéìåð 0

         
    EndIf
Context Restore

Start:
znak1 = 0
znak2 = 0
znak3 = 0
znak4 = 0
sotie = 0

BStart 
BusOut $02               'çàäàòü àâòîèíêðåìåíò çíàêîìåñòà
BStop


Меня все время преследуют умные мысли...но я быстрее!!!
Anatoliy1000 Дата: Пт, 31.01.2020, 06:59  |                                                                                                                Сообщение # 307
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 136
Репутация: 0   ±
Замечания:   ±
На сайте с 02.03.2016

Статус: Offline

Здравствуйте!
1. Не понял чем отличается On Interrupt GoTo My_Int от On_Interrupt GoTo My_Int
2. Вы предлагаете не прерываниями а циклической накруткой в самой программе?
3. Почему тело функции лучше в начало?
Сейчас точность стала намного лучше, написал в предыдущем ответе. Спасибо за помощь.


Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
ivan_fd Дата: Пт, 31.01.2020, 10:11  |                                                                                                                Сообщение # 308
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1102
Репутация: 93   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата Anatoliy1000 ()
1. Не понял чем отличается On Interrupt GoTo My_Int от On_Interrupt GoTo My_Int

Отличается тем, что это программные прерывания. Такое есть только в протоне и в PicBasic. 
Никому не нужная фигня. При On Interrupt, прерывание происходит, но временные интервалы будут не всегда точные. Потому, что в функцию прерывания мы будем входить только тогда, когда протон позволит.
В помощи четко написано
On Interrupt        Execute a subroutine using a Software interrupt
                              (On Interrupt is Legacy. Not Recommended)

Note.
Software interrupts are a remnant from earlier compiler versions and are not recommended for
new applications. See Managed Hardware Interrupts for a better method of interrupt handling.

Цитата Anatoliy1000 ()
3. Почему тело функции лучше в начало?


Не знаю как в новых версиях компилятора, но раньше были глюки, если функция прерывания была в конце программы.


Меня все время преследуют умные мысли...но я быстрее!!!
xvovanx Дата: Пт, 31.01.2020, 10:24  |                                                                                                                Сообщение # 309
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 398
Репутация: 39   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата Anatoliy1000 ()
Не понял чем отличается


Правильнее писать "On_Hardware_Interrupt My_Int" это железные, непрограмные прерывания. Програмные прерывания не могут разорвать некоторые условия выполнения работы (такие как пауза между импульсами I2C передачи данных, ШИМ модуляции и т.д.) и поэтому прерывание ждет пока действие выполнится и только потом идет на прерывание и выполнение My_Int. А железные прерывания (Hardware) живут на уровне ядра и рвут любое выполнение функций.
Я тело функции в начало не ставил никогда, но вот с размещением массивов столкнулся, что пришлось ставить в начало программы. Суть в том, что память контроллера состоит из банков (2 банка\4 банка\... зависит от объемов памяти). И бывают случаи, что текст подпрограммы прерывания, либо массив данных попадает на границу банков памяти (часть там, часть там) и при компиляции иногда вылазят косяки, что нужно отслеживать не одну точку входа в адрес памяти, а уже две. Поэтому лучше перестраховаться при чипах с малой памятью и сдвинуть в начало.

Сообщение отредактировал xvovanx - Пт, 31.01.2020, 10:40
xvovanx Дата: Пт, 31.01.2020, 10:42  |                                                                                                                Сообщение # 310
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 398
Репутация: 39   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Насчет корпусов - я заказываю у китайцев на Алиэкспресс (не реклама!), вот скрины (первые попавшиеся, можно и гораздо дешевле найти) на отладочную плату Pic16/18 (с готовым разъемом для подключения индикаторов\кнопками\ IR глазом\Сом портом и т.д.) и разные корпуса (хоть как от флешки, хоть для любого прибора или самоделки).
Прикрепления: 5155557.png(1.02 Mb) · 6110118.png(538.7 Kb)

Сообщение отредактировал xvovanx - Пт, 31.01.2020, 10:52
Anatoliy1000 Дата: Чт, 19.03.2020, 08:37  |                                                                                                                Сообщение # 311
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 136
Репутация: 0   ±
Замечания:   ±
На сайте с 02.03.2016

Статус: Offline

Здравствуйте!
Куплен МК 18F252 и снова проблемы на уровне детсада. Подскажите почему в такой программе:
 не мигает ЛЭД?
И если возможно подскажите алгоритм поиска таких метких ответов. Даже неудобно по такой мелочи каждый раз обращаться.
Прикрепления: 1311622.png(58.9 Kb)


Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
ЯНДЕКС Дата: 19.03.2020
DAlexV Дата: Чт, 19.03.2020, 09:33  |                                                                                                                Сообщение # 312
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 709
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Цитата Anatoliy1000 ()
не мигает ЛЭД?
Судя по картинке и горчичнику шпротеуса не подключена ножка сброса. Нужно подключить ее к  VCC в протеусе, и проблема должна отвалиться. Успехов  wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Anatoliy1000 Дата: Чт, 19.03.2020, 11:07  |                                                                                                                Сообщение # 313
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 136
Репутация: 0   ±
Замечания:   ±
На сайте с 02.03.2016

Статус: Offline

Спасибо.Кааак у вас получается с такой легкостью находить решение проблемы?

Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
DAlexV Дата: Чт, 19.03.2020, 12:22  |                                                                                                                Сообщение # 314
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 709
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Цитата Anatoliy1000 ()
Кааак у вас получается с такой легкостью находить решение проблемы?
Anatoliy1000, я уже вроде говорил. Шишку на шпроте в свое время набил smile , плюс много раньше с 18 линейкой работал, плюс немного знаю английский. Успехов в освоении 18 серии  wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
xvovanx Дата: Чт, 19.03.2020, 20:22  |                                                                                                                Сообщение # 315
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 398
Репутация: 39   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата Anatoliy1000 ()
Кааак у вас получается с такой легкостью находить решение проблемы?

Как и писал DAlexV, так там же ошибка описана - процессор постоянно находится в состоянии "ресета" из-за того, что на MCLR низкий потенциал. А вход сброса инверсный и сбрасывается именно низким потенциалом. Можно "покурить" даташит и найти что в 18 серии у многих чипов вход MCLR можно регистрами переключить и сделать как дополнительный логический вход. Тогда эта проблема пропадет.

П.С. а вообще то, лично я когда использую новый чип, изначально скачиваю даташит на него и изучаю нюансы.
Мне например 18 серия очень нравится, много ног, есть все вкусности в виде ШИМ модуляции, I2C, приоритетов прерываний, да и входов прерываний по три штуки. Вообщем не сложнее 16 серии. Я тут недавно занимался мелким 8 ногим чипом 12F1840, думал сейчас быстренько набросаю прогу, так вот на него я потратил времени раза в три больше, чем скажем на 18F8722.

Сообщение отредактировал xvovanx - Чт, 19.03.2020, 20:23
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Помогите разобраться новичку (как правильно?)
Поиск: