Jump to content
Lexi

Nec L_line+ Iar

Recommended Posts

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

int main( void )
{
 return 0;
}

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

Выбор подходящего элемента питания, способного обеспечивать требуемый уровень напряжения и выдавать необходимый ток на протяжении всего периода эксплуатации беспроводной пожарно-охранной системы является одной из первостепенных задач. Наиболее подходящим для этих целей элементом являются литий-тионилхлоридные элементы питания, а одним из наиболее конкурентоспособных производителей – компания Fanso, предлагающая своим клиентам продукты как универсальные, так и разработанные специально для решения конкретных задач.

Подробнее...

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Падает 8,5 Вольт при R44 5КОм При R44 200КОм падает 2,6В, При этом на выходе +16,3 Вольт В моем случае 0,18В, 0,79В, 1,4В при R44 5КОм При R44 200КОм - 0,14В, 0,73В, 1,35В. При этом на выходе +16,3 Вольт   Скорее всего. Был вечер и сетевое напряжение сильно гуляло.   Вы имели ввиду R18? На R17 у меня падает 0,82В при R44 5КОм При R44 200КОм все те же 0,8В. При этом на выходе +16,3 Вольт     А со вторым каналом что посоветуете делать, тоже менять или оставить как есть.
    • Автомобильные ланзароподобные видны сразу с полпинка Парень,который привез этот сабвуфер вчера,пояснил что электрики чего то там баловались с подключением и в итоге саб *упал на колени* Я спросил так может предохранитель помер и все? На что он грустно ответил типа я то себя знаю и предохранителем мол никогда в жизни не обходились))) Вам придется его делать. Смех и только. Ну чего,бум ваять
    • А детишки там на кой по садику слоняются?
    • Думаю на фильтрах, шланге и щётках оставляет. Все они такие, те что бытовые. Жрать киловатты горазды, а вот пыль и другой мусор затягивать, не особо. Я когда этот пылесос лет 5 назад выбирал, то проверил штук 6 разных, единственное в чем ступил, не узнал стоимость расходки)) А так, по эффективности уборки и цене, был лучшим вариантом. У меня у родителей есть пылесос витек, у него потребляемая заявляется под 2 квт, а эффективная, в районе 400вт с копейками. В сравнении с моим, он действительно кажется раза в 2 хуже собирает мусор.
    • 15 Вольт как раз и равняется напряжению полностью заряженной 12 Вольтовой батареи (10 банок по 1,5 Вольта). Т.е. батарея заряжается нормально. Цель какая замеров напряжения? Ну а то, что скачет на холостом ходу и при полном заряде - так это зависит от алгоритма заряда батареи, заложенного производителем, который нам неведом.
    • Никак. Вам придётся жить с этим позором до самого конца.  
    • А если встал не с той подруги, то у самца будет плохое настроение
×
×
  • Create New...