Файлы  •  Ссылки  •  Прошивки  •  Правила  •  Архив  •   FAQ  •  Участники  •  Поиск
Регистрация  •  Вход

Изучаем программирование PIC контроллеров

Список форумов » Программное обеспечение » Микроконтроллеры На страницу Пред.  1, 2, 3, 4, 5  След.
АвторСообщение
Хатуль_мадан
Новичок
Сообщения: 7




15-12-2011 14:07

Для начала, неплохо ознакомиться с правилами оформления самих текстов программы. Есть хорошая статья по этому вопросу:
http://www.pic24.ru/lib/exe/fetch.php/osa/articles/mpasm_formatting.pdf
Eex
Участник
Сообщения: 1493




16-12-2011 13:25

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

bsf GPIO, GPIO1 ;подаём питание на ёмкость
bsf GPIO, GPIO0 ;зажигаем светодиод

Инструкции модификации регистров работают так (да проконтролируют меня профессионалы):
процесс исполнения всякой инструкции состоит из 4-х циклов, от сюда частота исполнения инструкции = частота генератора/4.
1. ядро читает адрес регистра из инструкции
2. ядро читает указанный регистр в свой буфер
3. ядро изменяет свой буфер в соответствии с инструкцией
4. ядро записывает изменённый регистр обратно по адресу регистра

Рассмотрим что произойдёт с уровнями на выводах при исполнении нашего кода:

bsf GPIO, GPIO1
всё нормально, команда отработает как надо и переведёт бит порта в единицу. Однако само напряжение на ёмкостной нагрузке установится в 5 вольт не сразу, ему надо успеть зарядить конденсатор. Следовательно на ноге порта GPIO1 напряжение ещё не равно логической единице, оно только начало нарастать - 0.1 вольта, 0.12, 0.15, 0.2, 0.25 и так далее. Когда напряжение на ноге порта превысит нижнюю границу высокого уровня (примеро 0.7 вольт), контроллер уже успеет отработать несколько команд (количество команд зависит от ёмкости нагрузки).
этап второй, зажигаем светодиод:

bsf GPIO, GPIO0
Вот тут начинаются проблемы. Ядро читет регистр порта прямо с выводов контроллера (не с защёлки порта), а на выводе GPIO1 ещё не установилась логическая единица - время заряда не прошло. Ядро почитает с вывода GPIO1 логический ноль (почитает весь регистр, в котором бит GPIO1 будет равень нулю). После этого ядро установит бит GPIO0 и запишет значение обратно в регистр. В новом значении бит GPIO1 будет равен 0!!!, напряжение на GPIO1 никогда не достигнет единицы при исполнении такого кода в такой схеме. Я не смог на скорую руку найти списка команд, которые НЕ относятся к принцыпу чтение-модификация-запись, мне кажется что это только команда MOVWF. Читайте на странице 71 Read-Modify-Write Operations.
Вопросы?

musor.gif



Хатуль_мадан
Новичок
Сообщения: 7




16-12-2011 13:56

Выходы таковы:
Правильное подключение периферии к выводам портов МК (исключить токовые перегрузки и ограничивать токи перезаряда в любых случаях).
Использование команд bsf для коррекции внутренних регистров, а именно, читаем порт во временный регистр, команодой bsf модифицируем нужные биты, потом командой MOVWF временное содержимое пересылаем снова в порт.
Возможно есть и еще варианты...
Eex
Участник
Сообщения: 1493




16-12-2011 14:53

Хатуль_мадан писал:
читаем порт во временный регистр

нет никакой разницы кто читает порт Вы или ядро, порт будет почитан не правильно. Решать проблему схемотехникой тоже не всегда удаётся, у всех разные задачи и бывают разные схемные решения.
Конечно же код подбирается под конкретное схемное решение. У меня есть два устоявшихся метода (в случе если схемное решение имеет ёмкость)
1. считаю постоянную времени заряда и отслеживаю обязательную задержку.
2. резервирую дополнительный регистр и все действия делаю с ним (изменяю тоже его вместо порта), после каждого изменения регистра делаю
movf myreg, w
mowf GPIO
Eex
Участник
Сообщения: 1493




17-12-2011 00:54

хотел рассказать ещё про кнопки в контроллерах. При программировании надо учитывать дребезг кнопок. Кажется что это такая лишняя деталь, но нет, дребезг кнопок есть всегда и он мешает работе устройства. Предположим что мы программируем фонарик, который включается и выключается от кнопки без фиксации. Мы выбрали надёжную кнопку с чётким щелчком и запрограммировали круговой опрос кнопки. Код у нас не сильно большой и задержек почти нет, вся программа занимает несколько строк. Допустим что наш контроллер работает от 4МГц, значит частота исполнения команд 1 000 000 команд в секунду. Несколько команд на сравнение и установку битов, вот и всё, мы снова опрашиваем кнопку. Получается что за секунду контроллер опросил кнопку не менее 100 000 раз, а щелчок кнопки длится, в среднем, 10 мс. Получается что пока летели контакты кнопки по воздуху, мы её опросили 1000 раз, за это время 10 опросов пришлось на само касание контактов. Реально в такой ситуации наш фонарик включится и выключится 5-10 раз, при этом никогда нельзя сказать в каком состоянии он окажется при возникновении надёжного (последнего) контакта. Если дребезг кнопок не обработать, то пользоваться фонарём у вас не получится улыбка. У меня есть пара любимых обработчиков кнопок, может потом выложу код. Обработать дребезг можно всякими хитроумными способами, этих способов больше чем программистов улыбка у каждого есть несколько способов обработки дребезга.
Сникерсни
Новичок
Сообщения: 23




19-12-2011 23:24

Здравствуйте, я пока в этом деле чайник но тоже решил попробовать улыбка ;
movlw b'00110101 ;коэф деления 1:8 внутренний такт, задержка примерно 0.5 сек.
movwf T1CON
Я так понимаю таймер ещё надо будет перезапускать 30 раз чтобы получить 15 сек?
Eex
Участник
Сообщения: 1493




20-12-2011 18:35

Сникерсни, Да, таймер настроен верно! Подключим его в наш код и расскажу пару слов о тонкостях таймера.
В нашем проекте не нужны точные интервалы времени, но для ознакомления давайте настроим переполнение таймера через каждые 0.5 секунды. С чего я взял такую цифру? Посчитаем максимальное время переполнения нашего таймера: (1 / (Fosc / 4(такт ядра) / 8(предделитель))) * 65536(двух байтный счётчик) = 0.524288 (частота переполнения). Таймер способен считать до 0.52 секунды, я округлил до ближайшего удобного числа - 0.5.
Таймер имеет флаг переполнения(флаг прерывания), который будет установлен, когда 16-ти битный регистр таймера переполнится, мы используем это событие как 0.5 секундный триггер. Для того чтобы переполнение произошло точно через 0.5 секунд, мы должны записать в таймер какое-то число, ведь если таймер будет считать с нуля, то переполнение произойдёт только через 0.524288 секунд.
Вот тут начинаются тонкости с таймерами.
Первая тонкость в том что нельзя одновременно записать значение в старший и младший байты 16-ти битного таймера. Выключать таймер не желательно так как таймер не будет считать пока вы записываете значение в регистры, ваш таймер будет ошибаться в подсчётах. Записывать значение в два регистра на ходу тоже чревато, пока пишите старший регистр, младший может переполниться как раз в этот момент и таймер ошибётся на десяток. Кроме того простая запись в регистры таймера не есть правильная процедура, ведь пока вы обнаружили переполнение таймера и пошли его обрабатывать, он считает все ваши шаги, следовательно вам надо делать поправку в константе для таймера именно на то количество тактов, которое таймер пройдёт до команды обновления регистров. Чтобы не делать поправку вы можете свою константу не записывать в регистр, а складывать со значением в регистре. Новое складывание в регистрах это ещё одна возможность переполнения старшего или младшего регистра во время складывания. Одним словом придётся немного поточнее узнать таймеры, если будете строить точный таймер времени, в нашем случае допускаются почти любые ошибки. На сколько точный таймер у вас получился, можно судить с помощью инструмента Debugger/StopWatch и точек останова (breakpoints), они ставятся двойным щелчком на строке кода. Поиграйтесь с кодом в симуляторе и поймите как работает таймер.
Вторая тонкость, это сброс предделителя после обновления регистров таймера (некоторые таймеры не сбрасывают предделитель, всегда смотрите даташит для уточнения), предделитель надо восстанавливать. Нам не повезло, наш таймер сбрасывает его, значит придётся напрячься для его восстановления улыбка.
Посмотрите как можно выводить значения препроцессора для контроля расчёта констант (картинка).

Задание:
1. почитать все комментарии и понять всё что я написал
2. познакомиться с новым инструментом Debugger/StopWatch, измерить интервалы времени в разных местах.

Задание на интерес:
Вставить код в нашу программу, который будет мигать светодиодом каждый раз при переполнении таймера.
Когда с таймером будет понятно, то пишите, будем изучать регистры РОН (Регистры Общего Назначения, оперативка).
P.S. Ну где же вопросы? С трудом верится что всё понятно....

Добавлено 20-12-2011 18:02

Да, самое время поговорить про формы записи чисел в коде. При записи чисел надо ВСЕГДА указывать систему счисления числа ( hex, dec, bin и так далее). Если вы не укажете из какой системы число, то вы абсолютно точно попадётесь на такой ошибке и искать её будете ооочень долго. Есть много разных способов обозначения системы счисления в виде префиксов и суффиксов, я буду обозначать так:
0х12 (шестнадцатеричное число 12)
.34 (десятеричное число 34)
b'00101010' (бинарное число 00101010)
В бинарных числах всегда указываем все 8 бит, даже старшие нули. В тексте кода надо пользоваться такими числами, которые удобнее понимаются в данном контексте кода. На пример при настройки битовых управляющих регистров используем бинарные числа чтобы всегда можно было проверить настройку битов прямо в техте программы не доставая калькулятор для перевода из hex значения. Для регистров задержек используем десятичные числа чтобы мы не думали сколько секунд будет задержка 0х5Е , и так далее. Всё должно быть удобно и понятно посторонним людям (код ВСЕГДА приходится кому-то показывать, он должен быть понятен)

untitled.PNG


  Test.rar  7,3 КБ  Скачано: 503 раз(а)

Сникерсни
Новичок
Сообщения: 23




21-12-2011 21:54

Может не много не втему (PIC16F84A) , но меня мучает вопрос. Можно ли прерываться от WDT ? Мне нужно получить долгую задержку ( около 2сек.). Я делаю так: подключаю предделитель к WDT 1:128. Разрешаю прерывания. WDT естессно не сбрасываю его и мне нужно попасть по переполнению WDT а значит и TMR0??? на org4. А он же у меня бесконечно сбрасывается. А если прерываться от Fosc то всё ок. Может я где-то туплю и от WDT вообще нельзя прерываться?
org 4
...........................
...........................
retfie
Start ............................
............................
bsf status,5
movlw .223
movwf optionR
bcf status,5
clrf TMR0
clrwdt
movlw .160
movwf intcon
goto Metka
Metka .........................
.........................
.........................
goto Metka
end
AlexM
Участник
Сообщения: 883




21-12-2011 22:44

Сникерсни, по WDT попадёшь на вектор сброса 0000h, а не на вектор прерывания - 0004h.
Eex
Участник
Сообщения: 1493




21-12-2011 23:08

Сникерсни, нет, сторожевой таймер не является источником прерываний, он только сбрасывает контроллер. Сторожевой таймер (WATCHDOG TIMER) мы пока не изучаем, там есть всякие нюансы, нам пока не до них. Также хочу предостеречь вас от НЕ НУЖНОГО использования прерываний. Прерывания планируйте в своих проектах только в том случае, если в них присутствуют задачи, для которых требуются предельно быстрая реакция на какие-либо события. Прерывания воруют быстродействие (если все задачи будут обрабатываться в прерываниях, то у вас будут с этим проблемы), они требуют более изощрённого программирования (вы постоянно должны иметь ввиду что из любого места в программе могут произойти прерывания), из надо правильно обрабатывать (со знанием тонкостей различных модулей) и много других неприятностей можно получить используя прерывания. Кто знаком с прерываниями, то как знаете, а кто не знаком, пока туда не лезем, позже разберёмся. В нашем проекте уже есть задержка в пол секунды, осталось только отсчитать 4 раза по пол секунды и Ваша цель достигнута улыбка. На следующем уроке будут у нас все секунды, которые нам нужны, останется только задать искомое число секунд. PIC16F84A также будет совместим с нашим проектом, трудности с миграцией будут минимальные.

Добавлено 21-12-2011 22:08

пока писал, кто-то уже ответил улыбка
Eex
Участник
Сообщения: 1493




22-12-2011 00:57

