BASIC4MCU | 질문게시판 | 답변 : ATmega128 소스 합치기
페이지 정보
작성자 master 작성일2019-08-20 14:48 조회4,369회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=9761
본문
//#include <avr/io.h>#define F_CPU 16000000UL // 16 MHz#include <util/delay.h>#include <stdio.h>//#define TRIG 6 //TRIG: 출력 PA6#define ECHO (PINA&0x80) //ECHO: 입력 PA7//void buz(int c){int i;for(i=0; i<c; i++){ PORTB^=0x10; _delay_ms(1); } // 500Hz}//int main(void){unsigned int distance;DDRB=0x10; //피에조 부저: 출력DDRA=0x40; //TRIG=출력,ECHO=입력while(1){PORTA|=0x40; _delay_us(10); PORTA&=~0x40; //TRIGwhile(!ECHO); TCCR1B=2; TCNT1=0;while( ECHO); TCCR1B=0; distance=TCNT1/116;//if (distance< 50){ buz( 10); } // 5cm 이내 접근 // 10mselse if(distance< 300){ buz(100); } // 30cm 이내 접근 // 100mselse if(distance<1000){ buz(500); } // 1m 이내 접근 // 500ms_delay_ms(100);}}
//#include <avr/io.h>#include <avr/interrupt.h>#define F_CPU 16000000UL // 16 MHz#include <util/delay.h>#include <stdio.h>#include <stdlib.h>#include <string.h>//#define null 0//비교 NMEAunsigned char NAME[10]="$GPGGA"; //NMEA _ GPGGAunsigned char NAME1[10]="$GPGSA"; //NMEA _ GPGSAunsigned char NAME2[10]="$GPRMC"; //NMEA _ GPRMC//UART GPS_DATA 저장unsigned char GPS_DATA[100]; // UART로 받은 데이터 저장unsigned char GPS_DATA1[100]; // GPGGA DATA 피신 저장unsigned char GPS_DATA2[100]; // GPGSA DATA 피신 저장unsigned char GPS_DATA3[100]; // GPRMC DATA 피신 저장//Count 및 flag 변수int GPScnt; // UART로 받은 데이터 저장 COUNTint GPScnt1; // UART COUNT 값 피신 저장int GPSflag;int i;//구간 별로 저장하기 위한 포인터char*GPS_cut=null; // STRTOK 함수 사용을 위한 변수char*GPS_Dcut[15]={ null}; // GPGGA 값을(,)STRTOK 로 나누어 저장char*GPS_Dcut1[15]={ null}; // GPGSA 값을(,)STRTOK 로 나누어 저장char*GPS_Dcut2[15]={ null}; // GPRMC 값을(,)STRTOK 로 나누어 저장// 버퍼저장unsigned char test0[20];unsigned char test1[20];unsigned char test2[20];unsigned char test3[20];//char RX0_CHAR(){ while(!(UCSR0A&0x80)); return UDR0; }void TX0_CHAR(char c){ while(!(UCSR0A&0x20)); UDR0=c; }void TX0_STR(char *s){ while(*s)TX0_CHAR(*s++); }//// $GPGGA,035155.00,3723.19464,N,12656.72748,E,1,06,1.69,47.0,M,18.5,M,,*6F 출력 샘플void GPS_Time(){unsigned char HH,MM,SS; // 시,분,초 저장 변수unsigned long Zulu_time; // GPS_TIEM(USA)저장 변수Zulu_time=atol(GPS_Dcut[1]); // 문자열을 LONG 형 으로 변환 후 저장=>" 035155.00 "HH=((Zulu_time/10000)+9)%24; // +9 로 한국 시 표현MM=((Zulu_time%10000)/100); // 만 나머지 값에 100 나누어 준다.분 표현SS=((Zulu_time%10000)%100); // 만 나머지 값에 백 나머지 값으로 초 표현sprintf(test0,"TIME:%02d:%02d:%02d \r\n",HH,MM,SS);TX0_STR(test0);_delay_ms(500);}//void GPS_Latitude(){ // 위도 는 처음 도분 형태로 들어온다.unsigned char DO,BOON; // 도,분 저장 변수double CHO; // 초 저장 변수double Latitude; // GPS_LATITUDE 값 저장 변수Latitude=atof(GPS_Dcut[2]); // 문자열을 DOUBLE 형 으로 변환후 저장=>" 3723.19464 "DO=Latitude/100; // 도 위치인 37 저장BOON=(int)Latitude%100; // 분 위치인 23 저장CHO=(Latitude-(int)Latitude)*60; // 초 를 구하기 위하여(3723.19464-3723)*60 // 소숫점만 빼내어 60을 곱하면 초로 변환 된다.sprintf(test2,"LATIT:%2d'%2d`%0.02lf%s \r\n",DO,BOON,CHO,GPS_Dcut[3]);TX0_STR(test2);_delay_ms(500);}//void GPS_Longitude(){ // 경도 는 처음 도분 형태로 들어온다.unsigned char DO,BOON; // 도,분 저장 변수double CHO; // 초 저장 변수double Longitude; // GPS_LATITUDE 값 저장 변수Longitude=atof(GPS_Dcut[4]); // 문자열을 DOUBLE 형 으로 변환후 저장=>" 12656.72748 "DO=(int)Longitude/100; // 도 위치인 126 저장BOON=((int)Longitude%100); // 분 위치인 56 저장CHO=(Longitude-(int)Longitude)*60; // 초 를 구하기 위하여(12656.72748-12656)*60sprintf(test3,"LONGI:%3d'%02d`%0.02lf%s \r\n",DO,BOON,CHO,GPS_Dcut[5]);TX0_STR(test3);_delay_ms(500);}//ISR(USART1_RX_vect){unsigned char RX;RX=UDR1;if(RX=='$'){ GPS_DATA[0]='$'; GPScnt=1; GPSflag=0; } // GPS NMEA_code[STX]else{GPS_DATA[GPScnt]=RX; // char 형 DATA RX 를 GPS_DATA 배열에 저장if(GPS_DATA[GPScnt]==0x0a){GPScnt1=GPScnt;if(strncmp(NAME,GPS_DATA,6)==0){ // "$GPGGA"memmove(GPS_DATA1,GPS_DATA,GPScnt1); // 메모리 복사GPS_cut=strtok(GPS_DATA1,","); // STRTOK 구간 나누는 함수for(i=0; GPS_cut!=null; i++){ GPS_Dcut[i]=GPS_cut; GPS_cut=strtok(null,","); }GPSflag=1;}if(strncmp(NAME1,GPS_DATA,6)==0){ // "$GPGSA"memmove(GPS_DATA2,GPS_DATA,GPScnt1);GPS_cut=strtok(GPS_DATA2,",");for(i=0; GPS_cut!=null; i++){ GPS_Dcut1[i]=GPS_cut; GPS_cut=strtok(null,","); }}if(strncmp(NAME2,GPS_DATA,6)==0){ // "$GPRMC"memmove(GPS_DATA3,GPS_DATA,GPScnt1);GPS_cut=strtok(GPS_DATA3,",");for(i=0; GPS_cut!=null; i++){ GPS_Dcut2[i]=GPS_cut; GPS_cut=strtok(null,","); }}}GPScnt++;}}//int main(void){int Position_Fix;int HH,MM,SS,DO,BOON,CHO;UCSR0B=0x18; UBRR0L=103;UCSR1B=0x98; UBRR1L=103;sei();while(1){ // $GPGGA,035155.00,3723.19464,N,12656.72748,E,{ 1},06,1.69,47.0,M,18.5,M,,*6F 출력 샘플Position_Fix=atoi(GPS_Dcut[6]); // position_FIXif(Position_Fix==0){sprintf(test1," Position_Fix LOADING \n\r"); TX0_STR(test1); _delay_ms(1000);}else{ // 0 LOADING,1 위성으로만 계산,2 지상 안테나에서 수신if(GPSflag==1){GPS_Time(); //ms800-4sec delayGPS_Latitude();GPS_Longitude();}}}}
어떻게 합쳤는지 모르겠지만
레지스터가 겹치는 것은 안보입니다.
어떤 레지스터가 문제가 된다고 생각하나요?
댓글 0
조회수 4,369등록된 댓글이 없습니다.