제가 구현하려는 것은 RS232C를 통하여 값을 받아서 PWM포트 3개이용 각각 값을 써주려고 하는것입니다.
그런데 값들이 제멋대로 들어가네요... if 문 써서 A입력시 몇쓰면 PWM몇에 동작 이렇게 하려는데요...
예를들어 G누르면 else값으로 되서 값을 넣을 시간도 없이 나와버립니다.
만일 asm("cli")를 누르면 들어가는 값이 랜덤으로 가지고 언제 값을 써야될지 모르게 되서 asm("cli")를 썼더니
그나마 낫아 지긴 했습니다.
3개 따로 따로 값을 넣어주는 방법이 없을
까요 제방법이 틀린걸가요 고수님들의 답변 부탁합니다.
program은 codevision 이용했습니다.
//----------------------------------------------------
// mega128 pwm+rs232 test
// xtal: 16MHZ
//----------------------------------------------------
#include <mega128.h>
#include <delay.h>
#include <stdio.h>
//---------------------------------------------------
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FRAMING_ERROR (1<<4)
#define PARITY_ERROR (1<<2)
#define DATA_OVERRUN (1<<3)
WORD k;
//----------------------------------------------------
bit flg;
char stat, data;
interrupt [USART0_RXC] void usart0_rxc(void)
{
stat=UCSR0A; data=UDR0;
if((stat & (FRAMING_ERROR|PARITY_ERROR|DATA_OVERRUN))==0) flg=1;
}
void ledsel_blue()
{
#asm("sei")
if(flg)
OCR1BL=data;
delay_ms(1000);
#asm("cli")
}
void ledsel_green()
{
#asm("sei")
if(flg)
OCR1AL=data;
delay_ms(1000);
#asm("cli")
}
void main(void)
{
UCSR0A =0x0;
UCSR0B = 0b10011000;
UCSR0C = 0b10000110;
UBRR0H = 0;
UBRR0L = 103;
DDRB=0b11100000; //7:OC1C, 6:OC1B, 5:OC1A
DDRD=0b00001010; //3:txd, 2:rxd
TCCR1A=0b10101001; TCCR1B=0b1011;
printf(" 256 RGB -RS232C- TEST");
printf("\n\n\r");
while(1)
{
k = getchar(); // 입력된 내용을 c에 저장함.
// putchar(k); // 방금 친 내용을 모니터에 출력함.
if(k == 'G')
{
ledsel_green();
printf("\n\rGreen Value Input.\n\r");
}
if(k =='B')
{
ledsel_blue();
printf("\n\rBlue Value Input.\n\r");
}
if(k =='R')
{
printf("\n\rRed Value Input.\n\r");
OCR1CL= data;
}
else
printf("\nYou were selected wrong value .!! Re select Please.\n\r");
}
}
보통 이러한 프로그램은 프로토콜로 만듭니다.
아니면 G 가 눌린 후 3개의 입력을 더 받는다던가요.
byte cBuf [ 3 ] ;
while(1)
{
k = getchar(); // 입력된 내용을 c에 저장함.
// putchar(k); // 방금 친 내용을 모니터에 출력함.
if(k == 'G')
{
for ( i=0 ; i<3 ; i++ )
{
cBuf [ i ] = getchar();
}
printf ( " %c %c %c " , cBuf [0] , cBUf [1] , cBuf[2] ) ;
// 위의 cBuf 의 값을 가공해서 아래의 함수로 넣어야 함.
// --------------
ledsel_green();
printf("\n\rGreen Value Input.\n\r");
}
}
void ledsel_green()
{
OCR1AL=data;
}
머 이런 식이랄까요?
아니면 프로토콜로 처리해서 stx 받은다음 etx 받을때까지 버퍼에 시리얼 인터럽트 함수에서 저장해 놓고
메인에서 처리 하는 방법을 가장 많이 사용합니다.
정말 감사합니다.
영혼님 덕분에 살았네요...~!!! 영혼님 쌩유베리감사.
프로토콜 방식은 제가 책도 없고 관련 자료도 없고해서 나중에 해봐야할 것 같습니다.
아무튼 감사합니다.