Пока тестируете таймер, расскажу про директиву компилятора __config , она даёт возможность установить биты конфигурации прямо в коде программы.
Для начала надо отметить, что если вы не собираетесь остановиться на парочке проектов, и будете продолжать заниматься контроллерами, то рано или поздно вы будете использовать свои наработки кода в других программах. Также вам захочется поделиться своим кодом с другом, у которого другой контроллер, и вашу программу надо будет запустить на нём (вот сейчас Сникерсни будет запускать нашу программу на PIC16F84A). При миграции целого проекта на другой контроллер надо будет кое что перенастаивать (обычно то что надо перенастраивать пишут в шапке исходного кода или делают специальный настроечный файл), в том числе и биты конфигурации. Надо отметить, что нет двух контроллеров, которые одинаково оснащены, по этому биты конфигурации надо проверять ВСЕГДА при переносе всего кода на другой контроллер (о переносе отдельных функций будем говорить отдельно). Также оговорюсь, что в биты конфигурации проекта вы будете заглядывать в редких случаях, я вспомнил только вот такие случаи:
1. в момент, собственно, установки битов конфигурации
2. когда весь код переносится на другой контроллер
3. когда вы делитесь кодом с другим человеком и ему понадобилось посмотреть конфигурацию
4. ещё какой-нибудь редкий случай
Всё это я перечислил для того чтобы рассмотреть плюсы и минусы разных способов установки битов конфигурации
AlexM писал:
Всё именовать. Фузы задавать как у меня в примере.


способ 1. установить конфигурацию как в нашем проекте Configure/Configuration Bits
пример1 (уже ставили в нашем проекте)

2. использовать директиву компилятора __config (или __fuses) с перечислением & масочных битов
пример2 __config _HS_OSC & _WDT_OFF & _LVP_OFF

3. использовать директиву компилятора __config (или __fuses) с указанием значения слова конфигурации (или нескольких слов, если конфигурация содержит несколько слов)
пример3 __config 0х3184

Удобство первого способа в том что все возможные биты перечислены в окне программы и развёрнуто записаны наиболее полным и понятным текстом и таблица всегда под рукой, изменяется на раз. Недостатки мы уже знаем, Microchip не сохранит эту конфигурацию в файле + другому лицу надо передавать не файл кода, а весь проект, в файле конфигурации нет.
Второй и третий способ по сути это одно и тоже, разница лишь в представлении значения числа конфигурации. К плюсам этих способов относится сохранение конфигурации в выходном файле (при компиляции), не надо делать file/export + второй способ нагляден для того кто смотрит на голый файл кода (не в MPLAB). Минусы тоже есть, маски (значения битов) для объявления хранятся только в одном месте - в заголовочном файле для данного контроллера, искать его не удобно. Глядя на строку конфигурации нокогда нельзя сказать на сколько она полная (сколько битов надо установить 8 или 18?), то есть при переходе на другой контроллер, эту строку надо полностью удалить, за тем открыть заголовочный файл и составить новую битовую последовательность. При таком способе не всегда понятно что за бит установлен из за сокращения (на пример мне не понятно что означает бит _EBTRB_OFF, надо смотреть документацию).
Способ третий - я им пользуюсь. Плюсы: предельно легко устанавливаются биты, просто ставите их в Configure/Configuration Bits, компилируете и читаете сгенерированное число в том же окне. Число подставляете в код - таблица битов предельно понятна. Если надо изменить - полная таблица всегда под рукой. Если изменили число прямо в коде, то после компиляции таблица изменится автоматом, установки всегда видны. При переходе на другой контроллер, полная таблица данного контроллера опять под рукой - меняй что хочешь. Недостатки - не наглядно при просмотре кода в другом редакторе, в MPLABe нет проблем, таблица под рукой.

Что-то длинное объяснение такой короткой надписи улыбка, пользуйтесь чем хотите и чем вам удобнее. Добавлю в код строку
__config 0x3184
Сникерсни
Новичок
Сообщения: 23




22-12-2011 21:51

Так ладно спасибо WDT больше мучить не буду улыбка .
Электротехник
Новичок
Сообщения: 9




29-12-2011 18:33

Молодец,Eex-продолжай обучение.Выводим информацию с PIC на светодиодные 7 сегментные индикаторы.Какие бывают АЦП-8битные и 10 битные ну и обязательно как написать программу для вольтметра 0-30V на трёх разрядном 7 сегментном светодиодном индикаторе(ОК или ОА)
Eex
Участник
Сообщения: 1493




29-12-2011 18:40

Электротехник, всё будет, но для начала разберитесь с таймером, уже 1.5 недели никто не может его осилить, куда нам до АЦП?!
Электротехник
Новичок
Сообщения: 9




