supercelt Опубликовано 3 августа, 2015 Поделиться Опубликовано 3 августа, 2015 Здрасьте! Задание было такое. организовать генерацию манчестерского кода на atmega16 для стандарта RFID меток 125 кГц EM4100 (RF 64). Исходные данные которые надо закодировать в манчестер это - 1110 и по кругу. Я написал код, всё работает прекрасно скрин с протеуса прилагается Манчестер код - красная диаграмма. Жёлтая - это несущая частота. Должна быть 125 кгц, но я уменьшил до 15 что бы чётче было в протеусе. Для тех кто мало ли не знает что такое RF64 - это значит что один бит данных метки передаётся за 64 такта несущей частоты. Хочу задать вопрос Вам, программистам с большим опытом. Посмотрите мой код пожалуйста. Вот он вроде и работает, но всё ли я верно сделал?. Может есть какие-то приёмы что бы сделать по короче по легче. и тд.? //################################################################################################################## //Так как Proteus 8 очень плохо моделирует при высоких частотах, то задана проверочная частота счётчика 15.625 kHz, //вместо 125 kHz! //Программа расчитана для стандарта EM4100A6CB2RC (Кодировка Manchester. Cycle/bit 64). Это значит что //один бит данных занимает 64 периода сигнала на катушке. //################################################################################################################## #define F_CPU 8000000 //Частота камня #include <avr/io.h> #include <avr/interrupt.h> volatile static char bit_rate_counter = 0; //переменная считает количество положительных тактов счётчика unsigned char data[] = {1,1,1,0}; //массив с выходным двоичным кодом который надо передать unsigned char i = 0; //переменная для выборки из массива data нужного элемента в нужном месте volatile unsigned char pass = 0; //переменная нужна что бы программа в цикле лишний раз не заходила в условие if(bit_rate_counter == 8 && pass == 1) ISR(TIMER0_COMP_vect){ //вектор прерывания по совпадению if(PINB & (1 << 3)){ //если на пине 3 порта В устанолена 1 bit_rate_counter ++; //увеличиваем счётчик положительных тактов счётчика на 1 if(bit_rate_counter == 32){ //если число положительных тактов = 32 pass = 1; //то ставим флаг что бы разрежить программе зайти в условие if(bit_rate_counter == 32 && pass == 1) } } } int main(void) { DDRC |= (1 << 0); //0 пин порта С работает на выход PORTC &= ~(1 << 0); //Ставил лог. 0 на 0 пин порта С DDRB |= (1 << 3); //3 пин порта В работает на выход PORTB &= ~(1 << 3); //ставим лог. 0 на 3 пин порта В DDRA |= (1 << 0); //Порт А работает на выход PORTA &= ~(1 << 0); //ставим лог. 0 на 0 пин порта А OCR0 = 3; //Задаём частоту счётчика. При предделителе 1/64 и OCR = 3 Частота будет 15.625 kHz TCCR0 |= (0 << WGM00)|(1 << WGM01); //Режим работы таймера-счётчика0 - сброс при совпадении (СТС) TCCR0 |= (0 << CS02)|(1 << CS01)|(1 << CS00); //предделитель частоты 1\64 TCCR0 |= (0 << COM01)|(1 << COM00); //Смена сигнала на PB3 - Toggle TIMSK |= (1 << OCIE0); //Разрешаем уходить в прерывание при совпадении TCNT0 и OCR asm("sei"); //Разрешаем прерывания глобально while(1) //Бесконечный цикл { //asm("nop"); if(bit_rate_counter == 64){ //если число положительных тактов = 64 bit_rate_counter = 0; //Обнуляем счётчик положительных тактов } if(bit_rate_counter == 0){ //Если число положительных тактов = 0 if(data[i] == 1){ // Если в данных, в i бите единица PORTC |= (1 << 0); //подаем на порт С 0 пин - 1 PORTA |= (1 << 0); //подаем на порт А 0 пин - 1 } else { //если в данных в i бите не единица то есть ноль PORTC &= ~(1 << 0); //подаем на порт С 0 пин - 0 PORTA &= ~(1 << 0); //подаем на порт С 0 пин - 0 } } if(bit_rate_counter == 32 && pass == 1){ //если число положительных тактов = 32 и сработало прерывание, которое установило флаг 1 if(data[i] == 1){ //Если в данных, в i бите единица PORTA &= ~(1 << 0); //подаем на порт А 0 пин - 0 } else { //если в данных в i бите не единица то есть ноль PORTA |= (1 << 0); //подаем на порт А 0 пин - 1 } i++; //увеличиваем i на 1, для того что бы при следующем заходе брать следующий бит данных if(i == 4){ //если биты данных закончились. А их всего 4, то i = 0; //Обнуляем счётчик битов. При следующем заходе код будет передаваться заново. } pass = 0; //Обнуляем флаг, что бы программа сюда не заходила до следующего прерывания } } } //Все глобальные переменные, используемые в ISR, надо снабжать атрибутом "volatile". //Прога выводит манчестер кода 1110 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 3 августа, 2015 Поделиться Опубликовано 3 августа, 2015 Манчестер код - красная диаграмма. Жёлтая - это несущая частота. Должна быть 125 кгц, но я уменьшил до 15 что бы чётче было в протеусе. мне кажется или получен инверсный код??? и почему несущая отдельно от кода??? и уменьшать частоту в протезе не нужно... вместо осциллографа пользуйтесь графом ЛОГИЧЕСКИЙ АНАЛИЗАТОР левой панели инструментов http://kazus.ru/forums/showthread.php?t=13198&page=3 с 22поста... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
supercelt Опубликовано 3 августа, 2015 Автор Поделиться Опубликовано 3 августа, 2015 Спасибо за ответ. Да, сорри код инверсный, поправлю. А не моги бы вы пояснить что значит несущая отельно от кода? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
IMXO Опубликовано 3 августа, 2015 Поделиться Опубликовано 3 августа, 2015 ну типа такого http://radiohlam.ru/teory/nec.htm 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
supercelt Опубликовано 3 августа, 2015 Автор Поделиться Опубликовано 3 августа, 2015 (изменено) а, теперь понял. Я бы так сделал, если бы протеус умел эмулировать поднесение метки к катушке. Поэтому я беру уже детектированный сигнал и подаю его прямо на порт. Всё равно детекцией будет заниматься аналоговая обвеска. Во всяком случае в примерах все так делали где я смотрел А в целом код норм? не громоздкий? Изменено 3 августа, 2015 пользователем supercelt 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 3 августа, 2015 Поделиться Опубликовано 3 августа, 2015 ниче не понял.. какой приемник? если пины настроены на выход??? и куда вы подаете декретированный сигнал 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
supercelt Опубликовано 3 августа, 2015 Автор Поделиться Опубликовано 3 августа, 2015 на второй мк который тут не указан. Второй мк должен просто прочитать манчестер и вывести исходный код. Поэтому мне и надо что бы приёмник давал просто манчестер без несущей частоты 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 3 августа, 2015 Поделиться Опубликовано 3 августа, 2015 тогда в первый МК должна быть подключена несущая для синхронизации или нет? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
supercelt Опубликовано 3 августа, 2015 Автор Поделиться Опубликовано 3 августа, 2015 да должна 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 3 августа, 2015 Поделиться Опубликовано 3 августа, 2015 ну и где она ??? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
supercelt Опубликовано 3 августа, 2015 Автор Поделиться Опубликовано 3 августа, 2015 тут пока нет. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 3 августа, 2015 Поделиться Опубликовано 3 августа, 2015 а что мешает ее генерировать прямо в МК и выдавать код уже с несущей? для этого достаточно включить ШИМ , настроить его на частоту 125кГц в прерывании по постлелителю 1:32 переключать скважность ШИМа 0% или 35% тем самым формируя передачи полубитов для лог.1 или лог.0 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
supercelt Опубликовано 3 августа, 2015 Автор Поделиться Опубликовано 3 августа, 2015 (изменено) Чёт я не понял про шим. Если шим это значит TCCR0 (3 и 6 бит ставим в 1). В этом режиме вроде можно OCR регулировать скважность, а период будет постоянным. Если даже выбрать макс частоту камня 16мгц, то 16000000/256 тиков счётчика TCNT0 = 62.500 кгц. Не дотягивает до нужных 125 Изменено 3 августа, 2015 пользователем supercelt 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 3 августа, 2015 Поделиться Опубликовано 3 августа, 2015 так счетчик не обязательно должен считать до 256 не знаю как это реализовано в АВРх, в ПИКах изменением счетчика можно регулировать период ШИМа просто с повышением частоты уменьшаться разрядность ШИМа, думаю в АВРх тоже самое... почитайте доки 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
supercelt Опубликовано 3 августа, 2015 Автор Поделиться Опубликовано 3 августа, 2015 Я это читал. Особо не помогло. Вычитал в какой-то статье что частотой шима можно управлять уменьшая верхний предел счётчика tcnt0. А вот как это сделать нигде не сказано 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 3 августа, 2015 Поделиться Опубликовано 3 августа, 2015 да действительно несколько не то... значит это только на ПИКх такая возможность 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Viktor26 Опубликовано 3 августа, 2015 Поделиться Опубликовано 3 августа, 2015 Настраивание таймер на сброс при совпадении, в регистр сравнения пишите число меньше чем 255. Настраиваете ножку чтоб меняла свое значение на противоположное при совпадении счетного регистра с регистром сравнения. Теперь давайте посчитаем какая частота у вас будет при 8 МГц и если в регистр сравнения будет записано число например 20, правильно уже 400кГц. 0 Не знаеш как? Спроси у Google'а !!! Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 3 августа, 2015 Поделиться Опубликовано 3 августа, 2015 это не совсем то что нужно... как я понял в АВР нет возможности установить разрядность ШИМа меньше 8 и при этом получить прерывание от таймера через 16 периодов ШИМа .... отсюда невозможно получить Для тех кто мало ли не знает что такое RF64 - это значит что один бит данных метки передаётся за 64 такта несущей частоты. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Viktor26 Опубликовано 3 августа, 2015 Поделиться Опубликовано 3 августа, 2015 Тут нужны гуру. Так далеко я еще не копал Знаю точно Геннадий копает в данный момент rfid у него можно спросить как это дело прикручивается. 0 Не знаеш как? Спроси у Google'а !!! Ссылка на комментарий Поделиться на другие сайты Поделиться
supercelt Опубликовано 4 августа, 2015 Автор Поделиться Опубликовано 4 августа, 2015 Кто такой Геннадий? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Viktor26 Опубликовано 4 августа, 2015 Поделиться Опубликовано 4 августа, 2015 Зайдите в ветку AVR или мк для начинающих. Он там в темах частенько фигурирует. Ща попробую с телефона ссылку на него вставить http://forum.cxem.net/index.php?showuser=16151 Вот он 0 Не знаеш как? Спроси у Google'а !!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.