
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
PIC контроллеры. Программаторы и первый проект на PIC
|
||
| Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
![]() |
|
|
Опции темы |
|
|
#931 |
|
Форумец
|
AlexVK
Код:
unsigned int temp2write; <- это какой тип? ........................................................ UART1_Write(temp2write); <- какой тип должен быть в скобках, а Вы какой засунули? mishka123 Насчет зверя leaper-48. В руках не держал, но одно название УНИВЕРСАЛЬНЫЙ говорит о многом, он видимо не может ввести PIC в режим программирования (поэтому не может прочитать ID, поэтому и ошибка). А насчет прошить PIC, пЫшите в личку. |
|
|
|
|
#932 |
|
Форумец
Сообщений: 65
Регистрация: 26.01.2012
|
Код:
unsigned int temp2write; <- это какой тип? ........................................................ UART1_Write(temp2write); <- какой тип должен быть в скобках, а Вы какой засунули? |
|
|
|
|
#933 |
|
КваДраНутыЙ
Сообщений: 1,435
Регистрация: 29.05.2010
|
|
|
|
|
|
#934 | |
|
Форумец
Сообщений: 88
Регистрация: 04.02.2011
Возраст: 46
|
Цитата:
Код:
//------------------------------------------------------------------------------------------
unsigned char _data = 0x1E;
...
UART1_Write(_data);
//------------------------------------------------------------------------------------------
UART1_Init(4800); // initialize UART1 module
Delay_ms(100);
while (1) {
if (UART1_Data_Ready() == 1) { // if data is received
UART1_Read_Text(output, "OK", 10); // reads text until 'OK' is found
UART1_Write_Text(output); // sends back text
}
}
|
|
|
|
|
|
#935 |
|
Форумец
Сообщений: 88
Регистрация: 04.02.2011
Возраст: 46
|
petrd, здравствуйте!
Подскажите пожалуйста, каким образом (просто) реализовать следующую функцию с помощью PIC: "PWRKEY button – turns on the MOD-GSM module. You can turn on the SIM340D by driving the PWRKEY to a low level voltage for period time from 500mS to 1S" Схема включения модуля: ![]() Увеличить фото »» Т.е. мне нужно иммитировать нажатие кнопки ножкой МК. |
|
|
|
|
#937 |
|
Форумец
|
Для AlexVK
как вариант это может выглядеть примерно так передатчик: Код:
char messag[5]; ...... messag[0] = Ow_Read(&PORTA, 0); messag[1] = Ow_Read(&PORTA, 0); messag[2] = 'O'; messag[3] = 'K'; messag[4] = 0; UART1_Write_Text(messag); ......... Код:
char messag[5]; unsigned int temp2write; .......... UART1_Read_Text(messag, "OK", 5); temp2write = (unsigned int)(messag[0]; temp2write = (unsigned int)(messag[1]<<8) + temp2write; ИМХО, делать через обычный UART1_Write() и таймаут на прием. Последний раз редактировалось petrd; 27.01.2012 в 22:05. |
|
|
|
|
#939 |
|
Форумец
Сообщений: 65
Регистрация: 26.01.2012
|
petrd,
Нет не идет, показания на ЖК другие, но не правильные. раньше показывал не правильно, но показания менялись равномерно, теперь скачут не предсказуемо во вложении проекты и файл протеуса, может кто из интереса посмотрит и укажет верный путь Последний раз редактировалось AlexVK; 27.01.2012 в 21:08. |
|
|
|
|
#940 | |
|
Форумец
|
Цитата:
Дальше (например, для RB0) 1. TRISB0 = 1 2. RB0 = 0 3. Когда надо нажать кнопку делаете TRISB = 0 4. Задержка от 0,5 до 1 сек 5. TRISB = 1. |
|
|
|
|
|
#941 |
|
Форумец
|
Со строками путь не совсем правильный. Смотрите другой вариант во вложении.
|
|
|
|
|
#943 |
|
Форумец
Сообщений: 65
Регистрация: 26.01.2012
|
Петр, Вы открывали эту тему с целью научить нас программировать PIC с нуля. Большое Вам спасибо. на этом форуме я на самом деле узнал много нового( в принципе для меня практически все новое и интересное) Прошу Вас продолжить в том же направлении. В данном случае у меня была проблема с UART, с Вашей помощью частная задача решена, все работает. Но хотелось бы узнать все поподробнее. Я думаю это направление многим начинающим будет очень интересно. Если можно популярно объяснить эту тему от простого к более сложному. Передача и прием одного, двух и более байт, вставка в передачу служебной информации, коллич. байт, адрес, подсчет и передачу контрольной суммы.
|
|
|
|
|
#944 |
|
Форумец
Сообщений: 4
Регистрация: 13.03.2011
Возраст: 40
|
Господа!
В начале темы в 2009 году рассматривался вопрос работы с DS18B20. Хотел бы снова поднять данный вопрос. Крайне интересует работа с несколькими датчиками на одной линии. Если у кого-нибудь есть примеры кода на MikroC буду крайне признателен. Большое спасибо! |
|
|
|
|
#945 |
|
Форумец
|
Модуль UART PIC
По просьбе здесь буду писать про UART. Пересказывать datasheet не буду.
См. AN774 "Asynchronous Communications with the PICmicro ® USART" http://ww1.microchip.com/downloads/e...tes/00774a.pdf http://www.microchip.ru/files/d-sheets-rus/pic16_18.pdf Некоторые особенности приемного модуля в PIC в асинхронном режиме (на пальцах): 1. Модуль имеет двойной приемный буфер (FIFO). Смысл такой - как только определен стоп-бит, принятый байт сваливается вверх буфера FIFO. Если буфер не вычитывать, то следующий принятый байт попадет вниз буфера FIFO. Если и после второго принятого байта не вычитывать буфер, то по приему стоп-бита третьего байта будет выставлен флаг OERR (это значит - принято три байта, после чего работа приемника остановлена, в буфере FIFO находятся два байта и их можно прочитать, третий байт будет утерян). Чтобы возобновить работу модуля потребуется выключить приемник и снова его включить (CREN = 0; CREN = 1; ). Чтобы этого не происходило надо своевременно вычитывать данные из FIFO. Своевременно - это значит до прихода стоп-бита третьего байта. Это делается чтением регистра RCREG. О том, что в буфере FIFO есть принятые данные сообщает бит RCIF = 1. Если все данные вычитаны RCIF будет установлен в 0 (аппаратно). Если по какой-то причине передающее устройство прекратило передачу посреди байта и приемник своевременно не обнаружил стоп-бита, то будет установлен флаг FERR = 1. Если есть необходимость проверять этот флаг, то его надо проверять перед чтением регистра RCREG (смысл такой: если FERR не установлен, то байт принят полностью, поэтому можно читать RCREG). Также появление FERR может проявляться в случае, когда не совпадают скорости приемника и передатчика. 2. Случаи, когда вся полезная информация передается в одном байте большая редкость. Практически всегда для передачи информации одного байта мало, байтов требуется больше чем один. Т.е. нужны пакеты из байтов, а передавать их надо по асинхронному каналу, т.е. без специальных мер никогда заранее не известно в какой момент начнется передача пакета, был ли перерыв в передаче пакета, закончена ли передача пакета. Пример: допустим мы знаем, что пакет состоит из пяти байт. Сначала включили приемник, а потом передатчик. В итоге считается количество принятых байтов и как только их принято пять, то делается вывод, что пакет принят. Вроде все как надо. А если сначала начать передачу, а потом включить приемник? Пять байтов-то будет принято, но не факт, что они из одного пакета. Пример засады - код из поста №941 (в протеусе-то работает, а в реальности могут возникнуть проблемы). Поэтому и нужны эти самые "специальные меры". Про пакеты. Пакеты могут быть фиксированной и переменной длины. Для пакетов фиксированной длины важно определить начало пакета, а конец высчитывается легко. Для пакетов переменной длины сложнее, информация о длине пакета должна быть заложена внутри пакета. Если известно начало - то конец найдется. Вариант. Есть такой протокол Modbus в двух вариантах передачи данных Modbus RTU и Modbus ASCII. В Modbus RTU оговорено, что время между пакетами не может меньше, чем 3,5 фрейма (где фрейм - это старт-бит + 8 бит данных + бит четности + стоп-бит и т.п.). Т.е. если нет обмена в течении времени больше чем 3,5 фрейма, то можно утверждать, что первый принятый байт после этого интервала тишины будет началом пакета. Алгоритм реализации примерно такой: прием байта идет в прерывании, байты складываются в буфер, также имеется таймер, настроенный на 3,5 фрейма. При приеме байта, таймер сбрасывается. Если сработал таймер, а перед этим принимался пакет, то считается, что прием пакета закончен, а сам пакет находится в буфере. Некоторые макросы: Код:
//макрос инициализации USART
#define USART_INIT(spbrg) \
SPBRG = (spbrg); \
TXSTA = 0b10010100; \
RCSTA = 0b10000000; \
TXEN_bit = 1;
//макрос отправки байта через USART
#define SENDBYTE(b) while(!TXIF_bit); \
TXREG = (b)
// В программе перед началом соединения инициализируем USART
// USART_INIT(bRate); //bRate - скорость связи - читаем даташит :)
// USART_INIT(10); // 57600 при Fosc = 10 МГц
// ...
// передаем байт
// SENDBYTE(bData); //bData - передаваемый байт
Последний раз редактировалось petrd; 31.05.2012 в 11:07. |
|
|
|
|
#946 |
|
Форумец
Сообщений: 65
Регистрация: 26.01.2012
|
petrd,
Спасибо за новую тему, с нетерпение жду продолжения. Если можно с небольшими примерами, достаточно кусков кода передачи и приема. Особенно интересует передача и прием разрозненных данных. например МК считывает данные с датчика температуры и АЦП, после этого передает их второму МК, добавляя кое -что от себя, парочку любых чисел. Если будут 2-3 датчика температуры и 2-3 АЦП это вообще сказка. Заранее спасибо. |
|
|
|
|
#947 |
|
Форумец
Сообщений: 88
Регистрация: 04.02.2011
Возраст: 46
|
petrd, здравствуйте! Подскажите пожалуйста, а то не могу понять причину, пишу в переменную ModemAnswer принятые байты и сразу же посылаю их обратно - все нормально, но после передачи, когда нажимаю кнопку, повешанную на RA1_bit хочу считать ранее принятые байты, то получается ерунда в ответе. Почему так? Из-за неверно используемой переменной ModemAnswer?
Код:
unsigned char *ModemAnswer[16]; // Ответ модема на команды
...
// Главный цикл
do {
if (!RA0_bit){Send2_SMS();} // Отправляем СМС
if (!RA1_bit){ // Читаем ответ модема
UART1_Write_Text(ModemAnswer);
delay_ms(200);
}
if (UART1_Data_Ready()==1){
receive=UART1_Read();
if (receive != 0x0D && receive != 0x0A){
i++;
ModemAnswer[i]=receive;
UART1_Write(ModemAnswer[i]);
}
}
else{i=0;}
}// end do
while (1);
}// end main
//------------------------------------------------------------------------------
|
|
|
|
|
#948 |
|
Форумец
|
Вполне может быть. У Вас вероятно есть предупреждения при компиляции:
Код:
......... Suspicious pointer conversion Implicit conversion of int to ptr Implicit conversion of pointer to int .......... Код:
unsigned char ModemAnswer[16]; |
|
|
|
|
#949 | |
|
Форумец
Сообщений: 9
Регистрация: 22.01.2012
|
Цитата:
Недопонимаю чего-то. Разве так должно быть? Весь порт должен синхронно мигать. А тут ... |
|
|
|
|
|
#950 |
|
Форумец
Сообщений: 65
Регистрация: 26.01.2012
|
Попробуй вот так, в начальных настройках надо записать в PORTB 0 или 1, надо конкретно указывать, иначе там может быть что угодно, поэтому у Вас и нет синхронного мигания всего порта
Код:
void main()
{
TRISB=0; // настроили выводы PORTB на вывод
PORTB=0; // записали в PORTB 0
while(1){ // организовали вечный цикл
PORTB=~PORTB; // инверсия уровней на выводах PORTB
delay_ms(1000); // задержка на 1000 мс = 1 сек
}
}// main
Последний раз редактировалось AlexVK; 02.02.2012 в 12:12. |
|
|
|
|
#951 |
|
Форумец
Сообщений: 88
Регистрация: 04.02.2011
Возраст: 46
|
программу запустил как положено, вот код:
Код:
unsigned int i, y;
//------------------------------------------------------------------------------
// Инициализируем UART
UART1_Init(9615); // Initialize hardware UART1 and establish communication at 9600 bps
прием)
Delay_ms(100); // Задержка для инициализации UART
//------------------------------------------------------------------------------
// Основная программа
void main() {
char recieve;
char ModemAnswer[20]; // Ответ модема на команды
Init(); // Запускаем процедуру инициализации
Lcd_Out(1, 1, "I am ready!"); // Отображаем приветствие
i=0;
// Главный цикл
do {
if (!RA0_bit){Send_CMD();} // Отправляем СМС
if (!RA1_bit){ // Читаем ответ модема
LCD_Out(2,1," ");
for (y=0;y<i;y++){
//UART1_Write(ModemAnswer[y]); //НЕ ЗАБЫВАТЬ КОММЕНТТИРОВАТЬ для модема!!!
LCD_Chr(2,y+1,ModemAnswer[y]);
//LCD_Chr(2,1,0x30+i);
}
delay_ms(200);
i=0;
}
if (UART1_Data_Ready()==1){
ModemAnswer[i]=UART1_Read();
i++;
}
}// end do
while (1);
}// end main
//------------------------------------------------------------------------------
Данные отправляются и принимаются четко как в аптеке... НО! Когда соединил PIC с модемом (модем сам настраивается на скорость обмена по Datasheet), то данные отправляются четко и модем отсылает, например СМС, но если попробовать получить результат выполнения команды модемом, мой PIC принимает ч/з UART не то что ожидается... Причем соединялся с модемом также ч/з PICkit2 - на команду "AT"+<CR> модем четко возвращает АT<CR><CR><LF>OK<CR><LF>, т.е. полученную команду и ответ на нее "ОК". Мой PIC16F877A возвращает первый раз "AT", когда второй раз посылаешь команду "АТ" в модем - PIC возвращает "PU" - и дальше, сколько бы я не отправлял команду "AT" в модем - PIC возвращает "PU"? Пробовал играться скоростями - не помогает. Явную причину пока определить не могу, но есть сомнения, что это может быть связано с 9-и разрядным приемом данных UART PIC (как посмотреть функцию UART1_Init()?) Еще заметил, что от модема ответ приходит всегда не больше 2-х байт? Возможно еще, что модем шлет ответ с другой скоростью, чем инициирован UART PIC? Помогите пожалуйста, я уже плюнул на встроенные библиотеки по работе с UART, сейчас изучаю как самому инициализировать его и запустить... Очень жду ваших советов... |
|
|
|
|
#952 | |
|
Форумец
Сообщений: 9
Регистрация: 22.01.2012
|
Цитата:
|
|
|
|
|
|
#954 |
|
Форумец
Сообщений: 65
Регистрация: 26.01.2012
|
|
|
|
|
|
#955 |
|
Форумец
Сообщений: 88
Регистрация: 04.02.2011
Возраст: 46
|
UART
Написал по Datasheet к PIC16F877A асинхронный приемо-передатчик, получил результат такой же как и для существующих функций в MikroC - USARTx_Read() - приведенной выше в коде.
Но мне удалось найти причину, при приеме от модема всегда принимается только один байт и сразу возникает ошибка OERR, причем скорость модема я устанавливаю с помощью PICKit2 (USART tool) и после перезагрузки модема скорость всегда 9600бод. (Проверил.) Если посылаю данные ч/з PICKit2 в PIC или модем - данные принимаются четко и ошибка не возникает... Что думаю, возможно модем посылает байты без задержек м/у ними, а программа просто не успевает считывать RCREG? PIC работает на частоте 16Мгц. Пробовал повысить скорость приема UART PIC - вместо 9615бод поставил 19231, то данные стали приходить без мусора, но ошибка переполнения продолжает возникать после приема первого байта. Уже подумываю увеличить длину кабеля м/у PIC и модемом для увеличения задержки в передачи данных, поможет или нет? Я так понимаю, что когда мы перегружаем UART: Код:
CREN_bit=0; CREN_bit=1; Что имеем: BRGH=1 SPBRG=103 (бывает мусор), SPBRG=51 - 2-а байта принимаются без мусора (в обоих случаях имеем ошибку OERR)... Внимание всем вопрос: кто виноват и что делать?
|
|
|
|
|
#956 |
|
Форумец
|
Не надо скорости UART подстраивать - есть стандартный ряд вот им и надо пользоваться (....... 9600, 19200, ....). Вот эти Ваши подстройки 9615, 19231 точно на конечный результат не влияют. Для 16 МГц и 9600 все правильно настроено (BRGH=1; SPBRG=103) и мусор тут от неправильной программы или железа. И не надо провода удлиннять, фигней не занимайтесь.
Как вариант - сделать прерывания по приему (RCIF) и кольцевой буфер. В прерывании принимаемые данные будут быстро выбиратьсяся из RCREG и складываться в буфер, а в основной программе выбираться из буфера и обрабатываться. |
|
|
|
|
#958 |
|
Форумец
Сообщений: 211
Регистрация: 11.02.2010
Возраст: 36
|
Здравствуйте!
Ребят ну не пинайте сильно меня, пока только начинаю осваивать, есть огромное желание научиться програмировать микроконтроллеры. Спаять могу впринципе, а вот со схемами и компонентами пока не силён. Хочу собрать pic программатор сам, вот нашёл в интернете схему, подскажите пожалуйста все ли я компоненты перечислил, которые нужны для его сборки: Стабилитрон 5.1В: - 1 шт BZX55C5V1, стабилитрон 5.1В, 5мА, 0.5Вт или КС126Д1 Стабилитрон 13В: 1шт BZX79C13 или BZX55C13 или КС213Ж или КС207Г Диод: 1N4148 или КД522Б - 5шт Конденсатор: К50-35 100 мкф х 16 в - 1шт К53-1А 0,1 мкф х 16 в - 1шт Резисторы: 1кОм - 1шт 1.5кОм - 2шт 10кОм - 1шт 10кОМ ( переменный ) -1 шт Светодиод - 1шт панелька dip18 - 1шт Com port 9 pin ( мама) - 1шт Еще пара вопросиков: 1. Все ли беспроблемно можно найти? 2. Не пойму зачем там переменный резистор. 3. Какую мощность резисторов брать? 0.25 будет достаточно? или как вообще определять нужную мощность. P.S ссылка на статью |
|
|
|
|
#960 |
|
Форумец
Сообщений: 211
Регистрация: 11.02.2010
Возраст: 36
|
Да тут понимаешь, просто хочется с чего то начать, чтобы так сказать на практике получилось, чтоб вставить прошить, а оно заработало))))) потом уже двигаться дальше
Понимаю, что можно купить готовый программатор, но еще раз повторюсь, хочу попрактиковаться с положительным эффектом
|
|
|