29-12-2011 19:19

Посмотрим из чего состоит 629ый
У таймера1 два входа ,у таймера 0-один

629ый.jpg
 Описание: 629ый.jpg
 Размер файла: 99,68 КБ
 Просмотрено: 449 раз(а)

629ый.jpg



Eex
Участник
Сообщения: 1493




29-12-2011 20:02

Электротехник писал:
У таймера1 два входа ,у таймера 0-один

улыбка это нам что-то даёт? улыбка
Электротехник
Новичок
Сообщения: 9




29-12-2011 20:16

Что второй вход делает?Надо какую нибудь программку написать
Когда применяются 8битные таймеры(Счётчики),а когда 16 битные?
Eex
Участник
Сообщения: 1493




29-12-2011 20:22

Электротехник, "Второй" это какой? T1G это вход, который разрешает считать таймеру или не разрешает (можно подключить такую функцию). Какая-нибудь программка у нас написана, разберитесь с ней и пойдём дальше подмигивание.

Добавлено 29-12-2011 19:25

Электротехник писал:
Когда применяются 8битные таймеры(Счётчики),а когда 16 битные?

8-ми битные когда надо считать до 256, а 16-ти битные когда надо считать до 65535. У каждого таймера разные функции, разрядность всего лишь одна из таких функций. Таймер подбирается в соответствии с тем какие функции требует задача.
Электротехник
Новичок
Сообщения: 9




29-12-2011 20:32

Ага.
Побольше примеров про рельсы,тачки-как происходит взаимодействие
Eex
Участник
Сообщения: 1493




29-12-2011 22:11

Электротехник, Работа таймера понятна? Вопросы есть? Вопросы по нашему коду?
Электротехник
Новичок
Сообщения: 9




31-12-2011 18:35

С Наступающим Новым Годом!
Я только начал изучать программирование PIC,смотрю PDF,команды ассемблера
Сникерсни
Новичок
Сообщения: 23




02-01-2012 18:03

Всех с Новым годом улыбка !!! Э-Э ну вот как я сделал (мигание светодиода через 0.5 сек). Правда без коррекции таймера пока. Я думаю что будет работать. Да после праздников куплю эту PICуху. подшучивать, дразнить

Забыл сбросить флаг переполнения таймера, исправьте кто скачал, я тоже исправил. улыбка

  Test.txt  970 Байт  Скачано: 506 раз(а)
  Test.txt  1,04 КБ  Скачано: 456 раз(а)

Eex
Участник
Сообщения: 1493




03-01-2012 02:21

Сникерсни, Есть пара замечаний. Ну во первых названия регистров специального назначения декларированы заглавными буквами, значит в коде их надо писать тоже заглавными буквами. Может работать и прописными, но для этого надо устанавливать режим редактора как "Не чувствительный к регистру символов". Второе, где возможно надо указывать названия битов для лучшего восприятия текста кода, но работать будет и так как в твоём коде.
Далее совсем не принципиальное замечание, по возможности не следует зацикливать программу в подпрограммах (после вызова команды CALL), это съедает наш Hardware Stack, о нём будем говорить позже, его надо будет беречь и контролировать.
А вот теперь принципиальное замечание. Таймер работает по кругу, то есть он отсчитывает ровно максимально возможное количество секунд, а не столько сколько нам надо. Чтобы таймер считал ровно 0.5 секунд, его надо заряжать каким-то значением, я описывал это ранее. Собственно в моём коде всё это уже реализовано, надо только в нужном месте зажечь светодиод и погасить его.
Пользуйся отладчиком и инструментом StopWatch для проверки точности настройки таймера по секундам.
Не стесняйтесь и спрашивайте как что работает, если не понятно - тут все чайники, смеются тут только надо мной и то пока не оправдано улыбка.
Eex
Участник
Сообщения: 1493




03-01-2012 10:24

Раскажу пару слов о построении операционной системы в контроллере. Тема эта бесконечная по этому начну с главных принципов, потом буду возвращаться к ней по мере надобности.
Прерывания.
Не следует подключать прерывания просто потому что вам кажется что это круто, их обслуживание приносит не мало хлопот, избегайте их (прерывания). Бывают проекты, в которых без прерываний не обойтись, потому что вы загружаете контроллер на полную катушку и задачи проекта требуют максимально быстрой реакции на события. На пример вы строите вольтметр, вся работа вольтметра сводится к тому чтобы измерять напряжение. В таком случае ваша задача как можно быстрее подключить АЦП, снять с него показания и подключить его снова. В такой задаче просто необходимо обработку АЦП поставить в прерывание. Пока идёт преобразование АЦП, вы можете не торопясь усреднять его результаты и засвечивать их на индикаторе.
Не следует вставлять в прерывание обработку интерфейса пользователя, пользователь это весьма медленное создание и опрос его желаний никогда не требует моментальной реакции.
Основной цикл.
Достаточно большой проблемой может стать распределение задачь, если этих задачь достаточно много. Ещё бОльшей проблемой может стать добавление нескольких задачь в проект, после того как уже всё закончено. Заказчик проекта никогда не бывает доволен и всегда просит добавить пару наворотов в конечное устройство, вы должны быть к этому готовы.
Организация основного цикла делается по такому принципу (есть несколько основных способов):
1. в корень главного цикла не вставляем код обработки данных, только шагалку по функциям (только когда проект закончен можете шагалку заменить самими функциями)
2. каждая функция имеет свою задачу, не надо в одну функцию вставлять обработку всего на свете
3. первая команда внутри каждой функции главного цикла, это команда возврата из функции, если функцию не надо обрабатывать (надо будет подумать по каким критериям будет требоваться обработка функции).
Должно получиться примерно так:

MainLoop
call ObnovlenieDisleja
call OprosKnopok
call ChteniePamjatiEEPROM
call ObrabotkaRezul'tatovADC
goto MainLoop

4. Чтобы не обрабатывать функции слишком часто (нам не надо тратить быстродействие на опрос кнопок 100 000 раз в секунду, они не нажимаются так часто), надо организовать интервалы опроса функций. Обычно запускается таймер и этим таймером прибавляется значение регистра, а по значению регистра обрабатывается функция.
Получается примерно так (код схематический)

TimerOverflow : TimeStep = TimeStep + 1; if(TimeStep==4)TimeStep=0; раз в милисекунду увеличиваем регистр шага по функциям

