정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

avr atmega128 사용하여 숫자받기
유선우 | 2017-11-27

안녕하세요 저는 일단 앱인벤터를 이용하여 텍스트 형식으로 rgb 값을 0~255로 받아 예를 들면 255,34,9 처럼 블루투스로 보낼 수 있습니다.

하지만 이 값을 avr  atmega128을 통해 읽고 이걸로 pwm을 제어하여 rgb led를 제어하려고 하는데

제가 부족한 탓인지 선언부가 잘 못 된건지 1자리 수의 문자만char 하나만 인식하고 배열도 안되네요...

#include <avr/io.h>
#define F_CPU 16000000UL // 16 MHz
#include <util/delay.h>
void setColor(int r,int g,int b){ OCR1A=r; OCR1B=g; OCR1C=b; }
unsigned char RX1_char_scan(void)        // 수신버퍼의 데이터 전달함수
{
    if((UCSR1A & 0x80) == 0x00)           // RXC1 = clear : 수신버퍼에 데이터가 없으면
    return 0x00;                           // null 반환
    
    else                                    // RXC1 = set : 수신버퍼에 데이터가 있으면
    return UDR1;                          // 수신 데이터 반환
}

void rx_string(char *str)
{
int a=0;
while((str[a]=RX1_char_scan())!='\n');
{
a++;
}
str[a]='\0';
}

void TX1_char(unsigned char data)         // 데이터 송신함수
{
    while((UCSR1A & 0x20) == 0x00);        // UDRE1 = set되어 송신데이터 받을 준비가 되면
    UDR1 = data;                           // 데이터를 UDR1으로.
}
void TX1_string(char *string)            // 문자열 전달함수
{                                         // *string 포인터가 문자열파라매터의 첫 글자 주소를 가르킨다.
    while(*string !='\0')                  // 문자열의 끝(null)이 올때까지 이하내용을 수행
    {
        TX1_char(*string);
        string++;                         // 주소값을 증가시켜 다음문자열 가르킴
    }
}
int main()
{
 
  int i,color,ratio; float f;
  DDRB=0xE0;   // PB5(r),PB6(g),PB7(b) out
  TCCR1A=0xFE; TCCR1B=0x1A; ICR1=255; 
  char data[6];
    unsigned char RXD;
    DDRC = 0xFF;
    
        
    // --------------- UART 1 관련 레지스터 설정 --------------------
    UBRR1H = 0;
    UBRR1L = 103;         // BUADRATE 결정 103 : 9600 BUAD  송수신 속도 결정
    UCSR1A = 0x00;
    UCSR1B = 0x18;        // RxDn, TxDn pin ENABLE
    UCSR1C = 0x06;        // Parity check disable, 1 stop, 8 data
    RXD = UDR1;           // dummy data read
    
    TX1_string("Bluetooth Communication Test");        // 수신 문자열
    TX1_char(0x0D);                    // 아스키 문자 CR(CARRIGE RETURN : 커서를 처음으로) 전송
    TX1_char(0x0A);                    // 아스키 문자 LF(LINE FEED : 그다음줄로..) 전송
   
  while(1)
{
    RXD = RX1_char_scan();
 rx_string(data);
    if(!strcmp(data, "on"))
 {
 setColor(200,0,0);
 TX1_string("Light ON");
 }
     
  }
}
이전글   |    앱인벤터와 블루투스 2017-11-27
다음글   |    rc522 릴레이 질문 2017-11-28