• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
Lexi

Nec L_line+ Iar

13 сообщений в этой теме

Lexi    0

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

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

Поделиться сообщением


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Lexi    0

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lexi    0

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

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

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

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

int main( void )
{
 return 0;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lexi    0

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Migray    5

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lexi    0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lexi    0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lexi    0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lexi    0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lexi    0

Итак, следующий шаг. Необходимо создать генератор с частотой 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 ровно, но время нет. Надо сдавать проект.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lexi    0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lexi    0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lexi    0

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

Поделиться сообщением


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас