»Радиолюбитель>PIC контроллеры. Программаторы и первый проект на PIC
Teeen 03:11 21.03.2012
Сообщение от Teeen:
Изучил тему по согласованию уровней, спасибо Вам! Заказал микросхему: sn74lvc2t45, без доставки 94 рубля, как раз на 2-а входа/выхода.
Есть еще специализированные микросхемы трансляторы уровня сигнала: TXS0101-TXS0108 (последняя цифра обозначает количество вводов/выводов), но их достать тяжелее.
Пришла микросхема, сразу скажу, что направление для согласование уровней задается с помощью ножки "DIR", если DIR посадить на массу (низкий уровень) то направление будет от порта В к А, если DIR=1 (или напряжению питания VccA), то направление от порта А к В.
Также данная микросхема позволяет работать в обоих направлениях, но будет доступен только один вход/выход, хотя у нее их 2-а.
Еще предупрежу на всякий случай, микросхема мелкая 3х3мм для SMD монтажа, поэтому паять ее тяжеловато.
Результат порадовал, при напряжении питания PIC +5V, от модема получаю четкие ответы, т.е. микросхема справилась с поставленной задачей.
[Ответ]
Teeen 10:53 21.03.2012
Сегодня столкнулся со следующей проблемой компилятора (mikroC PRO for PIC v.5.4.0):
0 434 Demo Limit Demo Limit
Сообщение от petrd:
1. На какой частоте запускается Ваш проект в Протеусе?
2. Какая частота указана в настройках проекта MikroC?
3. На какой частоте реально работает контроллер?
Ответ в этих трех вопросах, когда все они придут к одному значению, тогда все и встанет на место.
1. 4 MГц
2. 4 MГц
Конфиг 0x3F11
3. как замерить не знаю ( используется внутренний тактовый генератор).
Tимп=Tпаузы=примерно 140 секунд.
petrd выложите пожалуста в архиве рабочий пример данной программы для контроллера 16f819 b 12f683 (12f675)
[Ответ]
petrd 08:41 22.03.2012
Сообщение от BARS_21:
как замерить не знаю ( используется внутренний тактовый генератор).
Tимп=Tпаузы=примерно 140 секунд.
Все временные задержки, например, delay_ms(1000), компилятор рассчитывает относительно частоты указанной в настройках проекта.
Для PIC16F819. У Вас внутренний генератор работает на частоте по умолчанию (31,25 кГц), т.е. в 124 раз медленнее задуманного, а задумали 4 МГц. Поэтому надо внутренний генератор переключить на 4 МГц. А можно ничего и не делать, просто в настройках проекта указать частоту 31,25 кГц, откомпилировать, прошить и все должно заработать как надо. Несложно, тренируйтесь. И если есть сомнения смотрим в раздел DS про осциллятор.
Код:
void main()
{
OSCCON = 0x60; // переключили тактовую с 31,25 кГц на 4 МГц
while (!IOFS_bit) continue; // ждем когда частота застабилизируется
TRISB=0; // настроили выводы PORTB на вывод
PORTB=0; // записали в PORTB 0
while(1){ // организовали вечный цикл
PORTB=~PORTB; // инверсия уровней на выводах PORTB
delay_ms(1000); // задержка на 1000 мс = 1 сек
}
}// main
petrd, подскажите пожалуйста, принятые на RX UART складываю во временный буфер. Принимаю данные ч/з прерывание:
Сообщение от :
void interrupt() {
// fInt=0;
if(RCIE_bit && RCIF_bit){
if (FERR_bit){
err=RCREG;
}
if (OERR_bit)
{
ModemAnswer[i]=RCREG;
i++;
ModemAnswer[i]=RCREG;
i++;
CREN_bit = 0;
CREN_bit = 1;
}
else{
ModemAnswer[i]=RCREG;
i++;
ModemAnswer[i]='\0';
}
}
}
//------------------------------------------------------------------------------
каким образом реализовать программно, что прерывания более не возникают, предположим от 100 до 500 мс? А то никак не получается отследить окончание заполнения буфера....
Думал такая конструкция будет правильной:
Сообщение от :
if (!RCIF_bit && i>0){...}
RCIF_bit - в паузах =0 и МК успевает это увидеть.
[Ответ]
petrd 12:31 22.03.2012
Сообщение от Teeen:
.....каким образом реализовать программно, что прерывания более не возникают, предположим от 100 до 500 мс? А то никак не получается отследить окончание заполнения буфера....
А зачем отслеживать факт не возникновения прерывания?
[Ответ]
Teeen 03:17 23.03.2012
Сообщение от petrd:
А зачем отслеживать факт не возникновения прерывания?
От модема идут ответы, причем бывают последовательности с задержкой до 200мс, я бы хотел чтобы эти данные попадали в один буфер перед его разбором.
[Ответ]
petrd 09:27 23.03.2012
Сообщение от Teeen:
От модема идут ответы, причем бывают последовательности с задержкой до 200мс, я бы хотел чтобы эти данные попадали в один буфер перед его разбором.
Спасибо.
Проблему решил. Тем кто будет писать разборщик ответов от модема, сразу хочу предупредить, разбирайте на лету (по мере поступления байтов в PIC), сразу как только встретился символ перевода строки 0x0A (LF) или "\n" в С.
Я пытался дождаться окончания приема ответов от модема, но такая технология работает нестабильно! И поэтому от нее пришлось отказаться...
Причем, новый код получился намного компактней и работает быстрее.
petrd, здравствуйте!
Расскажите пожалуйста об организации памяти МК на примере PIC18F... доступным языком. Не могу понять каким образом реализовать следующую конструкцию:
Есть переменная: Объявления переменных:
Сообщение от :
char *ModemAnswer; //Буфер для ответа с модема
char FromPhone[]=""; //Номер телефона с которого пришла SMS
Сообщение от :
ModemAnswer="AT+CMGR=1,0\r\r\n+CMGR: \"REC READ\",\"+79211111111\",\"Dani/1\",\"12/03/02,11:38:59+32\"\r\nsendtemp\r\n\r\nOK\r\n";
Необходимо из нее в другую переменную, например FromPhone поместить часть данных из ModemAnswer (+79211111111), причем так, чтобы значение в ModemAnswer - осталось не тронутым. Второй вопрос: каким образом очищать переменные после их использования? Т.е. чтобы в них находились не предыдущие значения, а например 0x20 (пробел). Третий вопрос: если объявлена переменная,
Сообщение от :
char buff[12]
, то считается первым его индексом 0 или 1? Четвертый вопрос: каким образом резервируется память под переменные вида char buff[12]; ?
Сообщение от :
char *ModemAnswer;
char FromPhone[]="000000000000";
strncpy(FromPhone, strstr(ModemAnswer,"+79"),12);
вместо "000000000000" - пробелы.
пока вроде работет, но все равно, хотелось бы послушать высококлассных специалистов, которые на пальцах объяснят основы по памяти и переменным.
[Ответ]
petrd 10:45 31.03.2012
Сообщение от Teeen:
Расскажите пожалуйста об организации памяти МК на примере PIC18F... доступным языком. ........ Третий вопрос: если объявлена переменная, , то считается первым его индексом 0 или 1? Четвертый вопрос: каким образом резервируется память под переменные вида char buff[12]; ?
Про работу с памятью вот так в двух словах не рассказать. Откройте Кернигана-Ричи и почитайте про указатели. Должно проясниться.
.......
Отсчет элементов массивов ведется от нуля. А вот количество элементов считается от 1. Объявление char buff[1] - массив, состоящий из 1-го элемента, и дальше обратиться к нему можно, как к buff[0]. Элемент нулевой, но по счету он первый и единственный.
По четвертому вопросу - не понял вопроса.
Пример с указателями - копирование строк (смотреть в симуляторе):
Сообщение от :
char String_1[] = "Word";
char String_2[5];
char *pPointer_1;
char *pPointer_2;
void main() {
pPointer_1 = &String_1;
pPointer_2 = &String_2;
while(*pPointer_2++ = *pPointer_1++); // коротко! ни хрена не понятно! но работает!
Купил на ebay клона PICKit3 за $27.40. Полет нормальный.
[Ответ]
Teeen 02:42 16.04.2012
Сообщение от petrd:
Купил на ebay клона PICKit3 за $27.40. Полет нормальный.
Здравствуйте petrd!
А до этого у вас не было PICKit?
[Ответ]
petrd 06:58 16.04.2012
Сообщение от Teeen:
А до этого у вас не было PICKit?
До этого были только PICKit 2. Как известно производитель поддержку PICKit2 прекратил, теперь новые контроллеры поддерживаются только PICKit3.
[Ответ]
Teeen 10:00 16.04.2012
не хочу показаться назойливым, а новые это какая серия или отдельно чипсет?
[Ответ]
petrd 10:27 16.04.2012
Сообщение от Teeen:
не хочу показаться назойливым, а новые это какая серия или отдельно чипсет?
Их много и в разных сериях, например, PIC16F1xxx, PIC18FxxKxx, PIC18FxxJxx, PIC24 и т.д. Вообщем, открываем последний MPLAB Configure -> Select Device и тут узнаем, кто, что и как поддерживает.
[Ответ]
Teeen 12:07 16.04.2012
Сообщение от petrd:
Их много и в разных сериях, например, PIC16F1xxx, PIC18FxxKxx, PIC18FxxJxx, PIC24 и т.д. Вообщем, открываем последний MPLAB Configure -> Select Device и тут узнаем, кто, что и как поддерживает.
И не пойму, причем тут MPLab, ведь програматор это одно (его прошивку можно обновлять с сайта), а среда разработки, в том числе компилятор - другое. Где я ошибаюсь?
[Ответ]
petrd 14:29 16.04.2012
Сообщение от Teeen:
У меня поддерживаются эти серии:........
И не пойму, причем тут MPLab, ведь программатор это одно (его прошивку можно обновлять с сайта), а среда разработки, в том числе компилятор - другое. Где я ошибаюсь?
1. Сможете прошить PICKit2 вот эти - PIC24F32KA302, PIC18F66K80, PIC16F1936, PIC18F87J93?
2. Для PICKit2 давно ничего больше не обновляется: последняя оболочка 2.61, последняя прошивка 2.32, последний Device File - 1.62.14 и больше не будет. Дальше поддержка только PICKit3.
3. MPLAB не причем, он у меня как эталон, если среда последней версии, то там всегда можно получить самые свежие данные какой программматор-отладчик что поддерживает и никуда больше не надо заглядывать. К тому же я в нем работаю.
[Ответ]
Teeen 03:34 17.04.2012
petrd, спасибо за развернутый ответ. Вы профессионально занимаетесь программированием, что понадобились такие модели PIC?
Я то так, развлекаюсь, для дома автоматику собираю и чтобы голова работала... навыки не терять в программировании.
petrd, еще к вам вопрос: почему выбрали именно MPLAB, а не mikroC PRO for PIC ?
[Ответ]
petrd 10:24 17.04.2012
Сообщение от Teeen:
Вы профессионально занимаетесь программированием, что понадобились такие модели PIC?
petrd, еще к вам вопрос: почему выбрали именно MPLAB, а не mikroC PRO for PIC ?
Наверное, можно сказать, что профессионально. Да нет, из того что назвал в наличии только PIC16F1936. Просто надо быть ко всему готовым и идти в ногу со временем.
Да нет, вообщем, не выбирал ничего, каждый компилятор для своих задач.
А вообще использую - Hi-Tech PICC (STD), MCC18, MikroC (PRO и 8.2), SDCC. К тому же в MPLAB симулятор нормальный, в отличие от MikroE и железная отладка при помощи PICKit2,3 без всяких cof файлов проводится.
[Ответ]
Teeen 05:39 27.04.2012
petrd,
поясните пожалуйста работу данного алгоритма:
Сообщение от Teeen:
Здесь проверяется каждый байт строки?
пока не достигнут конец строки, т.е. не '\0'
Да, терминальный ноль.
Сообщение от Teeen:
Еще интересно, символы A,B,C,H,P,O,K,M,T,E выводятся на LCD корректно, все остальные символы - нечитабельные, вашу кодировку я попробовал сменить на:......не помогло.
Теперь вопрос, все-таки кодировка должна браться из Datasheet LCD или таблицы символов MikroC?
Если бы кодировки совпадали с MikroC то этот огород не нужен бы был.
У Вас видимо в знакогенераторе LCD нет русских символов, индикатор в России куплен или типа с ebay? А то недавно там присмотрел LCD очень дешевые, а когда с продавцом пообщался, то выяснилось, что ни русских символов, ни задней подсветки в них нет, вот потому и дешевые.
Совет. Пишете такую программку: в цикле с задержкой в пару секунд (или инкремент через кнопку) - на одну строку выводите код символа от 0 до 255, а на другую сам символ и всю правду узнаете про свой индикатор без DS ( и код символа и какой этому коду символ сопоставлен).
[Ответ]
Teeen 08:29 27.04.2012
petrd, увы, но вы как всегда правы. Добавил код по вашему совету и... русскими буквами тут и не пахнет! Но подсветка есть (голубая).
Да, действительно я LCD покупал ч/з ebay за 150 рублей.
Посоветуйте, может ссылку дадите на LCD с поддержкой русских букв. Может маркировкой отличаются? На будущее пригодится.
Спасибо!
P.S. сейчас посмотрел ebay не пойму как определить есть ли поддержка RUS для данного LCD или нет...
[Ответ]
petrd 08:50 27.04.2012
Сообщение от Teeen: petrd, увы, но вы как всегда правы. Добавил код по вашему совету и... русскими буквами тут и не пахнет! Но подсветка есть (голубая).
Да, действительно я LCD покупал ч/з ebay за 150 рублей.
Посоветуйте, может ссылку дадите на LCD с поддержкой русских букв. Может маркировкой отличаются? На будущее пригодится.
Спасибо!
ИМХО. Те LCD, что продаются в магазинах на территории России имеют поддержку кириллицы. У меня сейчас лежит - WH1602B-YYK-CTK, русские символы в нем имеются. Во всяком случае у меня пока всегда так. А на ebay подобные LCD какие-то безымянные и узнать правду достаточно сложно.
[Ответ]
Teeen 09:09 27.04.2012
Сообщение от petrd:
ИМХО. Те LCD, что продаются в магазинах на территории России имеют поддержку кириллицы. У меня сейчас лежит - WH1602B-YYK-CTK, русские символы в нем имеются. Во всяком случае у меня пока всегда так. А на ebay подобные LCD какие-то безымянные и узнать правду достаточно сложно.
а все удивлялся, что у нас так дорого стоят LCD16x20
Покупать В Ч&Д это жесть и обдираловка без зазрения совести.
Пару раз всякое-разное покупал здесь - http://chip-nn.ru/72.php
Цены приличные, доставка почтой 175 руб.
[Ответ]
Teeen 06:21 10.05.2012
petrd, здравствуйте!
Поясните пожалуйста код:
Сообщение от :
unsigned short SetTemp;
char *ust = "000";
//Вывод уставки на ЖКИ
ust[0]=SetTemp/100+48;
ust[1]=(SetTemp/10)%10+48;
ust[2]=SetTemp%10+48;
// обрезаем дробную часть уставки
ust[3]=0;
ust[4]=0;
Lcd_Out(1,12,ust);
не понимаю процесса преобразования числа, что из чего берется и как получается?
Сообщение от Teeen:
.....
не понимаю процесса преобразования числа, что из чего берется и как получается?.....
char *ust = "000" <- указатель на строку символов ust[3] в RAM, обратиться к ним можно как ust[0], ust[1], ust[2], а если пытаться использовать ust[3], ust[4] и т.д., то можно получить неплохую бяку, поэтому за этим надо следить самому, компилятор тут будет ни причем.
unsigned short SetTemp <- максимальное число 255, т.е. три символа.
Пусть SetTemp = 123, тогда
ust[0]=SetTemp/100+48 <- 123 / 100 = 1, а код цифры "1" в кодовой таблице ASCII - 49 (1+48), в итоге ust[0] = 49.
ust[1]=(SetTemp/10)%10+48 <- 123 / 10 = 12 % 10 = 2, а код цифры "2" в кодовой таблице ASCII - 50 (2+48), в итоге ust[1] = 50.
ust[2]=SetTemp%10+48 <- 123 % 10 = 3, а код цифры "3" в кодовой таблице ASCII - 51 (3+48), в итоге ust[2] = 51.
Думаю разберетесь.
[Ответ]