»Радиолюбитель>PIC контроллеры. Программаторы и первый проект на PIC
Butik 15:56 21.10.2010
Спасибо конечно... Я знаю что работает порт 3 ТОЛЬКО на ввод... Но во первых в даташите написано что он работает на ввод независимо от конфигурации TRISIO, во вторых я его не использую.. и самое ГЛАВНОЕ что у меня нет никаких проблем с ассемблером...
Мой вопрос заключается в том чтоб корректно это все написать в микроси... А ассемблерный код я привел просто для иллюстрации ...
[Ответ]
VRTP 20:30 21.10.2010
Сообщение от Butik:
и самое ГЛАВНОЕ что у меня нет никаких проблем с ассемблером...
Мой вопрос заключается в том чтоб корректно это все написать в микроси... А ассемблерный код я привел просто для иллюстрации ...
Сам пытаюсь на Си подсесть,а по отзывам народа,там есть засады.
[Ответ]
petrd 21:49 21.10.2010
Ничего себе опус. Если Вы занимаетесь этим время от времени и у Вас нет времени ПЫчитать (???) оригиналы от производителя, прислушайтесь хотя бы к тем кто их читает. Вот теперь проехали.
По делу.
Сообщение от :
На счет рекомендации Microchip -Вот фрагмент программы на асемблере- работает без всяких sleep- при чем работает железобетонно!!!! проверено и в симуляторе и в железе вопреки всем рекомендациям!
Про "железобетон" не надо, так можно, но профессионал так делать не станет. В DS на PIC12F629 (DS41190G page 23) написано:
Сообщение от :
3.2.2 INTERRUPT-ON-CHANGE
......... The user, in the Interrupt Service Routine, can clear the interrupt in the following manner: a) Any read or write of GPIO. This will end the mismatch condition. b) Clear the flag bit GPIF. A mismatch condition will continue to set flag bit GPIF. Reading GPIO will end the mismatch condition and allow flag bit GPIF to be cleared....... Note: If a change on the I/O pin should occur when the read operation is being executed (start of the Q2 cycle), then the GPIF interrupt flag may not get set.
Это значит, что возможна такая ситуация когда сигнал на входе изменит свое состояние, а прерывание НЕ ВОЗНИКНЕТ! В жизни это, например, может выглядеть так - имеется датчик о сердцебиении больного: 1 - сердце бьется, 0 - не бьется. PIC12F629 должен своевременно поймать это изменение и оповестить. Разработчик решил, что это можно сделать на прерывании IOC, вместо INT, заложившись на то, что сигнал никогда не изменится в начале цикла Q2 при чтении GPIO. Microchip предупредил, разработчик игнорировал, прерывание НЕ ВОЗНИКЛО, контроллер не оповестил, последствия.....! И что? Рассказываем в суде про "железобетон"?
Или, жмем кнопки на GPIO , а они на десятый раз не срабатывают? Кто виноват? Конечно кнопки, их же китайцы делали! Если такое возможно, то может лучше так не делать?
Сообщение от Butik:
...... как мне написать чтоб прерывание работало...
Вы сами все уже написали, прямо как в DS:
Сообщение от Butik:
Теперь в микроси - вот так РАБОТАЕТ!!!!!
Сообщение от Butik:
а вот так- без init в основном цикле - НЕ РАБОТАЕТ!!!
.......
void main() { do {
} while(1);
}
А где тут у Вас init()? Он должен быть внутри main().
Может так?
Код:
void main() {
init();
do {
} while(1);
}
Сообщение от :
мне нужна не задержка а импульс
А получился импульс из задержки, да еще в прерывании. А потом Вы захотите отловить IOC еще на одном выводе, а он придет во время Delay_us(500), после которого у Вас GPIO.F4=0; // читаем GPIO, убираем неоднозначность, потом сброс флага и вуаля - отлов изменения в пролете . А потом Вы захотите отловить INT и если он придет перед Delay_us(500), то обработка INT будет отложена как минимум на 500 мкс. Ну и т.д.......
[Ответ]
petrd 22:53 21.10.2010
Сообщение от VRTP:
Сам пытаюсь на Си подсесть,а по отзывам народа,там есть засады.
Какой народ? Какие отзывы?
Си - это стандарт. Поэтому засады не в Си, а в реализациях компиляторов для МК, разработчики которых пытаются втиснуть всю мощь стандарта Си в ограниченные возможности микроконтроллеров. А что в ассемблере нет засад? Пожалуйста, вот одна - ОС Linux и Windows писаны на Си и (ИМХО) на данный момент уже никто в мире не в состоянии написать ОС подобного уровня на чистом ассемблере.
[Ответ]
VRTP 10:00 22.10.2010
Сообщение от petrd:
Какой народ? Какие отзывы?
Си - это стандарт. Поэтому засады не в Си, а в реализациях компиляторов для МК,
Тогда такая просьба,не могли бы Вы создать проект для МикроС с этой "шапкой"
processor 12F675
#include <P12F675.INC>
Сообщение от petrd:
так можно, но профессионал так делать не станет
.... Ну не знаю не знаю...Например... подобный алгоритм довольно часто применяется в различных схемах импульсно-фазового управления- например тиристорами или симисторами.. где скажем напряжение сети или какой либо иной задающий импульсный сигнал постоянной частоты и длительности подается на один из входов контроллера и там отслеживается прерывание по изменению уровня на этом входе, то есть происходит синхронизация с сетью.. а затем формируется импульс управления тиристором(если нужна задержка- то применяется прерывание от таймера..)Насколько я знаю подобный алгоритм применен в устройствах выпускаемых промышленно- например-wwwточкаshetale.ru/protectточкаhtm
Если это скажем синхронизация с сетью- то как Вы уже я надеюсь догадались- там изменение уровня происходит с частотой полупериода сети. А загонять каждые 10 миллисекунд контроллер в sleep .... не знаю.. лично я такого не совсем понимаю..Sleep режим хорош скажем для опроса клавиатуры какого нибудь домофона... когда его там нажимают раз в час или даже реже (если конечно к этому домофону не крестный ход в день святого Валентина))))
[Ответ]
VRTP 17:55 22.10.2010
Сообщение от petrd:
Как-то так, биты конфигурации в MikroC в коде не пишутся, их надо установить самому в Project->Edit Project:
Вот по этому я и просил ПРОЕКТ,что бы его открыть,и вникнуть.Сам пытался создавать,но постоянно выходил фуфел.После чего(в очередной раз) плевался на Си,и забывал до нового желания освоить этот язык.Спасибо за отклик,но я остался на прежнем месте.Наверное не мое[Ответ]
petrd 21:37 22.10.2010
Сообщение от Butik:
.... Ну не знаю не знаю...Например... подобный алгоритм довольно часто применяется в различных схемах импульсно-фазового управления- например тиристорами или симисторами.. где скажем напряжение сети или какой либо иной задающий импульсный сигнал постоянной частоты и длительности подается на один из входов контроллера и там отслеживается прерывание по изменению уровня на этом входе, то есть происходит синхронизация с сетью.. а затем формируется импульс управления тиристором(если нужна задержка- то применяется прерывание от таймера..)Насколько я знаю подобный алгоритм применен в устройствах выпускаемых промышленно- например-wwwточкаshetale.ru/protectточкаhtm
Если это скажем синхронизация с сетью- то как Вы уже я надеюсь догадались- там изменение уровня происходит с частотой полупериода сети. А загонять каждые 10 миллисекунд контроллер в sleep .... не знаю.. лично я такого не совсем понимаю..Sleep режим хорош скажем для опроса клавиатуры какого нибудь домофона... когда его там нажимают раз в час или даже реже (если конечно к этому домофону не крестный ход в день святого Валентина))))
С одной стороны, этим одним из входов может быть не IOC, а INT, прерывание от которого не имеет подобного свойства. И даже если это IOC, то проблем с данным прерыванием в случае грамотного написания программы для работы с сетью здесь не возникнет. Сигнал сети можно считать детерминированным и переход через ноль происходит примерно каждые 10 мс. Хочу еще раз обратить внимание - проблема с IOC может возникнуть только в момент чтения порта, поэтому отловив IOC, последующие почти 10 мс порт можно читать, т.е. можно определить временной интервал справа-слева от ожидаемого перехода, в течении которого нельзя читать порт, тем самым избежать проблем с IOC. Опять же диммер штука не настолько критическая, поэтому пропуск какого-то перехода можно списать на сетевой мусор. А загонять в слип устройство работающее с сетью ради экономии энергии большого смысла нет. А вот если на вход поступают импульсы, время прихода и длительность которых заранее не известны (в т.ч. от кнопок), вот тогда можно получить проблемы с IOC.
А теперь главное - такая фигня с IOC присуща не всем контроллерам. В 1997 г. Microchip выпустила AN566 про IOC, где нет упоминании про Q2. В книге Ульриха (моя 2002 г) упоминается про Q2 только в контексте PIC16C71/73/74/773/774. А вот DS41190G на PIC12F629 (собственно про него мы и говорим) в котором это упоминается имеет редакцию 2010 г. И мне кажется такая штука с Q2 у всех PIC12 и обычных PIC16F. А вот у PIC18 такого уже нет, этот узел там сделан немного иначе и все равно для них в DS (PIC18F4550) пишут:
Сообщение от :
The interrupt-on-change feature is recommended for wake-up on key depression operation and operations where PORTB is only used for the interrupt-on-change feature. Polling of PORTB is not recommended while using the interrupt-on-change feature.
Наверное, стоит учитывать многолетние рекомендации производителя, он все же это не для себя пишет.
[Ответ]
petrd 21:44 22.10.2010
Сообщение от VRTP:
Вот по этому я и просил ПРОЕКТ,что бы его открыть,и вникнуть.....
Проект для MikroC PRO. Распакуйте в корень диска С. В железе не глядел, если будут проблемы посмотрю.
Изображения
Сообщение от petrd:
Проект для MikroC PRO. Распакуйте в корень диска С. В железе не глядел, если будут проблемы посмотрю.
Большое человеческое спасибо,буду вникать.
[Ответ]
Butik 14:30 23.10.2010
Сообщение от petrd:
С одной стороны, этим одним из входов может быть не IOC, а INT, прерывание от которого не имеет подобного свойства
Вообще то в классическом случае прерывание по INT происходит либо по переднему либо по заднему фронту синхронизирующего сигнала... То есть если это напряжение сети, то это частота 50Гц(20мсек), а часто требуется100гц(10мсек)...
Правда никто не запрещает сделать например так-
..хотя я лично подобную конструкцию в железе не проверял...и будет ли она работать надежней IOCB?
[Ответ]
Butik 15:13 23.10.2010
Господа.. я вот кстати смотрю тут многие любители конструирования различных термостатов и тому подобной техники..
А кто нибудь может поделиться ссылочкой на проект или схемку несложного термостата только не на DS18B20, а на термопаре?
[Ответ]
petrd 16:44 23.10.2010
Сообщение от Butik:
Вообще то в классическом случае прерывание по INT происходит либо по переднему либо по заднему фронту синхронизирующего сигнала... То есть если это напряжение сети, то это частота 50Гц(20мсек), а часто требуется100гц(10мсек)...
Правда никто не запрещает сделать например так-
..хотя я лично подобную конструкцию в железе не проверял...и будет ли она работать надежней IOCB?
Работает, см. пост #563.
P.S. Если вставляете код, используйте, пожалуйста, ТЕГИ.
[Ответ]
romchik77 23:18 23.10.2010
Сообщение от Butik:
Господа.. я вот кстати смотрю тут многие любители конструирования различных термостатов и тому подобной техники..
А кто нибудь может поделиться ссылочкой на проект или схемку несложного термостата только не на DS18B20, а на термопаре?
видел но на AVR , а чем вам не нравится цифровой
[Ответ]
Butik 11:38 24.10.2010
Сообщение от romchik77:
а чем вам не нравится цифровой
А если нужно температуру регулировать от 100 до 400???
[Ответ]
Butik 11:55 30.10.2010
Сообщение от petrd:
Еще примерчик с ШИМ. Понятное дело, что яркость светодиода напряжением сильно не нарегулируешь. А вот при помощи ШИМ можно, а человеческий глаз свое дело сделает. Кнопкой на RA0 яркость светодиода можно увеличивать, а кнопкой на RA1 - уменьшать. Все достаточно просто. Схема ниже.
А чтоб яркостью управлять не кнопками а потенциометром? Так можно?
[Ответ]
petrd 12:10 30.10.2010
Сообщение от Butik:
А чтоб яркостью управлять не кнопками а потенциометром? Так можно?
Можно. Для этого неплохо иметь МК с АЦП, но если АЦП нет, а очень хочется, то можно и на компараторе с таймером.
[Ответ]
DELTA-S 18:43 09.11.2010
На mikroPascale для PIC сдесь можно получить консультацию?. Или сдесь собрались те кто пишет на СИ?
[Ответ]
petrd 19:02 09.11.2010
Сообщение от DELTA-S:
На mikroPascale для PIC сдесь можно получить консультацию?
Тогда попытаюсь описать свою проблему.
Стандартная процедура цифрового термометра на DS1820.Я решил добавить в него режим термостата.То есть при достижении например температуры +35 гр. на ножке 20 порта D появляеться "1".Сделал проект в ПРОТЕУСЕ. На ножку подключил светодиодик.Теперь при достижении температуры больше чем +35 градусов начинает мигать светодиод. А должен гореть постоянно. Вот эта и есть моя проблема.Почему мигает а не горит постояно.Не могу понять в чем дело.Если температура меньше +35 то светодиод перестает мигать.
Листинг программы:
Procedure TERM(var m:Word); //Процедура счета Температуры
var i, j1, j2 : byte;
text : array[10] of char;
tmp_sign : byte;
t1,t2 :word;
begin
text := 'TEMP';
Lcd_Out(3, 1, text);
Lcd_Chr(3, 10, 223); // 'degree' character
Ow_Reset(PORTA, 4); // onewire reset signal
Ow_Write(PORTA, 4, $CC); // issue SKIP ROM command to DS1820
Ow_Write(PORTA, 4, $44); // issue CONVERT T command to DS1820
Delay_us(120);
i := Ow_Reset(PORTA, 4);
Ow_Write(PORTA,4, $CC); // issue SKIP ROM command to DS1820
Ow_Write(PORTA,4, $BE); // issue READ SCRATCHPAD command to DS1820
j1 := Ow_Read(PORTA, 4); // get result
j2 := Ow_Read(PORTA, 4); // get result
if j2 = $FF then
begin
tmp_sign := '-'; // temperature sign
j1 := j1 or $FF; // complement of two
j1 := j1 + $01;
end
else
tmp_sign := '+';
j2 := (j1 and $01)*5; // get decimal value
j1 := j1 shr 1; // get temp value
Сообщение от DELTA-S:
Тогда попытаюсь описать свою проблему.
Стандартная процедура цифрового термометра на DS1820.Я решил добавить в него режим термостата.То есть при достижении например температуры +35 гр. на ножке 20 порта D появляеться "1".Сделал проект в ПРОТЕУСЕ. На ножку подключил светодиодик.Теперь при достижении температуры больше чем +35 градусов начинает мигать светодиод. А должен гореть постоянно. Вот эта и есть моя проблема.Почему мигает а не горит постояно.Не могу понять в чем дело.Если температура меньше +35 то светодиод перестает мигать.
Какой контроллер? Приведенного кода мало, покажите всю программу.
[Ответ]
DELTA-S 07:09 10.11.2010
Контроллер PIC16F877
Остальная часть программы тут не причем.На порт D выводиться сигнал только из процедуры ТЕРМОМЕТРА ничего ольше к порту D необращаеться.Единствено привожу конфигурацию порта D может сдесь неправильно сконфигурировал.
ADCON1 := $01; //Готовим Порт А как аналоговый с внешней опоркой
TRISA := $FF; //Порт А назначаем как входной
PORTA := 0; //Очищаем его
TRISB := $00; //Порт Б назначаем как выходной
PORTB := 0; //чистим его
TRISC := $F0; //Порт С назначаем как выходной C0
PORTC := 0; //чистим его
TRISE := $07; //конфигурирум порт E и порт D
PORTE := 0; //Очищаем его
TRISD := $00; //Порт D назначаем как
PORTD := 0;
INTCON := 0; //сброс всех прерываний
[Ответ]
DELTA-S 07:34 10.11.2010
PETRD спасибо.
Вы действительно были правы.Была еще одна команда обращения к порту D в основном теле программы, я за неё забыл.Посколько веду отладку программы по процедурам.Проблема устранена.Теперь все работает как положенно.
Теперь осталось написать условие на выключение.
[Ответ]
DELTA-S 16:49 10.11.2010
Вот еще одна проблема.
Есть строковая константа название месяцев.В зависимости от нажатия кнопок выводиться текстовая константа которая соответствует порядковомуи номеру "J"
На дисплей выводится буква "F" независимо от значения "J"
Еслия вместо instance[j] напишу instance[2] то все выводиться правильно и на дисплее пишется "МАР" Почему программа не воспринимает значение "J" не могу понять, может кто подскажет.
const //объявление констант
instance: array [0..11] of string [4] =('ЯНВ','ФЕВ','МАР','АПР','МАЙ','ИЮН','ИЮЛ','АВГ', 'СЕН','ОКТ','НОЯ','ДЕК');
Procedure MONTH;
var J, : byte; //Объявление переменных в процедуре
str: string[4];
begin
J:=0;
if (Button(PORTC,6,1,0))then //Проверяем кнопку ножка RA5 Если нажата,
BEGIN Sound_Play(1000, 100); // Выводим звук
j :=j-1; //
end;
if (Button(PORTC,7,1,0))then //Проверяем кнопку ножка RA4 Если нажата,
BEGIN Sound_Play(1000, 100); // Выводим звук
j :=j+1; //
end;
Сообщение от DELTA-S:
Вот еще одна проблема..........
Всем кто в таком виде выкладывает код и Вам тоже говорю - отформатируйте свой код тегами! И аккуратнее с копипаст, а то кнопки одни, комментарии к ним другие, где правда-то? А вот с этим:
Код:
var J, : byte;
код и компилироваться не будет. Думаю Вы меня поняли.
Далее:
1. А есть разница между "j' и "J" ?
2. А кнопки нажимаются? Звук есть?
3. А может это - "область видимости и время жизни переменной"? В Си, например, на этот случай может пригодиться волшебное слово static.
[Ответ]
DELTA-S 07:34 11.11.2010
[QUOTE='petrd;13213550']
отформатируйте свой код тегами! И аккуратнее с копипаст, а то кнопки одни, комментарии к ним другие, где правда-то?
Я не профи поэтому не понимаю ваш лексикон.Что такое теги.И скопирарованием кусков кода у меня тоже все в порядке.
Не понял вас насчет кнопок. Кнопки разные!!!. И подключены к разным ножкам порта и коментарии соответственно разные. Откуда вы взяли что кнопки одни и тежи.
1. Разницы между "j' и "J" никакой. Я пишу код малыми буквами а микропаскаль иногда сам их переименовыевает в заглавные.
2.Кнопки нажамаються и звук есть.
3. var J, : byte; - этот код компилироваться не будет.Сдесь была еще обьявлена одна переменная я ее удалил а запятую забыл, что бы не загружать вас лишними переменными.Так получилось потому что код копировал из программы а на форуме уже его редактировал.
4. В микропаскале я такой команды не знаю - static
Я так и не понял где моя ощибка в программе- если не брать ошибки в синтаксисе в.Ведь компилятор никакой ошибки не выдает.
[Ответ]
petrd 10:07 11.11.2010
Сообщение от DELTA-S:
Я не профи поэтому не понимаю ваш лексикон.Что такое теги.
Это не про профи, это про культуру и уважение, здесь - http://bvf.ru/forum/misc.php?do=bbcode. Когда пишете сообщение для удобства пользования тегами сверху есть быстрые кнопки.
Сообщение от DELTA-S:
И скопирарованием кусков кода у меня тоже все в порядке.
А вот это:
Код:
if (Button(PORTC,6,1,0))then //Проверяем кнопку ножка RA5
....
if (Button(PORTC,7,1,0))then //Проверяем кнопку ножка RA4
Так про какую ножку все-таки речь RC6 или RA5? RC7 или RA4?
Сообщение от DELTA-S:
Я так и не понял где моя ошибка в программе.....
Исходя из того, что j и J одна и таже переменная и объявлена она только в одном месте - в процедуре MONTH, то по идее эта переменная может принимать только 3 значения - 0 (не нажато), 255 (нажата RC6), 1(нажата RC7). Попробуйте сделать ее глобальной.
[Ответ]
DELTA-S 12:50 11.11.2010
Да не думал что кто то будет обращать на коментированный текст.
Просил помощи в решении определенной задачи а мне тут указывают на то что написано в коментарии.
Прощу прощения что побеспокоил и тихо ухожу из этого форума.
[Ответ]
petrd 13:06 11.11.2010
Сообщение от DELTA-S:
Да не думал что кто то будет обращать на коментированный текст.
Просил помощи в решении определенной задачи а мне тут указывают на то что написано в коментарии.
Прощу прощения что побеспокоил и тихо ухожу из этого форума.