BASIC4MCU | 질문게시판 | 답변 : 앱인벤터에 값을 표기하는데 앞에 ( 가 붙는데 떼고 싶습니다.
페이지 정보
작성자 master 작성일2019-12-11 23:00 조회7,052회 댓글3건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=11146
작성일
작성일
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-12-11 오후 11:00:17// by Ok-Hyun Park#define F_CPU 8000000UL#define __DELAY_BACKWARD_COMPATIBLE__#include <avr/io.h>#include <util/delay.h>char c;//void USART_Init(unsigned int ubrr);void USART_TX(unsigned char data);unsigned char USART_RX();void USART_Flush();unsigned char CHKchar();//void RC_Motor(int angle){ // angle:-90도~+90도int i;if(angle<-90)angle=-90;if(angle> 90)angle= 90;i=(angle)*10+1499;OCR1A=i; //PB5}//void USART_Init(unsigned int ubrr){UBRR1H=(unsigned char)(ubrr>>8);UBRR1L=(unsigned char)ubrr;UCSR1B=(1<<RXEN1)|(1<<TXEN1);UCSR1C=0x06; // UART Mode,8 Bit Data,No Parity,1 Stop Bit}//void USART_TX(unsigned char data)// Transmit{while(!(UCSR1A&(1<<UDRE1)));UDR1=data;}//unsigned char USART_RX()// Receive{while(!(UCSR1A&(1<<RXC1)));return UDR1;}//unsigned char CHKchar(){if(UCSR1A&(1<<RXC1))//수신 문자가 있으면 1return(1); //1 리턴elsereturn(0);}//void USART_Flush()// Flush{unsigned char dummy;while(UCSR1A&(1<<RXC1))dummy=UDR1;}//int main(){unsigned int num[10][8]={{ 0x18,0x24,0x24,0x24,0x24,0x24,0x24,0x18},// 0{ 0x3E,0x08,0x08,0x08,0x08,0x28,0x18,0x08},// 1{ 0x7E,0x20,0x10,0x08,0x04,0x42,0x42,0x3C},// 2{ 0x3C,0x42,0x02,0x02,0x3C,0x02,0x42,0x3C},// 3{ 0x08,0x08,0x08,0xFF,0x48,0x28,0x18,0x08},// 4{ 0x7C,0x02,0x02,0x02,0x7C,0x40,0x40,0x7E},// 5{ 0x3C,0x42,0x42,0x42,0x7C,0x40,0x42,0x3C},// 6/{ 0x04,0x04,0x04,0x04,0x04,0x24,0x24,0x3C},// 7{ 0x3C,0x42,0x42,0x42,0x3C,0x42,0x42,0x3C},// 8{ 0x3C,0x42,0x02,0x02,0x3E,0x42,0x42,0x3C} // 9};unsigned char Dot_Com[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};unsigned char Tem_tx[]="0123456789";int sec,j;unsigned char ADCresult;DDRA=0xFF;DDRB=0x20;DDRC=0xFF;DDRD=0xFF;ADMUX=0xE0; //REFS 11: Internal 2.5v w/ ext.capacitor//ADLAR 1: Left adjust ena.//MUX 00000: select ADC0(No gain)ADCSR=0xA7; //ADEN 1: Enable//ADSC 0: Start Conversion//ADFR 1: Free Running Select//ADIF 0: Interrupt Flag//ADIE 0: Interrupt Ena.//ADPS 111: Prescaler 128ADCSR|=0x40; //0100 0000: Start ConversionTCCR1A=0x82;TCCR1B=0x1A;OCR1A=1499;ICR1=19999;USART_Init(12);while(1){while((ADCSR&0x10)==0); //0001 0000: Interrupt Flag 0->1ADCSR|=0x10; // ADCF 비트 클리어ADCresult=ADCH; // 변환 결과를 읽음for(sec=0; sec<10; sec++){for(j=0; j<8; j++){PORTC=(num[ADCresult%100/10][j]);PORTD=num[ADCresult%10][j];PORTA=Dot_Com[j];USART_TX(Tem_tx[ADCresult/10%10]);USART_TX(Tem_tx[ADCresult%10]);USART_TX('\r');USART_TX('\n');_delay_ms(1);}}if(!CHKchar())//CHKchar=0 일때(수신 문자가 없을때){continue;}c=USART_RX();if(c=='1'){ RC_Motor(90); _delay_ms(1); }if(c=='2'){ RC_Motor( 0); _delay_ms(1); }}}
//
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-12-12 오전 7:03:13// by Ok-Hyun Park//#define F_CPU 16000000UL#define __DELAY_BACKWARD_COMPATIBLE__#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>#include <stdio.h>//volatile unsigned char num[10][8]={{0x18,0x24,0x24,0x24,0x24,0x24,0x24,0x18},// 0{0x3E,0x08,0x08,0x08,0x08,0x28,0x18,0x08},// 1{0x7E,0x20,0x10,0x08,0x04,0x42,0x42,0x3C},// 2{0x3C,0x42,0x02,0x02,0x3C,0x02,0x42,0x3C},// 3{0x08,0x08,0x08,0xFF,0x48,0x28,0x18,0x08},// 4{0x7C,0x02,0x02,0x02,0x7C,0x40,0x40,0x7E},// 5{0x3C,0x42,0x42,0x42,0x7C,0x40,0x42,0x3C},// 6{0x04,0x04,0x04,0x04,0x04,0x24,0x24,0x3C},// 7{0x3C,0x42,0x42,0x42,0x3C,0x42,0x42,0x3C},// 8{0x3C,0x42,0x02,0x02,0x3E,0x42,0x42,0x3C} // 9};//volatile unsigned char aVal=0,flag=0;//char USART_RX(){ while(!(UCSR1A&0x80)); return UDR1; }void USART_TX(char d){ while(!(UCSR1A&0x20)); UDR1=d; }void USART_STR(char *s){ while(*s)USART_TX(*s++); }//void RC_Motor(int angle){ OCR1A=angle*20+1200; } //PB5 // angle:0~180도//ISR(TIMER0_COMP_vect){ // 1mssratic char c=0;PORTA=0; // 매트릭스 OFF//aVal=ADCH;aVal=(unsigned char)((float)aVal*0.09765625); // 0~255 -> 0~99 // 100.0/1024.0=0.09765625//PORTC=num[aVal/10][c]; PORTD=num[aVal%10][c]; PORTA=1<<c; // 매트릭스 ONif(++c>7)c=0;}//ISR(TIMER3_COMPA_vect){ flag=1; } // 1sec//int main(){char c,str[30];DDRA=0xFF; DDRB=0x20; DDRC=0xFF; DDRD=0xFF;TCCR1B=0x1A; TCCR1A=0x82; OCR1A=2999; ICR1=39999;TCCR0=0x0C; OCR0=249; TIMSK=0x02; // 16000000/64/(1+249),1msTCCR3B=0x0D; OCR3A=15624; ETIMSK=0x10; // 1secUCSR1B=0x18; UBRR1L=103; // 9600 @16MHzADMUX=0xE0; ADCSR=0xE7;SREG=0x80;while(1){if(flag){ flag=0; sprintf(str,"%02d\r\n",a); USART_STR(str); } // 1sec마다 출력//if(UCSR1A&0x80){ // 수신이 있으면c=USART_RX();if(c=='1')RC_Motor(180);if(c=='2')RC_Motor( 90);}}}이 소스는 16MHz로 작성한 것입니다.
퓨즈비트 설정을 하지 못해서 내부 8MHz 클럭으로 실행하고 있는 것 같은데요
퓨즈비트 설정을 공부해서 16MHz로 구동해야합니다.
내부클럭은 오차가 커서 비동기 UART 통신처럼 정밀한 클럭을 요구하는 경우에 문제가 생깁니다.
질문 소스도 이 때문에 보레이트를 아주 느리게 동작시키고 있는 것입니다.
퓨즈비트 설정을 제대로 해서 외부 X-TAL로 구동하면 115200 보레이트로 구동해도 에러없이 잘 전달 됩니다.
댓글 3
조회수 7,052어려운AVR님의 댓글
어려운AVR 작성일unsigned int Tem_tx[]="0123456789"; 가 적용이 안됩니다.
master님의 댓글
master
char Tem_tx[]="0123456789";
데이터형을 수정하면 됩니다.
master님의 댓글
master
답글 하단에 소스와 내용을 추가했으니 참고하세요