Перейти к содержанию

Nec L_line+ Iar


Lexi

Рекомендуемые сообщения

Всем привет!!!

Предлогаю создать топик, в котором будет рассмотрено поэтапное создание проекта с использованием пакета 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;

Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz.

ICQ: 288449055

Ссылка на комментарий
Поделиться на другие сайты

И так на предыдущий вопрос нашел ответ тут.

Теперь вопрос к Мигрею.

Давай создадим проект, а потом будем его дополнять.

К примеру, создамим с пояснениями все этапы проекта на камне который установлен на демоките линеки L2 udp78f0397.

В проект будут включены:

2 светодиода, организация задержки с примением таймера, мигание светодидов, работа со внутреним драйвером ЖКИ, УАРТ, АЦП и т.д.

Предлогаю начать с ЖКИ+АЦП+2 светодиода. Герератор внутрений 8 МГЦ.

Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz.

ICQ: 288449055

Ссылка на комментарий
Поделиться на другие сайты

Установили IAR.

Запускаем новый проект.

Создание нового проекта->выбор языка (мы вибираем Си)->сохраняем проект (C:\NEC\proekt.ewp).

В результате компилятор выдал нам main.c

int main( void )
{
 return 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

Далее нам надо подключить библиотеку камушка и задать ему конфигурацию.

Я возьму это дело из семплов, которые шли на диске вместе с демокитом.

я имею ввиду, несколько строк написаных вышев первом посте.

Вот что имеем на данный момент.

#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, что эта ошибка означает??

Конечноже буду разбираться паралельно сам.

Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz.

ICQ: 288449055

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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, которая и заставляет линковщик разместить оптибайт в нужном месте и с нужными опциями.

В принципе, теоретически, должны быть модификаторы, которые позволят задать все опции в тексте на Си, без коммандного файла, но большинство этим не заморачивается.

Да и тексты проекта от такого подхода сильно страдают, через пару месяцев сам начинаешь путаться, где, что и как объявил и проинициализировал.

Как советовать, так все чатлане ...

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz.

ICQ: 288449055

Ссылка на комментарий
Поделиться на другие сайты

Для подключения драйвера используем 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"

Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz.

ICQ: 288449055

Ссылка на комментарий
Поделиться на другие сайты

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. Вопрос такой можно ли достать "чистый" драйвер для этих дел?

Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz.

ICQ: 288449055

Ссылка на комментарий
Поделиться на другие сайты

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
  }
}

Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz.

ICQ: 288449055

Ссылка на комментарий
Поделиться на другие сайты

Итак, следующий шаг. Необходимо создать генератор с частотой 440Гц (+/- 5Гц).

Для этого я использовал таймер Т51. Долго пытался увидеть светодиод горящим, а на частотометре увидеть 440. Оказываеться я зыбыл выставить инрертирование светодиода :D :лол:. Итак я получил 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 ровно, но время нет. Надо сдавать проект.

Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz.

ICQ: 288449055

Ссылка на комментарий
Поделиться на другие сайты

Итак добавляем обработку прерывания от внешнего источника по 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;					//гасим флаг прерывания
}

Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz.

ICQ: 288449055

Ссылка на комментарий
Поделиться на другие сайты

Добавил работу 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;					   //гасим флаг прерывания
}

Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz.

ICQ: 288449055

Ссылка на комментарий
Поделиться на другие сайты

Привожу пример работы 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.

Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz.

ICQ: 288449055

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...