📄 tiny.c
字号:
/********************************************************************/
/* TINY H8梡 偍傑偗僾儘僌儔儉 */
/* */
/* 2ms廃婜偱A/D曄姺傪峴偄偦傟傪SCI偵弌椡偟傑偡丅捠怣忦審偼38400bps */
/* 丄8bit挿丄STOP1bit丄僷儕僥傿柍偟丄僼儘乕柍偟偱偡丅 */
/* 僞僗僋偼擇偮丄IDLE僞僗僋偱偁傞MainTask偲丄A/D曄姺抣傪撉傒崬傓 */
/* ADTask偱偡丅幚嵺偵偼2ms偱8ch暘偺曄姺抣傪慡晹僔儕傾儖偱憲傞帠偼 */
/* 弌棃側偄偺偱娫堷偒傪峴偭偰偄傑偡丅 */
/* 仸拲堄両両 */
/* AD曄姺偺僞僀儈儞僌偵僞僀儅乕倁傪巊梡偟偰偄傑偡偑丄偙傟偼奜晹偱 */
/* 僞僀儅乕倁偺弌椡傪ADTRG抂巕偵愙懕偡傞昁梫偑桳傝傑偡丅 */
/********************************************************************/
#include "itron.h" /* HOS-H8梡僿僢僟僼傽僀儖 */
#include "..\..\..\..\..\includes\h83664f.h"
#include "defid.h" /* 僐儞僼傿僊儏儗乕僞乕偑惗惉偡傞ID掕媊僼傽僀儖 */
#include "tiny.h"
#include "comm.h"
/*僔僗僥儉娭悢*/
/*僔儕傾儖娭悢*/
extern void SCI_Init( unsigned char );
extern int SCI_Putc( char );
extern int SCI_Getc( void );
extern void SCI_Puts( char * );
extern int RecByteSize( void );
/********************************************************************/
/* FTIOA弶婜壔張棟 */
/* FTIOA偼僔僗僥儉僞僀儅乕偲偟偰棙梡偡傞 */
/********************************************************************/
/*#pragma section ASM*/
static void FTIOA_Init( void )
{
TW.TMRW.BIT.CTS = 0; /*僇僂儞僞掆巭*/
TW.TCRW.BIT.CCLR = 1; /*僐儞儁傾儅僢僠A偱TCNT傪僋儕傾*/
TW.TCRW.BIT.CKS = 3; /*撪晹僋儘僢僋傪俉暘廃*/
TW.GRA = 1999; /*僐儞儁傾儅僢僠A偺抣傪戙擖*/
TW.TIERW.BIT.IMIEA = 1; /*僐儞儁傾儅僢僠A偱妱崬傒*/
TW.TMRW.BIT.CTS = 1; /*僇僂儞僞摦嶌奐巒*/
}
/********************************************************************/
/* FTIOA妱崬傒張棟 */
/* 僔僗僥儉僞僀儅乕偲偟偰棙梡 */
/********************************************************************/
void FTIOA_Int( void )
{
TW.TSRW.BIT.IMFA = 0; /*妱崬傒忦審偺僋儕傾*/
/* 俷俽偺僞僀儅僴儞僪儔傪僐乕儖 */
__timer_handler();
}
/********************************************************************/
/* TIMERA弶婜壔張棟 */
/* TIMERA偼帪寁梡儀乕僗偲偟偰棙梡偡傞 */
/********************************************************************/
static void TIMERA_Init( void )
{
BYTE c;
c = TA.TMA.BYTE & 0xf0; /*PSW,TCA偺RESET*/
c |= 0x0c;
TA.TMA.BYTE = c;
TA.TMA.BIT.CKSI = 0; /*1昩廃婜偵愝掕*/
IENR1.BIT.IENTA = 1; /*妱崬傒嫋壜*/
}
/********************************************************************/
/* TIMERA妱崬傒張棟 */
/********************************************************************/
void TIMERA_Int( void )
{
IRR1.BIT.IRRTA = 0; /*妱崬傒忦審偺僋儕傾*/
ret_int(); /*妱崬傒偐傜偺暅婣*/
}
/********************************************************************/
/* A/D妱崬傒張棟 */
/* 棳愇偵妱崬傒偱TASK傪婲摦偟偰偦偺TASK偱庢傝崬傒傪峴偆偺偼偒偮偄 */
/* 偩傠偆偐傜(摿偵僗僉儍儞儌乕僪偱屻敿傪僗僞乕僩偝偣傞晹暘)庢傝崬 */
/* 傒傑偱偼妱崬傒偱峴偄惗僨乕僞偺張棟傪TASK偱峴偆丅 */
/********************************************************************/
/*僌儘乕僶儖椞堟偵僶僢僼傽傪愝偗傞*/
unsigned int ad_buf[ 8 ];
#define AN0 0
#define AN1 1
#define AN2 2
#define AN3 3
#define AN4 4
#define AN5 5
#define AN6 6
#define AN7 7
void AD_Int( void )
{
static int count = 0;
unsigned int *ad;
unsigned int *buf;
AD.ADCSR.BIT.ADF = 0; /*曄姺僗僥乕僞僗偺僋儕傾*/
AD.ADCSR.BIT.ADST = 0; /*A/D曄姺掆巭*/
ad = (unsigned int *)&AD.ADDRA;
if( AD.ADCSR.BIT.CH == AN3 ){
AD.ADCSR.BYTE = 0x58 | AN7; /*AN?傪僗僉儍儞儌乕僪偵愝掕丄妱傝崬傒傪嫋壜丄曄姺帪娫偼70僗僥乕僩*/
AD.ADCSR.BIT.ADST = 1; /*A/D曄姺僗僞乕僩*/
buf = &ad_buf[ 0 ];
}
else{
if( ++count == 125 ){ /*500ms廃婜傪憿傞*/
count = 0;
wup_tsk( TID_AD ); /*AD TASK偺嵞奐*/
}
buf = &ad_buf[ 4 ];
AD.ADCSR.BYTE = 0x58 | AN3; /*AN?傪僗僉儍儞儌乕僪偵愝掕丄妱傝崬傒傪嫋壜丄曄姺帪娫偼70僗僥乕僩*/
}
while( ad <= (unsigned int *)&AD.ADDRD ) *buf++ = *ad++ >> 6;
ret_int(); /*妱崬傒偐傜偺暅婣*/
}
/********************************************************************/
/* TIMERV弶婜壔張棟 */
/* A/D曄姺僞僀儈儞僌丄IC偺奜晹偱僐儞儁傾儅僢僠A弌椡抂巕偲 */
/* A/D僩儕僈乕抂巕傪愙懕偟偰抲偔丅 */
/********************************************************************/
static void TIMERV_Init( void )
{
TV.TCRV0.BIT.CMIEA = 0; /*僐儞儁傾儅僢僠A妱崬傒嬛巭*/
TV.TCRV0.BIT.CCLR = 1; /*僐儞儁傾儅僢僠A偱TCNTV傪僋儕傾*/
TV.TCRV0.BIT.CKS = 3; /*僔僗僥儉僋儘僢僋傪128暘廃*/
TV.TCRV1.BIT.ICKS = 1; /*僔僗僥儉僋儘僢僋傪128暘廃*/
TV.TCORA = 249; /*2ms廃婜*/
TV.TCSRV.BIT.OS = 3; /*僐儞儁傾儅僢僠A偱僩僌儖摦嶌*/
TV.TCRV0.BIT.CMIEA = 1; /*僐儞儁傾儅僢僠A妱崬傒嫋壜*/
}
/********************************************************************/
/* TIMERV妱崬傒張棟 */
/********************************************************************/
void TIMERV_Int( void )
{
TV.TCSRV.BIT.CMFA = 0; /*妱崬傒忦審偺僋儕傾*/
AD.ADCSR.BIT.ADST = 1;
ret_int(); /*妱崬傒偐傜偺暅婣*/
}
/********************************************************************/
/* 僗僞乕僩傾僢僾乮旕僞僗僋晹乯 */
/* HOS偵偼main偼懚嵼偣偢傑偢偙偺張棟偑屇偽傟丄僔僗僥儉偺弶婜壔 */
/* TASK偺婲摦側偳傪峴偆丅 */
/********************************************************************/
void start_up( void )
{
/*弶婜壔*/
/*億乕僩儌乕僪儗僕僗僞*/
IO.PMR1.BIT.TXD = 1; /*TXD傪桳岠*/
/*億乕僩1*/
IO.PCR1 = 0xFF; /*億乕僩1偼慡晹弌椡丄壗傕愙懕偝傟偰偄側偄堊*/
/*億乕僩2*/
IO.PCR2 = 0xFF; /*億乕僩2偼僔儕傾儖偱巊梡偡傞丅*/
/*億乕僩5*/
IO.PMR5.BIT.WKP5 = 1; /*ADTRG傪桳岠*/
IO.PCR5 = 0xDF; /*ADTRG偼擖椡*/
/*億乕僩7*/
IO.PCR7 = 0xFF; /*BIT6偼僞僀儅乕V偺弌椡*/
/*億乕僩8*/
IO.PCR8 = 0xDF; /*億乕僩8偼BIT5偺傒擖椡偵偟偰偍偔*/
/*弶婜壔偺廔傢傝*/
FTIOA_Init(); /*僔僗僥儉僞僀儅婲摦*/
/* TIMERA_Init(); /*堦昩廃婜僞僀儅乕偺婲摦*/
SCI_Init( SCI_38400 ); /*捠怣偺弶婜壔*/
vset_tmi( 1 ); /*偙偺娭悢(幚偼儅僋儘)偱1ms娫妘偺帪娫峏怴傪巜掕偡傞*/
/* 僔僗僥儉僒乕價僗奐巒 */
sta_tsk( TID_MAIN, 0 ); /*堦墳儊僀儞娭悢*/
sta_tsk( TID_AD, 0 ); /*AD TASK偺婲摦*/
}
/********************************************************************/
/* Tiny H8 Test儊僀儞儖乕僠儞 */
/* 桪愭弴埵偼嵟掅偵偟偰偁傞偺偱偙偙偱WDT偺僋儕傾傪偡傞偲椙偄 */
/********************************************************************/
void MainTask( INT stcd )
{
/*A/D弶婜愝掕*/
AD.ADCSR.BYTE = 0x58 | AN3; /*AN?傪僗僉儍儞儌乕僪偵愝掕丄妱傝崬傒傪嫋壜丄曄姺帪娫偼70僗僥乕僩*/
/* AD.ADCR.BIT.TRGE = 1; /*ADTRG偐傜偺曄姺傪嫋壜*/
TIMERV_Init(); /*1ms廃婜偺僞僀儅乕偺婲摦丄A/D曄姺偺僞僀儈儞僌偵巊偆*/
/*1ms偱僩僌儖摦嶌傪峴偆偺偱幚嵺偼2ms廃婜偲側傞*/
while( 1 )
{
dly_tsk( 300 );
}
}
/********************************************************************/
/* AD惗僨乕僞張棟偟傑偡 */
/********************************************************************/
static char *itoa( unsigned int value, char *s, int radix );
void ADTask( INT stcd )
{
unsigned int *ad;
char ascbuf[ 16 ];
SCI_Puts( "AD TASK\r\n" );
while( 1 )
{
/*TASK堦扷掆巭*/
slp_tsk();
/*僔儕傾儖弌椡*/
ad = &ad_buf[ 0 ];
while( ad <= &ad_buf[ 7 ] )
{
SCI_Puts( itoa( *ad++, ascbuf, 10 ) );
SCI_Putc( ':' );
}
SCI_Puts( "\r\n" );
}
}
/********************************************************************/
/* itoa */
/* 堷悢value偼尦偺悢帤丄s偼奿擺愭丄radix偼婎悢扐偟10偺傒 */
/* 奿擺愭偼奿擺偡傞偵廩暘側僒僀僘傪帩偮帠 */
/* 嬶懱揑偵偼10byte埲忋偺椞堟傪昁梫偲偡傞丅 */
/* 栠傝抣偼曄姺奿擺愭偺傾僪儗僗 */
/********************************************************************/
static char *itoa( unsigned int value, char *s, int radix )
{
int i;
s[ 0 ] = value / 10000;
value %= 10000;
s[ 1 ] = value / 1000;
value %= 1000;
s[ 2 ] = value / 100;
value %= 100;
s[ 3 ] = value / 10;
s[ 4 ] = value % 10; /*堦偺埵傪寁嶼*/
for(i = 0;i < 5;i++) s[ i ] |= '0'; /*ASCII僐乕僪偵曄姺偟偰僐僺乕*/
s[ 5 ] = '\0'; /*NULL僞乕儈僱乕僞乕傪晅偗偰廔傢傝*/
return s;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -