/*
RTOS를 공부하고자 위 프로프로그램을
작성햇고 실제 보드에서 테스트도 했씀니다
그다음에 uC/OS II 로 RTOS로 포팅할려면 어떤 작업을 해야 하나요 ?
그 다음 작업 순서
1 : http://ucos-ii.com/ 이 사이트로 가서 리얼 타임 커널를 다운로드
받느다 ?
이렇게 시작 하는게 맞나요 ?
누구 이 다음 부터의 작업을 설명 해주실 구세주 안계신가요 ?
초보에 몸부림 을 어느 고수분든지 어여삐 여겨 주시길 ..
그래서 마지막으로 포팅이고 되고 돌아가면
또 다른 초보를 위해 자료 정리 하번 잘해서 자료실에 헌납 할게요...
*/
/*
:==================================================
; FILE : rtos_test.C
; DATA : 2004.3.29
; CPU : t89c51rd2 11.0592MHz
;==================================================
232 속도: 4800 / N / 8 1
LCD RW CONTROL PIN : 사용안함
LCD RS : P2.6
LCD ENB : P1.1
LCD DATA PORT : P0
KEY INPUT : P1.4 - P1.7
TIMER0 : 약 0.0625초 주기로 인터럽트 사용 ?
1: 잔원 를 투입하면
cpu를 초기화 하고 lcd에 " 8051 RTOS TEST "
" Ver0.1________ "
이렇게 표시
2: 'RTOS Test Start' 232로 송신 한다
3: 4초후에 기본 표시메세지를 lcd에 표시
"TIME_CNT: "
"KEY_VAL: : "
// -- 여기서 부터 메인 루틴에 속함 ---
4: key 입력 검사
입력된 키값를 lcd에 3번항 KEY_VAL: 여기: 공간에 표시
5: 232로 수신된 바이트가 있는지 검사
있으면 다음과 같이처리
숫자 1를 수신하면 수신한 카눈터를 lcd에 표시한다
숫자 2를 쉰하면 'RTOS 232TX TEST' 문자를 업로드 한다
숫자1수신 카눈터를 0 으로 클리어하고 LCD에 표시한다
6: 타이머 인터럽트에서 0.03125초 주기로 걸리는 인터럽트를
8번(약 0.25초) 카운터될때 마다 세트 시켜놓은 플래그를 검사
그 카운터된숫자를 LCD에 표시
200번 마다 0으로자동 갱신
*/
#include <89c51rd2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define STX 2
#define ETX 3
#define EOT 4
#define ACK 6
#define NAK 21
#define RX0_MAX_Q_BUF 50
// key value define
#define ent_key 0x1
#define up_key 0x2
#define shift_key 0x4
#define down_key 0x8
// LCD ------------
#define LCD_RS P2_6
#define LCD_E P1_1
#define LCDPORT P0
#define LCD_CUR_OFF 0X0C
#define LCD_CUR_ON 0x0D
#define RS_485 T1
#define TX_ON 1
#define TX_OFF 0
void COM0_putc( unsigned char);
void COM0_puts( unsigned char*);
void lcd_cmd_write( unsigned char);
void lcd_dis_msg_str(unsigned char,unsigned char*);
void lcd_dis_data_str(unsigned char);
bit tx0_rdy;
bit sec_025_fl;
bit key_fl;
data unsigned char T0_INT_CNT;
data unsigned int dis_time_cnt;
data unsigned char rx0_q_head;
data unsigned char rx0_q_tail;
data unsigned char rx0_cnt;
data unsigned char char_buf0;
data unsigned char char_buf1;
data unsigned char char_buf2;
data unsigned char char_buf2;
data unsigned int int_buf0;
data unsigned int int_buf1;
data double double_buf0;
data double double_buf1;
data unsigned long long_buf0;
data unsigned long long_buf1;
/*
;=================================================
; idata 탗킶
;===================================================
*/
/* SYSTEM TOTAL DATA BUF */
idata unsigned char key_cur;
idata unsigned char key_buf;
idata unsigned char key_cnt;
xdata unsigned char rx0_q_buf[RX0_MAX_Q_BUF];
xdata unsigned char tx0_buf[50];
xdata unsigned char rx0_buf[50];
xdata unsigned char dis_buf[32];
code unsigned char ascii_hex_tbl[] = {0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0xA,0xB,0xC,0xD,0xE,0xF};
code unsigned char hex_to_ascii_tbl[] = { "0123456789ABCDEF" };
//-----------------------------------------------------------------------------
// //0123456789012345
code unsigned char logo_msg[] = { " 8051 RTOS TEST "
" Ver0.1________ "};
code unsigned char start_msg[] = { "TIME_CNT: "
"KEY_VAL: : "};
//0123456789012345
code unsigned char shift_key_msg[] = { "SHIFT"};
code unsigned char up_key_msg[] = { " UP"};
code unsigned char down_key_msg[] = { " DOWN"};
code unsigned char ent_key_msg[] = { " ENT"};
/*
;======================================
; timer interrupt 0 service routine
; time intrrupt sycle 0.03125
;--------------------------------------
*/
void T0_int( void ) interrupt 1 using 2
{
TR0=0;
TH0=0x1F;
TL0=0x00;
TR0=1;
++T0_INT_CNT;
if ( T0_INT_CNT == 8)
{
T0_INT_CNT = 0;
sec_025_fl = 1;
}
}
void SCON0_int( void ) interrupt 4
{
if ( RI == 1)
{
RI = 0;
rx0_q_buf[rx0_q_head++] = SBUF;
rx0_q_head %= RX0_MAX_Q_BUF;
}
else
{
TI = 0;
tx0_rdy = 1;
}
}
void init_cpu ( void )
{
IE = 0;
/*
;-------------------------------------------------
; TMOD Register
; 7 6 5 4 3 2 1 0
; GATE C/T M1 M0 GATE C/T M1 M0
; 0 0 1 0 0 0 0 1
; Timer1: baud rate 턻 Timer0:16Bit Timer No Free Scale
*/
TMOD = 0x21;
TH0 = 0x1F;
TL0 = 0x00;
TH1 = 0xF4;
/*
;-------------------------------------------------
; TCON Register
; baud rate 턻 :
; 7 6 5 4 3 2 1 0
; TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
; 0 1 0 1 0 0 0 0
*/
TCON = 0x50;
/*
;--------------------------------------------------------
; SCON Register
; 7 6 5 4 3 2 1 0
; SM0 SM1 SM2 REN TB8 RB8 TI RI
; 0 1 0 1 0 0 1 0
*/
SCON = 0x52;
/*
;--------------------------------------------------------
; IP Register
; 7 6 5 4 3 2 1 0
; - - PT2 PS PT1 PX1 PT0 PX0
; 0 0 0 1 0 0 0 0
*/
PS=1;
/*
;--------------------------------------------------------
; AUXR Register
; 7 6 5 4 3 2 1 0
; - - M0 - XRS1 XRS0 EXTRAM AO
; 0 0 0 0 1 1 0 0
*/
AUXR = 0x0E;
}
void COM0_putc( unsigned char c)
{
while (tx0_rdy == 0);
SBUF = c;
tx0_rdy = 0;
}
void COM0_puts(unsigned char *str)
{
unsigned char i;
for( i=0 ; str[i] != 0 ; i++)
{
while (tx0_rdy == 0);
SBUF = str[i];
tx0_rdy = 0;
if ( str[i] == EOT || str[i] == 10 )
break;
}
}
void delay_40u( void)
{
unsigned int i;
i=0;
while ( i < 120) i++;
}
void delay_160u( void)
{
unsigned char i;
i=0;
for ( i=0; i < 4 ; i++) delay_40u();
}
void lcd_cmd_write(unsigned char CMD)
{
LCD_RS = 0;
LCD_E = 1;
LCDPORT = CMD;
LCD_E = 0;
delay_40u();
}
void lcd_init(void)
{
/* ;LCD CLR: #1 */
lcd_cmd_write( 1 );
delay_160u();
/* ; lcd cur home */
lcd_cmd_write( 2 );
delay_160u();
/*
;-----------------------------------------------------------
; ENTERY MODE SET
;-------------------------------------------------------------
; 04H : CG & DD RAM ADDRESS -1 display no shift
; 05H : CG & DD RAM ADDRESS -1 right shift
; 06H : CG & DD RAM ADDRESS +1 display no shift
; 07H : CG & DD RAM ADDRESS +1 left shift
;-----------------------------------------------------------
*/
lcd_cmd_write( 4 );
/*
;-----------------------------------------------------------
; LCD FUNTION SET
;-----------------------------------------------------------
; func write LCD DATA 8BIT DOT 5X7
;-----------------------------------------------------------
*/
lcd_cmd_write(0x38);
/*
;-----------------------------------------------------------
; LCD display & cur state control
;-----------------------------------------------------------
; 0CH : display ON, CURS OFF,BLK OFF
; 0EH : display ON, CURS ON,BLK OFF
; 0FH : display ON, CURS ON,BLK ON
*/
lcd_cmd_write( 0xC );
}
void lcd_cur_xy( unsigned char lcd_add )
{
LCD_RS=0;
LCD_E=1;
LCDPORT = lcd_add;
LCD_E=0;
delay_40u();
}
void lcd_putc(char lcd_add, char lcd_data)
{
LCD_RS = 0;
LCD_E = 1;
LCDPORT = lcd_add;
LCD_E = 0;
delay_40u();
LCD_RS = 1;
LCD_E = 1;
LCDPORT =lcd_data;
LCD_E = 0;
delay_40u();
}
/*
숫자 stiring 을 표시
lcd_add = lcd start address
----------------------------
lcd_dis_data_str(0x80);
*/
void lcd_dis_data_str( unsigned char lcd_add)
{
unsigned char i,j;
i = j = 0;
while ( lcd_add < 0xD0 )
{
if (dis_buf[i] == 0)
return;
lcd_putc( lcd_add, dis_buf[i] );
lcd_add++;
i++;
if ( lcd_add == 0x90)
lcd_add = 0xC0;
}
}
/*
lcd_dis_msg_str(0x80,start_msg);
*/
void lcd_dis_msg_str( unsigned char lcd_add, unsigned char *lcd_msg_add )
{
unsigned char i,j;
i = j = 0;
while ( lcd_add < 0xD0 )
{
if (lcd_msg_add[i] == 0)
return;
lcd_putc( lcd_add, lcd_msg_add[i] );
lcd_add++;
i++;
if ( lcd_add == 0x90)
lcd_add = 0xC0;
}
}
/*
;******************************************
; KEY INTERFACE
; KEY SCAN 4EA
;==========================================
*/
#define KEY_CNT_SET 100
void key_scan(void)
{
unsigned char key_val;
P1_4 = 1; P1_5= 1; P1_6 = 1; P1_7 = 1;
key_val = P1;
key_val = ~key_val;
key_val = key_val >> 4;
key_val = key_val & 0x0F;
if ( key_val == 0x00)
{
key_cnt = 0;
key_cur = 0;
return;
}
if ( key_cur == key_val)
{
++key_cnt;
if ( key_cnt > KEY_CNT_SET)
{
key_cnt = KEY_CNT_SET;
return;
}
if ( key_cnt == KEY_CNT_SET )
{
key_buf = key_cur;
key_fl = 1;
}
}
else
{
key_cur = key_val;
key_cnt = 1;
}
}
void key_run()
{
key_scan();
if ( key_fl == 0)
return;
key_fl = 0;
switch( key_buf)
{
case ent_key:
lcd_dis_msg_str(0xC8,ent_key_msg);
break;
case down_key:
lcd_dis_msg_str(0xC8,down_key_msg);
break;
case shift_key:
lcd_dis_msg_str(0xC8,shift_key_msg);
break;
case up_key:
lcd_dis_msg_str(0xC8,up_key_msg);
break;
}
}
void rx0_run()
{
unsigned char rx_char;
if ( rx0_q_head == rx0_q_tail)
return;
rx_char = rx0_q_buf[ rx0_q_tail++];
rx0_q_tail %= RX0_MAX_Q_BUF;
switch ( rx_char)
{
case '1':
++rx0_cnt;
rx0_cnt %= 100;
break;
case '2':
sprintf(tx0_buf,"RTOS 232TX TEST");
tx0_buf[15] = 13;
tx0_buf[16] = 10;
tx0_buf[17] = 0;
rx0_cnt = 0;
COM0_puts(tx0_buf);
break;
}
sprintf(dis_buf,"%02d",(unsigned int)rx0_cnt);
dis_buf[2] = 0;
lcd_dis_data_str(0xCE);
}
void timer0_run()
{
/* 약 0.25초마다 한번 실행 */
if ( sec_025_fl == 1)
{
++dis_time_cnt;
dis_time_cnt %= 200;
sprintf(dis_buf,"%5d",dis_time_cnt);
lcd_dis_data_str(0x89);
sec_025_fl = 0;
}
}
/*
;=================================================
; MAIN PROGRAM START
;==================================================
*/
void main(void)
{
init_cpu();
CKCON=0x1;
for (char_buf0 =0; char_buf0 < 20; char_buf0++)
delay_160u();
lcd_init();
lcd_dis_msg_str(0x80,logo_msg);
ET0 = 1;
ES = 1;
EA = 1;
// 약 4초간 시작 메세지 표시
char_buf0 = 0;
sec_025_fl = 0;
T0_INT_CNT = 0;
sprintf(tx0_buf,"RTOS Test Start");
tx0_buf[15] = 0;
COM0_puts(tx0_buf);
lcd_dis_msg_str(0x80,logo_msg);
while ( char_buf0 < 16)
{
if ( sec_025_fl)
{
sec_025_fl = 0;
++char_buf0;
}
}
lcd_dis_msg_str(0x80,start_msg);
while( 1 )
{
key_run();
rx0_run();
timer0_run();
}
}
정리를 못하고 출장 가야하내요
내 갔다와서 저녁에라도 보기편하게 정리해보겟읍니다
카페 게시글
초보게시판
초보 에 몸부림...꼭한번 봐주세요..
북마크
번역하기
공유하기
기능 더보기
다음검색