MainLoop
call ObnovlenieDisleja {if(TimeStep != 0; return}; в первую милисекунду обновляем дисплей
call OprosKnopok {if(TimeStep != 1; return};во вторую опрашиваем кнопки
call ChteniePamjatiEEPROM {if(TimeStep != 2; return}
call ZapuskADC{ADC, GO}; запускаем преобразование АЦП всякий раз как сюда заходим
goto MainLoop

Если это не понятно, то проехали, потом к этому вернёмся.
Таким образом вы всегда сможете добавить несколько задачь в проект и распределить ресурсы по функциям. На пример вот такое преобразование можно сделать за секунду и дисплей будет обновляться в два раза чаще:

call ObnovlenieDisleja {if(TimeStep != 0; return}
call ObnovlenieDisleja {if(TimeStep != 3; return}
Xakeppok
Новичок
Сообщения: 18




16-01-2012 12:16

ув. Eex. Очень правильное и нужное дело делаете!!!
Есть одна просьба. Не у всех есть возможность быстро и оперативно достать контроллер и спаять схему , а потом экспериментировать на ней.
Но ведь есть такая прекрасная возможность как моделирование в Протеусе. Наверняка ведь вы свои проекты прокатываете в нем.
Для чайников думаю будет нелишним и знакомство с ним.

Спасибо.
Eex
Участник
Сообщения: 1493




16-01-2012 12:35

Xakeppok, нет, не работал в Протеусе, но знаю о чём речь. В процессе отладки устройства мне хватает MPLABa, пользуюсь отладчиком только в двух случаях: 1. если надо измерить время между двумя примитивными событиями, 2. если какая-либо формула не отработала так как надо. Не мыслю отладку устройства без логического анализатора сигналов, конечное устройство отлаживаю только им. Достаточно трудно отлаживать устройства, в которых куча протоколов и каждый из них живёт своей жизнью. Если вам надо получить USB пакет, отправить его по шине CAN и за тем получив ответ отправить его в RS-485, то отладчик отдыхает, нужны совсем другие инструменты для отладки. С дугой стооны чего отлаживать поект, в котором мигает лампочка или читается микросхема памяти - там всё примитивно, работает с лёта. В прочем для приметивных проектов хватает и MPLABа, если надо что-то посмотреть. Сколько людей, столько способов написания программы. Мы изучаем от простого к сложному, надо разобраться с принципами программирования, а потом уже можно и программки изучать. Собирать устройство не требуется, пробуйте работать с симулятором MPLAB как я описывал ранее, он вполне годится для наших уроков.
юрий 72
Забанен
Забанен
Сообщения: 271




15-11-2012 09:55

Eex, спасибо за тему, только почему-то она брошена, очень полезная информация про прерывания, я только год изучаю микроконтроллеры. Пока копирую готовые конструкции, сам писать программы еще не умею. Можете продолжить описание функций процессора на словах, как они работают, и если можно с примерами программ: таймеры, watchdog, АЦП, I2C, преобразования двоичного в семисегментный, и другие. Я только поправлю вас, вы писали про заглавные и прописные буквы в коде. Это одно и тоже! Различаются только "ЗАГЛАВНЫЕ"== "ПРОПИСНЫЕ", а вот "строчные". Многие делают эту ошибку:).
Еще раз прошу, продолжите тему "человеческого" объяснения работы процессора?
Eex
Участник
Сообщения: 1493




27-11-2012 03:27

юрий 72, тема иживает себя из за отсутствия учеников. Кто решит продолжить, пишите в личку, я не слежу за этой веткой. Теперь о продолжении, собирайте какое-нибудь железо и будем на нем учиться. К примеру я уже пояснил +- как работает таймер, но Вы все равно задали вопрос про таймер, значит что-то не понятно. Если будет сделано конкретное устройство, то сразу будет видно что не понятно в работе таймера когда он не будет запускаться. Трудно обяснять просто в воздух, не знаю понятно или нет я рассказываю и на какой уровень пояснений надо переходить улыбка. И так работа таймера понятна? улыбка
юрий 72
Забанен
Забанен
Сообщения: 271




19-12-2012 19:39

Про таймер не видел, найду почитаю, мне он(внутренний) как раз нужен. Еще вопрос. У меня RCD программатор. pic16f84a шьет Pony prog-ом. В прошлом году получалось и pic12f629 Ic prog-ом. А сейчас сколько ни бьюсь с настройками Ic prog не читает pic12f629, и не шьет. Что могло случиться?

Добавлено 19-12-2012 19:44

Пишет: не удается найти указанный файл при загрузке драйвера, хотя он рядом лежит. В корень диска D:\ клал папку с программой. Да, pic16f84a она читает, а pic12f629 пишет все FF.

Добавлено 19-12-2012 20:30

Все, разобрался наконец-то. В сокет18 вставлял чип 8 ног. А Data и Clock подпаивал проводками и перепутал их. Вот и убил вечер по-глупости недовольство, огорчение .
Eex
Участник
Сообщения: 1493




19-12-2012 22:38

юрий 72, Собственно нет никакой разницы на чём учиться программировать, пусть будет 16F84. Сформулируйте задачу и приступим. Чтобы не переписывать этот пост, почитайте с самого начала до того места как мы убедились в том что генератор в контроллере работает, это важный момент и с него надо начать запуск нашей схемы.
Если есть трудности по любому вопросу, задавайте.
Eex
Участник
Сообщения: 1493




20-12-2012 00:18

Раcскажу про общую концепцию сторожевого таймера (watchdog timer).
Основная его задача "отслеживать" не санкционированные зацикливания в следствии ошибок программиста или ошибок схемотехники. Я говорю об ошибках потому что в конечном итоге любые зависания можно устранить, к примеру зависания от перебоев питания устраняются более надёжными фильтрами и cxемами хардварного сброса, зависания от переполнения стека устраняются программистом и так далее. Если зависание случилось, то сам этот факт требует отслеживания источника зависания и устранения проблемы (не введением сторожевого таймера, а устранения источника зависания). Таким образом мы плавно подошли к тому что любая программа должна отлично работать без сторожевого таймера и в надёжном устройстве сторожевой таймер никогда не стаботает за весь срок службы этого устройства, однако сторожевой таймер добавляет нам уверенности в том что устройство не зависнет.
Теперь о применении сторожевого таймера.
Принцип его работы таков: у вас есть секундомер, который всегда стартует автоматически и когда стрелка секундомера пробежит 1 круг, контроллер сбросится от WATCHDOG RESET. Единственный иструмент, который не даст ему пробежать полный круг, это кнопка обнуления секундомера. Вы постоянно сидите и нажимаете эту кнопку не давая стрелке пробежать круг. Как только вы зазеваетесь, стрелка не медленно добежит до конца и сбросит контроллер.
Я пока решил не писать более подробно о подключении сторожевого таймера, мы его рассмотрим на конкретном примере когда придёт время, сейчас расказу что надо учитывать при внедрении этого таймера и чего остерегаться.
Сторожевой таймер это друг конечного пользователя устройством и враг разработчика устройства. Дело в том что сторожевой таймер маскирует косяки разработчика и не даёт их вовремя (на стадии отладки) обнаружить для устранения. Если вы построили вольтметр и сторожевой таймер сбрасывает его показания каждые 200мс, то такие сбросы вам будет трудно заметить, вольтметр как показывал правильно до сброса, так и остаётся показывать правильно после сброса, но количество измерений в секунду будет уже не тем, на которые вы расчитывали. Таким образом проблема в программе есть, но вы о ней не знаете потому что она замаскирована сторожевым таймером. Что делать? Разработку всех устройств надо вести без сторожевого таймера (или с отключенным) и только после ПОЛНОЙ И ОКОНЧАТЕЛЬНОЙ проверки работоспособности надо подключить таймер и настроить время его сброса. В 80% мoих коммерческих проектах ВООБЩЕ не используется сторожевой таймер!
Как организовать код в программе с подключенным сторожевым таймером:
Надо иметь ввиду что сторожевой таймер сбрасывает контроллер в начало выполнения кода (вектор 0х0000). То есть сброшенный контроллер должен дойти до того места где вы остановились при любых обстоятельствах, иначе программа не будет выполнять свои функции. Допустим вы построили регулятор температуры для сарая, задача которго не допустить обледенения внутри сарая, но и не тратить много энергии на тепло внутри. Вы решили построить контроллер с кнопкой запуска без фиксации - подключаете рубильник в сарае и нажимаете кнопку на регуляторе и он греет батареи. Теперь предположим что ваше устройство работает и подвисает. Сторожевой таймер перегрузит контроллер, а тот будет ждать пока вы нажмёте кнопку для старта. Если после перезагрузки сторожевым таймером кнопка нажата не будет, то сарай замёрзнет.
Пример другой ситуации, когда сторожевой таймер может испортить работу устройства:
Допустим у вас короткий главный цикл (быстро выполняется) и вы настроили сторожевой таймер на короткий интервал переполнения (сброса). Ваше устройство по вашей задумке фиксировало каждое включение контроллера записью счётчика во внутреннюю EEPROM память. Если сторожевой таймер будет срабатывать регулярно, то за 3 дня ваше устройство перезапустится 100 000 раз и превысит допустимое количество циклов записи в EEPROM, контроллер будет испорчен.
Я могу прикинуть и другие ситуации когда использование сторожевого таймера, который замаскировал косяк разработчика, испортит ваш проект, по этому вначале вы должны отладить устройство без использования сторожевого таймера, и только потом подключить его (перед тем как в последний раз запаковать устройство в его корпус).
Сторожевой таймер, как и прерывания будем изучать позже, когда добёмся каких-то результатов в изучении других функций контроллера, пока сторожевой таймер не трогаем.
Ryinet
Забанен
Забанен
Сообщения: 86




10-11-2014 08:19

Привет всем сегодня впервые столкнулся с прошивкой PIC а конкретно если 12f683 програмировать пытался chipprog 481 дело в том что вроде как бы операции выполняет проверяет но считывая пусто) хотелось бы узнать может кто пользуеться таким же может есть ньюансы какие? улыбка
Список форумов » Программное обеспечение » Микроконтроллеры » Изучаем программирование PIC контроллеров На страницу Пред.  1, 2, 3, 4, 5  След.
Перейти:  
Текущий раздел » Программное обеспечение » Микроконтроллеры (Микроконтроллеры - AVR-ы, PIC-и и другие)


Похожая информация:
  • Программирование
  • программирование USB
  • программирование ADUC812BS
  • Программирование DSP-микроконтроллеров
  • Программирование GAL16V8







  • Электроника
    Прошивки и схемы на телевизоры, мониторы, dvd, телефоны. Schematic, Service Manual (mode), eeprom dumps Информация по ремонту для специалистов - справочники, инструкции, энциклопедия, советы и секреты ремонта,  настройка, сервисные режимы поиск и продажа электронных компонентов, магазины, datasheet, pdf, размещение в интернете рекламы на сайтах электронной тематики
    Powered by phpBB 2.0.18 © 2001, 2002 phpBB Group!