Заголовок сообщения: mega8 и nrf24l01 в codevision
Добавлено: Ср дек 11, 2013 11:13:29
Родился
Зарегистрирован: Вс мар 24, 2013 17:06:02 Сообщений: 10 Откуда: Краснодарский край Староминская
Рейтинг сообщения:0
Всех с наступающим Новым годом! Прошу помощи Я осваиваю codevision и застрял на spi а конкретнее на модуле nrf24l01 приобрел у косоглазых за шапку сухарей. Теперь ближе к телу имеется две меги8, два модуля и codevisin управлять надо гаражом открывать закрывать. Может у кого есть заготовки программы или конкретные решения очень прошу поделиться желательно с описанием. Гугл почемуто по этому поводу молчит вот и решил попросить помощи на своем любимом сайте
Заголовок сообщения: Re: mega8 и nrf24l01 в codevision
Добавлено: Ср дек 11, 2013 14:04:45
Родился
Зарегистрирован: Вс мар 24, 2013 17:06:02 Сообщений: 10 Откуда: Краснодарский край Староминская
Рейтинг сообщения:0
Огромное спасибо дорогие коты за отклик но дело в том что многие из ваших ссылок я посещал конкретного под codevision я не нашел. Электроникой я занимаюсь очень давно а вот с написанием программ недавно, в далеком прошлом учил СИ и исходя из этого выбрал среду разработки codevision хотя понял что это далеко не лучший выбор понравилась эта ссылка http://avrproject.ru/publ/kak_podkljuch ... 1/2-1-0-92 она ближе к моей теме но как я понимаю исходник написан на бэйсике а я от него далек. хотелось бы более конкретного в codevision
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
какая разница какой компилятор? И любая из ссылок подходит. Если там код на Си. Какая разница что делает устройство? У вас логика работы простая как две копейки, основная трудность это разобраться с протоколом работы модулей. А это есть в любом проекте на них. Так что я не совсем понимаю в чем вопрос.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: mega8 и nrf24l01 в codevision
Добавлено: Ср дек 11, 2013 19:31:24
Родился
Зарегистрирован: Вс мар 24, 2013 17:06:02 Сообщений: 10 Откуда: Краснодарский край Староминская
Рейтинг сообщения:0
Ну вот, то что нужно!!! Огромное спасибо за ссылку github.com/kehribar/nrf24L01_plus зашел а там у автора ссылка на буржуйский сайт на котором и библиотека и примеры на си http://www.tinkerer.eu/AVRLib/nRF24L01 ща буду пробовать
Ну вот, то что нужно!!! Огромное спасибо за ссылку github.com/kehribar/nrf24L01_plus зашел а там у автора ссылка на буржуйский сайт на котором и библиотека и примеры на си http://www.tinkerer.eu/AVRLib/nRF24L01 ща буду пробовать
Заголовок сообщения: Re: mega8 и nrf24l01 в codevision
Добавлено: Ср апр 09, 2014 14:16:20
Родился
Зарегистрирован: Чт мар 26, 2009 00:25:02 Сообщений: 11 Откуда: Воронеж
Рейтинг сообщения:0
belyay писал(а):
Vladcom писал(а):
Ну вот, то что нужно!!! Огромное спасибо за ссылку github.com/kehribar/nrf24L01_plus зашел а там у автора ссылка на буржуйский сайт на котором и библиотека и примеры на си http://www.tinkerer.eu/AVRLib/nRF24L01 ща буду пробовать
Доброго дня, получилось подружить модули с CVAVR?
а в чем проблема? там вроде все просто... вот кусок кода: Спойлер
Код:
//1-2. Питание, от 1.9 до 3.6В, не более (рекомендуется 3В)! //однако на другие пины можно подавать до 5.25В (in datasheet we trust).
//3.CE: Chip Enable. Зависит от режима работы. //Если чип сконфигурен как приемник, то высокий (HIGH) //уровень на CE позволяет чипу мониторить среду и получать пакеты. //Низкий (LOW) уровень переводит чип в Standby-I и такая //возможность становится уже недоступна. Если чип настроен на //передачу, CE всегда держится на низком уровне. //В этом случае для передачи данных нужно положить их в //очередь FIFO и дернуть CE минимум на 10мкс (LOW->HIGH, 10мкс, HIGH->LOW). #define NRF_CE PORTD.4
//4. CSN. Chip Select Not. Not, потому что активный уровень - низкий. //Пин всегда держится на высоком уровне, переводим на низкий уровень //для начала общения между чипом и МК по SPI. Когда пообщались - //снова возвращаем на высокий уровень. #define NRF_CSN PORTC.3
//5. SCK. Стробирующий сигнал SPI. Дежурный уровень - LOW. //Переход L->H говорит чипу что можно читать бит с MOSI и //писать на MISO. nRF24 - SLAVE устройство. Оно никогда не //инициирует связь с МК само, строб-сигнал SCK генерирует именно МК. #define NRF_SCK PORTB.5
//6-7. MOSI+MISO. Собственно линии дуплексной передачи данных //от чипа к МК и обратно. Когда МК вывел новый бит на линию MOSI // и/или считал бит с MISO, он может дергать SCK, чтобы дать // понять чипу, что он может читать/писать следующий бит. #define NRF_MOSI PORTB.3 #define NRF_MISO PORTB.4
//8. IRQ. Interrupt Pin. Дежурный уровень - высокий. //Пин полезно мониторить со стороны МК, дабы понять //, не случилось ли чего интересного, например новый пакет // пришел (прерывания настраиваются в чипе по SPI). // Активный уровень - низкий. Когда случается прерывание - // читаем статусный регистр и смотрим, что случилось. Всего прерываний три. #define NRF_IRQ PORTD.2
#define NRF_CONFIG 0x00 #define NRF_STATUS 0x07
void NRF_INIT(void) { NRF_CSN=1;//дежурный режим NRF_CE=0; }
Доброго времени суток, уважаемые Коты. Прошу вас помочь неофиту. Электроникой я занимаюсь более десяти лет, но так сложилось, что необходимость освоения микроконтроллеров, и, как следствие, программирования, возникла недавно. Поэтому заранее прошу простить мою дремучесть. Пишу в CVAVR - ибо только там пока что-то понял). Имеется отлаженный код, позволяющий общаться двум Атмега 8 по проводам. Вопрос такой: если использовать модули nrf24l01, просто подключив их к соответствующим выводам SPI и тупо подам на управляющие входы уровни в одном случае для приёмника, в другом - для передатчика (менять местами мастера и слейвов не надо - связь односторонняя), без дополнительных изменений в коде, для передачи одного байта, возможно? Или обязательно отдельно как-то общаться с регистрами самого радиомодуля? Под CVAVR примеров нигде нет, а без них пока ничего не могу, увы... Если несложно, подскажите плиз)
... если использовать модули nrf24l01, просто подключив их к соответствующим выводам SPI и тупо подам на управляющие входы уровни в одном случае для приёмника, в другом - для передатчика ....
В радиомодуле NRF24L01 нет управляющих входов. Он управляется настройкой внутренних регистров и подачей соотв. команд. Т.е. если Вы просто в разрыв линии связи двух Атмег (они общаются по SPI я правильно понял?) воткнете 2 радиомодуля - работать, конечно, ничего не будет. Нужно переписывать исходники.
... если использовать модули nrf24l01, просто подключив их к соответствующим выводам SPI и тупо подам на управляющие входы уровни в одном случае для приёмника, в другом - для передатчика ....
В радиомодуле NRF24L01 нет управляющих входов. Он управляется настройкой внутренних регистров и подачей соотв. команд. Т.е. если Вы просто в разрыв линии связи двух Атмег (они общаются по SPI я правильно понял?) воткнете 2 радиомодуля - работать, конечно, ничего не будет. Нужно переписывать исходники.
Спасибо). Не подскажете, есть где-нибудь библиотеки именно под кодевижн? Не хотелось бы всё писать с нуля(
Фу ты блин, так и хочется сказать ну ёлы палы, чего все кинулись искать библиотеки для NRF24L01, достаточно понять одно, что модуль NRF24L01 работает по ISP, и вам нужна одна библиотека а именно ISP даже если её нет она проста как дважды два. Достаточно понять как настроить модуль NRF24L01, а именно какие регистры за что отвечают, это всё что вам не обходимо чтобы заставить его работать. Наипростейший пример, кстати в даташите всё описано Быстрый старт Спойлер
Код:
Настройка приёмника:
CSN = 0; //выдаём адрес регистра пишем новое //который хотим изменить значение в регистр SPI1_Write(0x20); SPI1_Write(0b00001011); // включаем чип, работаем на приём CSN = 1;
Delay_ms(1); //тайминги не помню наверное можно и меньше
CSN = 0; SPI1_Write(0x31); SPI1_Write(0x01); //принимаем по одному байту //в принципе не обязательно менять но тогда прерывания на ноге IRQ //не будет после приёма пакета размером в один байт CSN = 1;
CE = 1;//с этого момента приёмник готов к приёму
//теперь только остаётся ждать преравания на ноге IRQ или просто //читать данные в цикле на предмет не изменилось ли чего CSN = 0;//читаем данные с регистра 0x61, всё что принял кладёт сюда SPI1_Write(0x61); text=SPI1_Read(temp); //чтение пакета CSN = 1;
CSN = 0; SPI1_Write(0x27); SPI1_Write(0x40); //снять прерывание // в принцепе не обязательно, особенно если IRQ ногу вообще //не планируешь использовать CSN = 1;
настройка передатчика:
Chip_Select = 0; Soft_SPI_Write(0xA0); Soft_SPI_Write(value); //пишем значение которое передадим Chip_Select = 1;
Delay_us(50);
Chip_Select = 0; Soft_SPI_Write(0x20); Soft_SPI_Write(0b00001010); //включение чипа, режим передачи Chip_Select = 1;
Delay_us(50);
CE=1; //отправка пакета Delay_us(50); CE=0;
Delay_ms(1);
Chip_Select = 0; Soft_SPI_Write(0x20); Soft_SPI_Write(0b00001000); //перевод чипа в слип режим Chip_Select = 1;//необходимо при питании от батарейки
Вот в принцепе в кратце осветил быстрый старт для чипа NRF24L01, хотя об этом уже много кто писал Удалось мне разобраться благодаря имено вот этой странице
Все пишут легко и просто, куча инфы, а по факту нигде нет архива с работающим кодом. В основной массе примеров все завязано совместно с UART. Но если он не нужен?? Нужно просто радиокнопку сделать, понять принцип работы.
Например передача, нету контроля IRQ, то есть железке пофиг есть в разъеме модуль nRF или нету. Добавил контроль IRQ, так вот он не падает в ноль после описанных в примере действий.
Выкладываю код на AVR Studio 4. SPI рабочий, проверялся отдельно.
//RX_DR 6 /*прерывание: данные получены. Для сброса записать 1.*/ //TX_DS 5 /*прерывание: данные переданы. Для сброса записать 1.*/ //MAX_RT 4 /*прерывание: данные не переданы. Для сброса записать 1.*/
//--------SPI--------------------------------------------------------------------------- /* 1. установка низкого логического уровня на линии SS 2. загрузка данных в регистр SPDR 3. ожидание окончания передачи (проверка флага SPIF) 4. сохранение принятых данных (чтение SPDR), если требуется 5. возврат на 2-ой шаг, если переданы не все данные 6. установка высокого логического уровня на линии SS */
Chip_Select = 0; Soft_SPI_Write(0xA0); Soft_SPI_Write(value); //пишем значение которое передадим Chip_Select = 1;
Delay_us(50);
Chip_Select = 0; Soft_SPI_Write(0x20); Soft_SPI_Write(0b00001010); //включение чипа, режим передачи Chip_Select = 1;
Delay_us(50);
CE=1; //отправка пакета Delay_us(50); CE=0;
Delay_ms(1);
Chip_Select = 0; Soft_SPI_Write(0x20); Soft_SPI_Write(0b00001000); //перевод чипа в слип режим Chip_Select = 1;//необходимо при питании от батарейки
----------
Настройка приёмника:
CSN = 0; //выдаём адрес регистра пишем новое //который хотим изменить значение в регистр SPI1_Write(0x20); SPI1_Write(0b00001011); // включаем чип, работаем на приём CSN = 1;
Delay_ms(1); //тайминги не помню наверное можно и меньше
CSN = 0; SPI1_Write(0x31); SPI1_Write(0x01); //принимаем по одному байту //в принципе не обязательно менять но тогда прерывания на ноге IRQ //не будет после приёма пакета размером в один байт CSN = 1;
CE = 1;//с этого момента приёмник готов к приёму
//теперь только остаётся ждать преравания на ноге IRQ или просто //читать данные в цикле на предмет не изменилось ли чего CSN = 0;//читаем данные с регистра 0x61, всё что принял кладёт сюда SPI1_Write(0x61); text=SPI1_Read(temp); //чтение пакета CSN = 1;
CSN = 0; SPI1_Write(0x27); SPI1_Write(0x40); //снять прерывание // в принцепе не обязательно, особенно если IRQ ногу вообще //не планируешь использовать CSN = 1; */ //----------
int main (void) {
DDRD=(1<<7); //диод индикации PORTC=(1<<2); //подтяжка к питанию //--------SPI--------- SPI_MasterInit(); //----------
while(1) {
while (!(PINC&(1<<2))); // работаем по размыканию кнопки на землю PORTD|=(1<<7); //индикатор transmit(); while(1);
//RX_DR 6 /*прерывание: данные получены. Для сброса записать 1.*/ //TX_DS 5 /*прерывание: данные переданы. Для сброса записать 1.*/ //MAX_RT 4 /*прерывание: данные не переданы. Для сброса записать 1.*/
//--------SPI--------------------------------------------------------------------------- /* 1. установка низкого логического уровня на линии SS 2. загрузка данных в регистр SPDR 3. ожидание окончания передачи (проверка флага SPIF) 4. сохранение принятых данных (чтение SPDR), если требуется 5. возврат на 2-ой шаг, если переданы не все данные 6. установка высокого логического уровня на линии SS */
CSN = 0; //выдаём адрес регистра пишем новое //который хотим изменить значение в регистр SPI1_Write(0x20); SPI1_Write(0b00001011); // включаем чип, работаем на приём CSN = 1;
Delay_ms(1); //тайминги не помню наверное можно и меньше
CSN = 0; SPI1_Write(0x31); SPI1_Write(0x01); //принимаем по одному байту //в принципе не обязательно менять но тогда прерывания на ноге IRQ //не будет после приёма пакета размером в один байт CSN = 1;
CE = 1;//с этого момента приёмник готов к приёму
//теперь только остаётся ждать преравания на ноге IRQ или просто //читать данные в цикле на предмет не изменилось ли чего CSN = 0;//читаем данные с регистра 0x61, всё что принял кладёт сюда SPI1_Write(0x61); text=SPI1_Read(temp); //чтение пакета CSN = 1;
CSN = 0; SPI1_Write(0x27); SPI1_Write(0x40); //снять прерывание // в принцепе не обязательно, особенно если IRQ ногу вообще //не планируешь использовать CSN = 1;
---------- настройка передатчика:
Chip_Select = 0; Soft_SPI_Write(0xA0); Soft_SPI_Write(value); //пишем значение которое передадим Chip_Select = 1;
Delay_us(50);
Chip_Select = 0; Soft_SPI_Write(0x20); Soft_SPI_Write(0b00001010); //включение чипа, режим передачи Chip_Select = 1;
Delay_us(50);
CE=1; //отправка пакета Delay_us(50); CE=0;
Delay_ms(1);
Chip_Select = 0; Soft_SPI_Write(0x20); Soft_SPI_Write(0b00001000); //перевод чипа в слип режим Chip_Select = 1;//необходимо при питании от батарейки
----------
*/ //----------
int main (void) {
DDRD=(1<<7); //диод индикации PORTC=(1<<2); //подтяжка к питанию //--------SPI--------- SPI_MasterInit(); //----------
while(1) {
while (!(PINC&(1<<2))); // работаем по размыканию кнопки на землю receive(); if(text==0x55) PORTD|=(1<<7);
_delay_ms(100);
} }
Не работает. Помогите, пожалуйста.
Надо как-то указывать канал передачи для модуля?
Вложения:
Комментарий к файлу: Вот две одинаковых платы. Передатчик и приемник. В одном случае диод индикатор отправки. В другом - приема. IMG_20180201_161435.jpg [221.31 KiB]
Скачиваний: 282
Скажу сразу я в codevision и AVR студии не писал поэтому некоторые моменты с моей точки зрения могут выглядеть как ошибка но сточки зрения этих компиляторов возможно не являться ошибкой. Передатчик Спойлер
//RX_DR 6 /*прерывание: данные получены. Для сброса записать 1.*/ //TX_DS 5 /*прерывание: данные переданы. Для сброса записать 1.*/ //MAX_RT 4 /*прерывание: данные не переданы. Для сброса записать 1.*/
//--------SPI--------------------------------------------------------------------------- /* 1. установка низкого логического уровня на линии SS 2. загрузка данных в регистр SPDR 3. ожидание окончания передачи (проверка флага SPIF) 4. сохранение принятых данных (чтение SPDR), если требуется 5. возврат на 2-ой шаг, если переданы не все данные 6. установка высокого логического уровня на линии SS */
while ((PINB & (1<<IRQ)) != 0);//Ждем пока байт не передан
WriteByte(0x04); ReadByte(); MAX_RT=SPDR; WriteByte(0x05); ReadByte(); TX_DS =SPDR; WriteByte(0x06); ReadByte(); RX_DR =SPDR; <-<-<тут если пытаешься сбросить прерывание то надо писать не 0x04 эту команду он просто проигнорит, надо так WriteByte(0x27);WriteByte(0x40);>->->
DDRD=(1<<7); //диод индикации PORTC=(1<<2); //подтяжка к питанию //--------SPI--------- SPI_MasterInit(); //----------
while(1) {
while (!(PINC&(1<<2))); // работаем по размыканию кнопки на землю <-<-<тут может лучше сделать не по кнопке а по таймеру>->-> PORTD|=(1<<7); //индикатор transmit(); while(1); <-<-<могу ошибаться но полагаю что из этого цикла контроллер скорее всего уже не выйдет сам>->->
//RX_DR 6 /*прерывание: данные получены. Для сброса записать 1.*/ //TX_DS 5 /*прерывание: данные переданы. Для сброса записать 1.*/ //MAX_RT 4 /*прерывание: данные не переданы. Для сброса записать 1.*/
//--------SPI--------------------------------------------------------------------------- /* 1. установка низкого логического уровня на линии SS 2. загрузка данных в регистр SPDR 3. ожидание окончания передачи (проверка флага SPIF) 4. сохранение принятых данных (чтение SPDR), если требуется 5. возврат на 2-ой шаг, если переданы не все данные 6. установка высокого логического уровня на линии SS */
DDRD=(1<<7); //диод индикации PORTC=(1<<2); //подтяжка к питанию //--------SPI--------- SPI_MasterInit(); //----------
while(1) {
while (!(PINC&(1<<2))); // работаем по размыканию кнопки на землю <-<-<Включать приёмник по кнопке в режиме теста, ну это уж лишнее, лучше мониторить IRQ>->-> receive(); if(text==0x55) PORTD|=(1<<7);
_delay_ms(100);
} }
Ну и ещё бывает проблема даже не в настройке модуля а в не правильном подключении, ну или проводок где нибудь отвалился или контакт плохой, для начала попробуй считать содержание регистров модуля, если он выплюнет одни нули то надо будет сначала с этим разбираться, тут косяк или в подключении или модуль не рабочий. Далее если данные с модуля читаются, уже пробовать передавать и принимать. Для начала можно просто взять один модуль и попытаться передавать в пустоту при этом будет срабатывать MAX_RT.
Считываю вроде регистр СТАТУС, все три бита в единице. Но после отправки посылки ничего не меняется. Не могу въехатьс методикой выбора регистра и записи инфы в них. Как маску наложить, и где адреса регистров...Вроде статус это 0х07, а конфиг 0х00.
Делаю так, но не выходит пока ничего...Не получается сбросить регистры.
Код:
WriteByte(0x07); //читаем регистр STATUS ReadByte(); //читаем регистр STATUS
text=SPDR; send_Uart(text);
_delay_us(20);
WriteByte(0x27); WriteByte(0b00001110);
_delay_us(20);
WriteByte(0x07); //читаем регистр STATUS ReadByte();
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 48
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения