Lexi Опубликовано 5 августа, 2008 Поделиться Опубликовано 5 августа, 2008 Всем привет!!! Предлогаю создать топик, в котором будет рассмотрено поэтапное создание проекта с использованием пакета IAR. Да и вообще небольшой либез по IAR для NEC. Первый вопрос. что это //----------------------------------------------------------------------------- // Option Byte //----------------------------------------------------------------------------- #pragma location = "OPTBYTE" __root const unsigned char opbyte=0x00; //--------------------------------------------------------------------------------- // Security ID CODE: for OCD On-Chip Debugging //--------------------------------------------------------------------------------- #pragma location = "SECUID" __root const unsigned char secuid[11]={0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; Особенно интересует строка #pragma location = "OPTBYTE" __root const unsigned char opbyte=0x00; 0 Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz. ICQ: 288449055 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexi Опубликовано 5 августа, 2008 Автор Поделиться Опубликовано 5 августа, 2008 И так на предыдущий вопрос нашел ответ тут. Теперь вопрос к Мигрею. Давай создадим проект, а потом будем его дополнять. К примеру, создамим с пояснениями все этапы проекта на камне который установлен на демоките линеки L2 udp78f0397. В проект будут включены: 2 светодиода, организация задержки с примением таймера, мигание светодидов, работа со внутреним драйвером ЖКИ, УАРТ, АЦП и т.д. Предлогаю начать с ЖКИ+АЦП+2 светодиода. Герератор внутрений 8 МГЦ. 0 Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz. ICQ: 288449055 Ссылка на комментарий Поделиться на другие сайты Поделиться
Реле, вентиляторы, корпуса, разъемы, а так же любые электронные компоненты в нашем каталоге! Бесплатная доставка + 15% кэшбэк + скидки!Перейти на сайт ТМ Электроникс Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Lexi Опубликовано 5 августа, 2008 Автор Поделиться Опубликовано 5 августа, 2008 Установили IAR. Запускаем новый проект. Создание нового проекта->выбор языка (мы вибираем Си)->сохраняем проект (C:\NEC\proekt.ewp). В результате компилятор выдал нам main.c int main( void ) { return 0; } 0 Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz. ICQ: 288449055 Ссылка на комментарий Поделиться на другие сайты Поделиться
Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Lexi Опубликовано 5 августа, 2008 Автор Поделиться Опубликовано 5 августа, 2008 Далее нам надо подключить библиотеку камушка и задать ему конфигурацию. Я возьму это дело из семплов, которые шли на диске вместе с демокитом. я имею ввиду, несколько строк написаных вышев первом посте. Вот что имеем на данный момент. #include "io78f0397.h" //----------------------------------------------------------------------------- // Option Byte //----------------------------------------------------------------------------- #pragma location = "OPTBYTE" __root const unsigned char opbyte=0x00; //--------------------------------------------------------------------------------- // Security ID CODE: for OCD On-Chip Debugging //--------------------------------------------------------------------------------- #pragma location = "SECUID" __root const unsigned char secuid[11]={0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; int main( void ) { return 0; } При компиляции возьникает ошибка Fatal Error[e72]: Segment OPTBYTE must be defined in a segment definition option (-Z, -b or -P) А теперь вопрос к людям знающим IAR, что эта ошибка означает?? Конечноже буду разбираться паралельно сам. 0 Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz. ICQ: 288449055 Ссылка на комментарий Поделиться на другие сайты Поделиться
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке. Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Migray Опубликовано 6 августа, 2008 Поделиться Опубликовано 6 августа, 2008 Lexi, ты вообще крут ! Начинать изучение IAR с создания собственного пустого проекта - задача не для начинающего, проще взять уже готовый пример и выкинуть из него все что тебе не нужно. Но ладно, пойдем по этому пути. Дело в том, что Option Byte и Security ID CODE должны быть размещены в специальном сегменте. Указания для линковщика, где и как размещать расписаны в командном файле (XLINK command file) расширение .XCL В твоем случае это DF0397_V4.XCL находится на диске, который идет с демокитом или на сайте NEC Подключить его к проекту можно одним из двух способов. 1. В строке меню Project/Add files... выбираешь нужный файл 2. В строке меню Project/Options..., далее Linker/Config/Linker command file пишешь строку типа $PROJ_DIR$\XCL\DF0397_V4.XCL или выбираешь, где у тебя лежит этот файл. В примерах на демокитах реализован второй вариант. В этом файле есть строчка -Z(CODE)OPTBYTE=0080-0081, которая и заставляет линковщик разместить оптибайт в нужном месте и с нужными опциями. В принципе, теоретически, должны быть модификаторы, которые позволят задать все опции в тексте на Си, без коммандного файла, но большинство этим не заморачивается. Да и тексты проекта от такого подхода сильно страдают, через пару месяцев сам начинаешь путаться, где, что и как объявил и проинициализировал. 0 Как советовать, так все чатлане ... Ссылка на комментарий Поделиться на другие сайты Поделиться
Литиевые батарейки и аккумуляторы от мирового лидера EVE в КомпэлКомпания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Lexi Опубликовано 6 августа, 2008 Автор Поделиться Опубликовано 6 августа, 2008 Migray, спасибо хоть с этим разобрались ))). 1 способ не пошел ))) В строке меню Project/Add files... выбираешь нужный файл А вот второй даже очень Project/Options..., далее Linker/Config/Linker command file пишешь строку типа $PROJ_DIR$\XCL\DF0397_V4.XCL или выбираешь, где у тебя лежит этот файл Итак, имеем на данный момент простой исхохник. #include "io78f0397.h" //----------------------------------------------------------------------------- // Option Byte //----------------------------------------------------------------------------- #pragma location = "OPTBYTE" __root const unsigned char opbyte=0x00; //--------------------------------------------------------------------------------- // Security ID CODE: for OCD On-Chip Debugging //--------------------------------------------------------------------------------- #pragma location = "SECUID" __root const unsigned char secuid[11]={0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; void Wait(unsigned char number) { TMC50 = 0x0b; // initialize Timer50 TCL50 = 0x07; // set input clock to fxp / 2^13 = 976 Hz @ 8MHz => 1ms CR50 = 0x32; // set interval time to 50 ms TCE50 = 1; // start Timer50 while(number > 0) { while(!TMIF50); // wait for Timer50 Interrupt request flag TMIF50 = 0; // clear Timer50 interruupt request flag number--; } TCE50 = 0; // stop Timer50 } void main( ) { OSCCTL = 0xd0; // external clock input mode PCC = 0x40; // CPU clock = fxp MCM = 0x06; // Set main system clock and peripheral hardware clock OSTS = 0x00; // Set minimum oscillation stabilization time PM0_bit.no0=0; // output mode port P00 P0_bit.no0=1; //set to "1" P00 while(1) { Wait(10); //ждем 500 мс P0_bit.no0=!P0_bit.no0; // инвертируем P00 } } Этот исходник заставляет помигать светодиод подключеный к порту P00 с частотой 1 Гц скажность 50%. Далее для удобства отладки проекта нужно подключить к проекту встроеный драйвер LCD. Чем собствено сча и займусь. В приклепленом файлик DF0397_V4.XCL 0 Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz. ICQ: 288449055 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexi Опубликовано 6 августа, 2008 Автор Поделиться Опубликовано 6 августа, 2008 Для подключения драйвера используем 2 библиотеки lcd.h и defines.h, а так же драйвер lcd.c. Последний прикрепляем к проекту Project->Add Files...-> выбираем файл lcd.c . Dct 3 все три файла вложены в приклепленый архив. #include "io78f0397.h" #include "C:\NEC\inc\defines.h" #include "C:\NEC\inc\lcd.h" 0 Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz. ICQ: 288449055 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexi Опубликовано 6 августа, 2008 Автор Поделиться Опубликовано 6 августа, 2008 Migray, вот как дальше работать LCD? При любой задаче (из библиотеки lcd.h) контроллер виснет, но компилятор замечаний не дает. Как быть?? Вот исходник #include "io78f0397.h" #include "C:\NEC\inc\defines.h" #include "C:\NEC\inc\lcd.h" //----------------------------------------------------------------------------- // Option Byte //----------------------------------------------------------------------------- #pragma location = "OPTBYTE" __root const unsigned char opbyte=0x00; //--------------------------------------------------------------------------------- // Security ID CODE: for OCD On-Chip Debugging //--------------------------------------------------------------------------------- #pragma location = "SECUID" __root const unsigned char secuid[11]={0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //----------------------------------------------------------------------------- // Global string constants //----------------------------------------------------------------------------- const char *s_clear =" "; //строка для очистки экрана void Wait(unsigned char number) { TMC50 = 0x0b; // initialize Timer50 TCL50 = 0x07; // set input clock to fxp / 2^13 = 976 Hz @ 8MHz => 1ms CR50 = 0x32; // set interval time to 50 ms TCE50 = 1; // start Timer50 while(number > 0) { while(!TMIF50); // wait for Timer50 Interrupt request flag TMIF50 = 0; // clear Timer50 interruupt request flag number--; } TCE50 = 0; // stop Timer50 } void main( ) { OSCCTL = 0xd0; // external clock input mode PCC = 0x40; // CPU clock = fxp MCM = 0x06; // Set main system clock and peripheral hardware clock OSTS = 0x00; // Set minimum oscillation stabilization time void LCD_init(); //инициализация LCD PM0_bit.no0=0; // output mode P0_bit.no0=1; while(1) { Wait(10); P0_bit.no0=!P0_bit.no0; // output mode LCD_string_shift("NEC L_LI"); } } В исходнике lcd.c есть привязка к переменным типа sw3. Вопрос такой можно ли достать "чистый" драйвер для этих дел? 0 Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz. ICQ: 288449055 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexi Опубликовано 6 августа, 2008 Автор Поделиться Опубликовано 6 августа, 2008 Migrey, обещал помочь с работой LCD дрйвера. А покуда расмотрим пример примения АЦП. Для удобства я создал функцию Line(). Она возвращает значение полученое от АЦП, мне для устройства вполне хватает 8-ми битное преобразование. Согласно моей задумке, мое устройство следит за линией, поэтому я ввел еще переменную point. С помощью этой переменой, я помещаю данные о начальном состоянии линии. Покуда я исключил проблемный для меня участок с LCD драйвером. #include "io78f0397.h" #include "C:\NEC\inc\defines.h" #include "C:\NEC\inc\lcd.h" #include <intrinsics.h> //----------------------------------------------------------------------------- // Option Byte //----------------------------------------------------------------------------- #pragma location = "OPTBYTE" __root const unsigned char opbyte=0x00; //--------------------------------------------------------------------------------- // Security ID CODE: for OCD On-Chip Debugging //--------------------------------------------------------------------------------- #pragma location = "SECUID" __root const unsigned char secuid[11]={0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //----------------------------------------------------------------------------- // Global string constants //----------------------------------------------------------------------------- __saddr volatile unsigned char sw3_in; void Wait(unsigned char number) { TMC50 = 0x0b; // initialize Timer50 TCL50 = 0x07; // set input clock to fxp / 2^13 = 976 Hz @ 8MHz => 1ms CR50 = 0x32; // set interval time to 50 ms TCE50 = 1; // start Timer50 while(number > 0) { while(!TMIF50); // wait for Timer50 Interrupt request flag TMIF50 = 0; // clear Timer50 interruupt request flag number--; } TCE50 = 0; // stop Timer50 } unsigned char Line() { // initialization of ADC ADM = 0x10; //set conversion time to 192/fx = 24us ADS = 0x05; //select AD channel ADCE = 1; //enable voltage generator ADCS = 1; //start AD converter while(!ADIF); ADIF=0; ADCS = 0; //stop AD converter sw3_in=0; return (ADCRH); } void main( ) { unsigned char point; OSCCTL = 0xd0; // external clock input mode PCC = 0x40; // CPU clock = fxp MCM = 0x06; // Set main system clock and peripheral hardware clock OSTS = 0x00; // Set minimum oscillation stabilization time point=Line()-5; PM0_bit.no0=0; // output mode PM0_bit.no1=0; // output mode P0_bit.no0=1; while(1) { Wait(10); P0_bit.no0=!P0_bit.no0; // output mode if(point > Line())P0_bit.no1=1; // output mode else P0_bit.no1=0; // output mode } } 0 Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz. ICQ: 288449055 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexi Опубликовано 6 августа, 2008 Автор Поделиться Опубликовано 6 августа, 2008 Итак, следующий шаг. Необходимо создать генератор с частотой 440Гц (+/- 5Гц). Для этого я использовал таймер Т51. Долго пытался увидеть светодиод горящим, а на частотометре увидеть 440. Оказываеться я зыбыл выставить инрертирование светодиода :лол:. Итак я получил 438.9 Гц. Вот дополненый исходник #include "io78f0397.h" #include "C:\NEC\inc\defines.h" #include "C:\NEC\inc\lcd.h" #include <intrinsics.h> //----------------------------------------------------------------------------- // Option Byte //----------------------------------------------------------------------------- #pragma location = "OPTBYTE" __root const unsigned char opbyte=0x00; //--------------------------------------------------------------------------------- // Security ID CODE: for OCD On-Chip Debugging //--------------------------------------------------------------------------------- #pragma location = "SECUID" __root const unsigned char secuid[11]={0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //----------------------------------------------------------------------------- // Global string constants //----------------------------------------------------------------------------- __saddr volatile unsigned char sw3_in; void Wait(unsigned char number) { TMC50 = 0x0b; // initialize Timer50 TCL50 = 0x07; // set input clock to fxp / 2^13 = 976 Hz @ 8MHz => 1ms CR50 = 0x32; // set interval time to 50 ms TCE50 = 1; // start Timer50 while(number > 0) { while(!TMIF50); // wait for Timer50 Interrupt request flag TMIF50 = 0; // clear Timer50 interruupt request flag number--; } TCE50 = 0; // stop Timer50 } unsigned char Line() { // initialization of ADC ADM = 0x10; //set conversion time to 192/fx = 24us ADS = 0x05; //select AD channel ADCE = 1; //enable voltage generator ADCS = 1; //start AD converter while(!ADIF); ADIF=0; ADCS = 0; //stop AD converter sw3_in=0; return (ADCRH); } void main( ) { unsigned char point; __disable_interrupt(); //запрещаем все прервания глобально OSCCTL = 0xd0; // external clock input mode PCC = 0x40; // CPU clock = fxp MCM = 0x06; // Set main system clock and peripheral hardware clock OSTS = 0x00; // Set minimum oscillation stabilization time //настройки для таймера51, сделано поналогии с Т50 - они аналогичны TMMK51 = 0; //разрешаем прерывания от таймеры Т51 TMC51 = 0x0b; // Инициализация таймера Т1 TCL51 = 0x06; // устанавливаем делитель частоты от относительно тактового генератора CR51 = 35; //Format of Timer Clock Selection Register этой фигней регулируем время возниковения прерывания TCE51 = 1; // Включаем настройку __enable_interrupt(); // разрешаем лобально все прервыания point=Line()-5; PM0_bit.no0=0; // порт на вывод PM0_bit.no1=0; // порт на вывод P0_bit.no0=1; while(1) { Wait(10); P0_bit.no0=!P0_bit.no0; // мигает светиком до упада 1Гц //if(point > Line())P0_bit.no1=1; // если условие верное, то вкл сетодиод временно отключил конроль всетодидом, //else P0_bit.no1=0; // если нет, гасим он нужен мне для отладки моего зумера } } //----------------------------------------------------------------------------- // ISR: isr_INTWT_vect // Function: Interrupt service routine of WatchTimer //----------------------------------------------------------------------------- #pragma vector = INTTM51_vect //обработка прерываний от таймера Т51 __interrupt void isr_INTTM51(void) { P0_bit.no1=!P0_bit.no1; //мигаем всетодидом с частотй 438.9 Гц скважность 50% TMIF51 = 0; //гасим флаг прерывания } Вообще таймера тут очень гибкие, я думаю можно было бы вывести 440 ровно, но время нет. Надо сдавать проект. 0 Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz. ICQ: 288449055 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexi Опубликовано 6 августа, 2008 Автор Поделиться Опубликовано 6 августа, 2008 Итак добавляем обработку прерывания от внешнего источника по INTP1. Прервание настроено по спаду или тылу импульса. Вот модернизированый исходник: #include "io78f0397.h" #include "C:\NEC\inc\defines.h" #include "C:\NEC\inc\lcd.h" #include <intrinsics.h> //----------------------------------------------------------------------------- // Option Byte //----------------------------------------------------------------------------- #pragma location = "OPTBYTE" __root const unsigned char opbyte=0x00; //--------------------------------------------------------------------------------- // Security ID CODE: for OCD On-Chip Debugging //--------------------------------------------------------------------------------- #pragma location = "SECUID" __root const unsigned char secuid[11]={0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //----------------------------------------------------------------------------- // Global string constants //----------------------------------------------------------------------------- __saddr volatile unsigned char sw3_in; void Wait(unsigned char number) { TMC50 = 0x0b; // initialize Timer50 TCL50 = 0x07; // set input clock to fxp / 2^13 = 976 Hz @ 8MHz => 1ms CR50 = 0x32; // set interval time to 50 ms TCE50 = 1; // start Timer50 while(number > 0) { while(!TMIF50); // wait for Timer50 Interrupt request flag TMIF50 = 0; // clear Timer50 interruupt request flag number--; } TCE50 = 0; // stop Timer50 } unsigned char Line() { // initialization of ADC ADM = 0x10; //set conversion time to 192/fx = 24us ADS = 0x05; //select AD channel ADCE = 1; //enable voltage generator ADCS = 1; //start AD converter while(!ADIF); ADIF=0; ADCS = 0; //stop AD converter sw3_in=0; return (ADCRH); } void main( ) { unsigned char point; __disable_interrupt(); //запрещаем все прервания глобально OSCCTL = 0xd0; // external clock input mode PCC = 0x40; // CPU clock = fxp MCM = 0x06; // Set main system clock and peripheral hardware clock OSTS = 0x00; // Set minimum oscillation stabilization time //настройки для таймера51, сделано поналогии с Т50 - они аналогичны TMMK51 = 0; //разрешаем прерывания от таймеры Т51 TMC51 = 0x0b; // Инициализация таймера Т1 TCL51 = 0x06; // устанавливаем делитель частоты от относительно тактового генератора CR51 = 35; //Format of Timer Clock Selection Register этой фигней регулируем время возниковения прерывания TCE51 = 1; // Включаем таймер //натройки для входа INTP1 преррвынине PM3_bit.no0=1; //пин на вход PIF1 = 0; // бсрос флага прерывания PPR1 = 1; //приритет обработки прерывания - низкий EGP_bit.no1=0; //настройка прерывания по спаду импульса EGN_bit.no1=1; //настройка прерывания по спаду импульса PMK1 = 0; // INTP1 прерывание разрешено __enable_interrupt(); // разрешаем лобально все прервыания point=Line()-5; //настройка направлений пинов отведенные под светодиды PM0_bit.no0=0; // порт на вывод PM0_bit.no1=0; // порт на вывод P0_bit.no0=1; //вкл всетодиод 1 while(1) { Wait(10); P0_bit.no0=!P0_bit.no0; // мигает светиком 1 до упада 1Гц //if(point > Line())P0_bit.no1=1; // если условие верное, то вкл сетодиод 2 временно отключил конроль всетодидом, //else P0_bit.no1=0; // если нет, гасим } } //----------------------------------------------------------------------------- // ISR: // Function: //----------------------------------------------------------------------------- #pragma vector = INTTM51_vect //обработка прерываний от таймера Т51 __interrupt void isr_INTTM51(void) { //P0_bit.no1=!P0_bit.no1; //мигаем всетодидом 2 с частотй 438.9 Гц скважность 50% времено отключил контроль всетодидом TMIF51 = 0; //гасим флаг прерывания } #pragma vector = INTP1_vect //обработка прерываний от внешнего источника от направления INTP1 __interrupt void isr_INTP1(void) // по тылу импульса { P0_bit.no1=!P0_bit.no1; //для контроля - все работает как часики :) PIF1 = 0; //гасим флаг прерывания } 0 Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz. ICQ: 288449055 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexi Опубликовано 6 августа, 2008 Автор Поделиться Опубликовано 6 августа, 2008 Добавил работу 16-ти разрядного таймера ТМ00, с режимом сравнения описание ниже. Все просто, если читать даташит. #include "io78f0397.h" #include "C:\NEC\inc\defines.h" #include "C:\NEC\inc\lcd.h" #include <intrinsics.h> //----------------------------------------------------------------------------- // Option Byte //----------------------------------------------------------------------------- #pragma location = "OPTBYTE" __root const unsigned char opbyte=0x00; //--------------------------------------------------------------------------------- // Security ID CODE: for OCD On-Chip Debugging //--------------------------------------------------------------------------------- #pragma location = "SECUID" __root const unsigned char secuid[11]={0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //----------------------------------------------------------------------------- // Global string constants //----------------------------------------------------------------------------- __saddr volatile unsigned char sw3_in; void Wait(unsigned char number) { TMC50 = 0x0b; // initialize Timer50 TCL50 = 0x07; // set input clock to fxp / 2^13 = 976 Hz @ 8MHz => 1ms CR50 = 0x32; // set interval time to 50 ms TCE50 = 1; // start Timer50 while(number > 0) { while(!TMIF50); // wait for Timer50 Interrupt request flag TMIF50 = 0; // clear Timer50 interruupt request flag number--; } TCE50 = 0; // stop Timer50 } unsigned char Line() { // initialization of ADC ADM = 0x10; //set conversion time to 192/fx = 24us ADS = 0x05; //select AD channel ADCE = 1; //enable voltage generator ADCS = 1; //start AD converter while(!ADIF); ADIF=0; ADCS = 0; //stop AD converter sw3_in=0; return (ADCRH); } void main( ) { unsigned char point; __disable_interrupt(); //запрещаем все прервания глобально OSCCTL = 0xd0; // external clock input mode PCC = 0x40; // CPU clock = fxp MCM = 0x06; // Set main system clock and peripheral hardware clock OSTS = 0x00; // Set minimum oscillation stabilization time //настройки для таймера51, сделано поналогии с Т50 - они аналогичны TMMK51 = 0; //разрешаем прерывания от таймеры Т51 TMC51 = 0x0b; // Инициализация таймера Т1 TCL51 = 0x06; // устанавливаем делитель частоты от относительно тактового генератора CR51 = 35; //Format of Timer Clock Selection Register этой фигней регулируем время возниковения прерывания TCE51 = 1; // Включаем таймер //натройки для входа INTP1 преррвынине PM3_bit.no0=1; //пин на вход PIF1 = 0; // бсрос флага прерывания PPR1 = 1; //приритет обработки прерывания - низкий EGP_bit.no1=0; //настройка прерывания по спаду импульса EGN_bit.no1=1; //настройка прерывания по спаду импульса PMK1 = 0; // INTP1 прерывание разрешено //насторойка для таймера ТМ00 TMC00=0x00; //остановка и обнуление таймера ТМ00 CRC00=0x04; //вкл сравнение с CR000 PRM00 = 2; //пределитель 2 в 8 степени от системного генератора TMMK000 = 0; //разрешаем прерывания от ТМ00 TMPR000 = 1; // низкий приоритет при обработке CR000 = 10000; //настройка интервала, чем цифра больше тем длинее интервал TMC00=0x0C; //пуск таймера ТМ00 __enable_interrupt(); // разрешаем лобально все прервыания point=Line()-5; //настройка направлений пинов отведенные под светодиды PM0_bit.no0=0; // порт на вывод PM0_bit.no1=0; // порт на вывод P0_bit.no0=1; //вкл всетодиод 1 while(1) { Wait(10); P0_bit.no0=!P0_bit.no0; // мигает светиком 1 до упада 1Гц //if(point > Line())P0_bit.no1=1; // если условие верное, то вкл сетодиод 2 временно отключил конроль всетодидом, //else P0_bit.no1=0; // если нет, гасим } } //----------------------------------------------------------------------------- // ISR: // Function: //----------------------------------------------------------------------------- #pragma vector = INTTM51_vect //обработка прерываний от таймера Т51 __interrupt void isr_INTTM51(void) { //P0_bit.no1=!P0_bit.no1; //мигаем всетодидом 2 с частотй 438.9 Гц скважность 50% времено отключил контроль всетодидом TMIF51 = 0; //гасим флаг прерывания } #pragma vector = INTP1_vect //обработка прерываний от внешнего источника от направления INTP1 __interrupt void isr_INTP1(void) // по тылу импульса { //P0_bit.no1=!P0_bit.no1; //для контроля - все работает как часики :) времено отключено PIF1 = 0; //гасим флаг прерывания } #pragma vector = INTTM000_vect //обработка прерываний от ТМ00 при совпадении TM00 и CR000 __interrupt void isr_INTTM000(void) // { P0_bit.no1=!P0_bit.no1; //для контроля - все работает 1.57Гц TMIF000 = 0; //гасим флаг прерывания } 0 Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz. ICQ: 288449055 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexi Опубликовано 7 августа, 2008 Автор Поделиться Опубликовано 7 августа, 2008 Привожу пример работы UART6 и соотв его конфигурации. #include "C:\NEC\inc\io78f0397.h" #include "C:\NEC\inc\defines.h" #include <intrinsics.h> //----------------------------------------------------------------------------- // Option Byte //----------------------------------------------------------------------------- #pragma location = "OPTBYTE" __root const unsigned char opbyte=0x00; //--------------------------------------------------------------------------------- // Security ID CODE: for OCD On-Chip Debugging //--------------------------------------------------------------------------------- #pragma location = "SECUID" __root const unsigned char secuid[11]={0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //----------------------------------------------------------------------------- // Global string constants //----------------------------------------------------------------------------- //Инцициализация приемного массива #define max_rx6 30 //размер буффера для приема данных по UART6 unsigned char rx6[max_rx6]; //инцициализация приемного буффера UART6 unsigned char i_rx6=0; //счетчик для UART6 //переименуем пины под значения //----------------------------------------------------------------------------- // Module: UART_SendChar // Function: Send char via UART6 //----------------------------------------------------------------------------- void UART_SendChar (unsigned char ucData) { TXB6 = ucData; // load UART transmit buffer while(!STIF6); // wait for transmission finished STIF6=0; } //----------------------------------------------------------------------------- // Module: UART_SendString // Function: Send string via UART6 //----------------------------------------------------------------------------- void UART_SendString (char *ucpStr) { unsigned char ucData; while (1) { ucData = (unsigned char)(*ucpStr++); if(ucData) UART_SendChar (ucData); else break; } } void Wait(unsigned char number) { TMC50 = 0x0b; // initialize Timer50 TCL50 = 0x07; // set input clock to fxp / 2^13 = 976 Hz @ 8MHz => 1ms CR50 = 0x32; // set interval time to 50 ms TCE50 = 1; // start Timer50 while(number > 0) { while(!TMIF50); // wait for Timer50 Interrupt request flag TMIF50 = 0; // clear Timer50 interruupt request flag number--; } TCE50 = 0; // stop Timer50 } //функция контроля линии (АЦП5) unsigned char Line() { // initialization of ADC ADM = 0x10; //set conversion time to 192/fx = 24us ADS = 0x05; //select AD channel ADCE = 1; //enable voltage generator ADCS = 1; //start AD converter while(!ADIF); ADIF=0; ADCS = 0; //stop AD converter return (ADCRH); } //функция очистки буффера void clear_rx6() { for(i_rx6=0; i_rx6<max_rx6; i_rx6++) rx6[i_rx6]=0; i_rx6=0; } // С Т А Р Т void main( ) { unsigned char point; __disable_interrupt(); //запрещаем все прервания глобально OSCCTL = 0xd0; // external clock input mode PCC = 0x40; // CPU clock = fxp MCM = 0x06; // Set main system clock and peripheral hardware clock OSTS = 0x00; // Set minimum oscillation stabilization time //настройки для таймера51, сделано поналогии с Т50 - они аналогичны TMMK51 = 0; //разрешаем прерывания от таймеры Т51 TMC51 = 0x0b; // Инициализация таймера Т1 TCL51 = 0x06; // устанавливаем делитель частоты от относительно тактового генератора CR51 = 35; //Format of Timer Clock Selection Register этой фигней регулируем время возниковения прерывания TCE51 = 1; // Включаем таймер //натройки для входа INTP1 преррвынине PM3_bit.no0=1; //пин на вход PIF1 = 0; // бсрос флага прерывания PPR1 = 1; //приритет обработки прерывания - низкий EGP_bit.no1=0; //настройка прерывания по спаду импульса EGN_bit.no1=1; //настройка прерывания по спаду импульса PMK1 = 0; // INTP1 прерывание разрешено //насторойка для таймера ТМ00 TMC00=0x00; //остановка и обнуление таймера ТМ00 CRC00=0x04; //вкл сравнение с CR000 PRM00 = 2; //пределитель 2 в 8 степени от системного генератора TMMK000 = 0; //разрешаем прерывания от ТМ00 TMPR000 = 1; // низкий приоритет при обработке CR000 = 10000; //настройка интервала, чем цифра больше тем длинее интервал TMC00=0x0C; //пуск таймера ТМ00 //Настройка UART6 PM1_bit.no4=1; //input mode for RxD PM1_bit.no3=0; //output mode for TxD P1_bit.no3=1; //set TxD output to high level //initialization for baudrate = 9600 CKSR6 = 0x02; //берем из даташита на конктеную скорость BRGC6 = 109; //аналогично ASIM6 |= 0xE5; //насройка (разрешен прием и передача, 8 бит, 1 стоп-бит) SRPR6=0; //приоритет прерывания - высокий SRIF6=0; //сброс флага SRMK6=0; //разрешаем прерывания POWER6 = 1; //enable internal clock operation //настройка портов PM0_bit.no0=0; // порт на вывод красный всетодиод PM0_bit.no1=0; // порт на вывод зеленый всетодиод red_led=1; //вкл красный светодиод (см в #define стр.24) // разрешаем лобально все прервыания __enable_interrupt(); clear_rx6(); point=Line()-5; //замер напряжения в линии, устанавливает точку сравнения //настройка направлений пинов отведенные под светодиды while(1) { Wait(10); P0_bit.no0=!P0_bit.no0; // мигает светиком 1 до упада 1Гц //if(point > Line())P0_bit.no1=1; // если условие верное, то вкл сетодиод 2 временно отключил конроль всетодидом, //else P0_bit.no1=0; // если нет, гасим UART_SendString("AT\r"); } } //----------------------------------------------------------------------------- // ISR: // Function: //----------------------------------------------------------------------------- #pragma vector = INTTM51_vect //обработка прерываний от таймера Т51 __interrupt void isr_INTTM51(void) { //P0_bit.no1=!P0_bit.no1; //мигаем всетодидом 2 с частотй 438.9 Гц скважность 50% времено отключил контроль всетодидом TMIF51 = 0; //гасим флаг прерывания } #pragma vector = INTP1_vect //обработка прерываний от внешнего источника от направления INTP1 __interrupt void isr_INTP1(void) // по тылу импульса { //P0_bit.no1=!P0_bit.no1; //для контроля - все работает как часики :) времено отключено PIF1 = 0; //гасим флаг прерывания } #pragma vector = INTTM000_vect //обработка прерываний от ТМ00 при совпадении TM00 и CR000 __interrupt void isr_INTTM000(void) // { //P0_bit.no1=!P0_bit.no1; //для контроля - все работает 1.57Гц TMIF000 = 0; //гасим флаг прерывания } #pragma vector = INTSR6_vect //обработка прерываний от UART при приеме байта __interrupt void isr_INTSR6(void) // { if(i_rx6<max_rx6) //выполнять если массив буфера не переполнен rx6[i_rx6++]=RXB6; //помещаем переменую в буффер else SRIF6 = 0; //ничего не делаем и гасим флаг прерывания } Немножко позже приведем дополнение - работа с LCD. 0 Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz. ICQ: 288449055 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.