BASIC4MCU | 질문게시판 | 답변 : 답변 : 답변 : 도어락 제작중 소스 질문드립니다.
페이지 정보
작성자 Board 작성일2019-04-07 20:21 조회8,008회 댓글1건본문
자꾸 여쭤봐서 죄송하네요ㅜㅜ
혼자힘으로 하다가 타이머 3 으로도 바꿔서 해봐도 에코신호받는 함수만 무한루프 안에 넣으면 작동을안해서
트리거와 에코핀을 PORTD의 0,1 핀으로 바꿨습니다.
그랬더니 작동은 되는데 이번엔 통신이 안되고 또 다른기능은 작동을 하다가 멈추네요
초음파로 10센치 안으로 감지되면 모터가 -90도가 되는 코딩을 하고싶은데 쉽지않네요...
여러가지 방법들을 찾아서 따라하다보니 소스가 정신없는점 양해부탁드립니다.
또다시 도움요청드립니다 ㅜㅜ
또 아트메가128의 VEXT를 lm35, 초음파센서 ,SG90 의 VCC로 사용중인데 센서가 많이져서 생기는 오류일까요..?
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//
#define ClockSpeed 4 //0번 타이머 클록 분주값 설정,4=>64 분주비,1클록 당 4us
#define F_CPU 16000000UL
#include <util/delay.h>
//
#define NULL 0
//
#define Trigger_ON PORTD|=1 //초음파 트리거 PE0 ouput Trigger
#define Trigger_OFF PORTD&=~1
#define Echo (PIND&2) //초음파 에코 PE1 input Echo
//
char s[30];
unsigned int range;
volatile unsigned char cm=0,fnd_buf[4]={0,};
volatile unsigned char adc_flag=0,key_flag=0,trig_flag=0,step_flag=0;
volatile unsigned int adc_t=0,key_t=0,trig_t=0,step_t=0;
//
char RX0_char(){ while(!(UCSR0A&0x80)); return UDR0; }
char RX1_char(){ while(!(UCSR1A&0x80)); return UDR1; }
void TX0_char(char c){ while(!(UCSR0A&0x20)); UDR0=c; }
void TX1_char(char c){ while(!(UCSR1A&0x20)); UDR1=c; }
void TX0_STR(char*s){ while(*s)TX0_char(*s++); }
void TX1_STR(char*s){ while(*s)TX1_char(*s++); }
//
char KeyScan(){
char KeyBuf=0xFF;
DDRC=0; PORTC=0xFF;
//
DDRC=0x10; PORTC&=~0x10; _delay_us(1);
if(!(PINC&1))KeyBuf='0'; if(!(PINC&2))KeyBuf='1'; if(!(PINC&4))KeyBuf='2'; if(!(PINC&8))KeyBuf='3';
DDRC=0; PORTC=0xFF;
//
DDRC=0x20; PORTC&=~0x20; _delay_us(1);
if(!(PINC&1))KeyBuf='4'; if(!(PINC&2))KeyBuf='5'; if(!(PINC&4))KeyBuf='6'; if(!(PINC&8))KeyBuf='7';
DDRC=0; PORTC=0xFF;
//
DDRC=0x40; PORTC&=~0x40; _delay_us(1);
if(!(PINC&1))KeyBuf='8'; if(!(PINC&2))KeyBuf='9'; if(!(PINC&4))KeyBuf=0x3A; if(!(PINC&8))KeyBuf=0x3B;
DDRC=0; PORTC=0xFF;
//
DDRC=0x80; PORTC&=~0x80; _delay_us(1);
if(!(PINC&1))KeyBuf=0x3C; if(!(PINC&2))KeyBuf=0x3D; if(!(PINC&4))KeyBuf=0x3E; if(!(PINC&8))KeyBuf=0x3F;
DDRC=0; PORTC=0xFF;
//
return KeyBuf;
}
//
void RC_Motor(int angle){ int i; i=(angle)*20+2999; OCR1A=i; }
//
void getEcho(void){
Trigger_ON; _delay_us(10); Trigger_OFF; // 10uS
while(Echo==0); TCNT3=0; TCCR3B=2; while(Echo);
TCCR3B=0; range=TCNT3/116; // the range in CM
}
//
ISR(TIMER0_COMP_vect){ // 1ms
char fnd_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
static char fnd_cnt=0;
//
PORTB=0xFF;
switch(fnd_cnt){
case 0: PORTA=fnd_table[fnd_buf[0]]; PORTB=~1; break;
case 1: PORTA=fnd_table[fnd_buf[1]]; PORTB=~2; break;
case 2: PORTA=fnd_table[fnd_buf[2]]|0x80; PORTB=~4; break;
case 3: PORTA=fnd_table[fnd_buf[3]]; PORTB=~8; break;
}
if(++fnd_cnt>3)fnd_cnt=0;
//---------------------------------------------
if(++trig_t>=100){ trig_t=0; trig_flag=1; }
if(++adc_t>=100){ adc_t=0; adc_flag=1; }
if(++key_t>=200){ key_t=0; key_flag=1; }
if(++step_t>=1000){ step_t=0; step_flag=1; }
}
//--------------------------------------------------------------------------------------
int main(void){
unsigned int range;
unsigned char Step[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
char key,old,str[50]; int i,k,t=0,temperature,data0,val=0; float result;
//
DDRA=0xFF; DDRB=0xFF; DDRG=0xFF; DDRD=0x01;
TCCR0=0x0C; OCR0=249; TIMSK|=0x02; // 16000000/64/(1+249)=1000Hz=1ms
UCSR0A=2; UCSR0B=0x18; UBRR0L=16; // 115200
UCSR1A=2; UCSR1B=0x18; UBRR1L=16;
TCCR1A=0xAA; TCCR1B=0x1A; OCR1A=2999; ICR1=39999;
ADMUX=0x40; ADCSRA=0xE7;
old=KeyScan();
SREG=0x80;
while(1){
getEcho();
if(key_flag){ key_flag=0;
key=KeyScan();
if((old!=key)&&(key!=0xFF)){
if((key>=0x30)&&(key<=0x3F)){ for(i=2; i>=0; i--)fnd_buf[i+1]=fnd_buf[i]; fnd_buf[0]=key&0x0F; }
}
old=key;
//
if(old=='1'){
TX0_STR("Door's Open\n"); PORTG=1; RC_Motor(90); _delay_ms(1000);}
}
else if(old=='2'){ RC_Motor(-90); PORTG=0; TX0_STR("Door's Close\n"); }
else if(old=='5'){ PORTG=0x02; TX0_STR("Relay's Close\n"); }
else if(old=='6'){ PORTG=0x00; TX0_STR("Relay's Open\n"); }
}
//----------------------------------------------------------
if(adc_flag){ adc_flag=0;
temperature=ADC;
result=temperature*500.0/1023.0;
sprintf(str,"temperature%4.2f\r\n",result); TX1_STR(str);
_delay_ms(100);
}
//----------------------------------------------------------
//----------------------------------------------------------
if(step_flag){ step_flag=0;
if(UCSR1A&0x80){
data0=UDR1;
if(data0=='a')PORTG=0xFF;
if(data0=='b')PORTG=0x00;
for(k=0; k<24; k++){ PORTB=Step[t]; if(++t>7)t=0; _delay_ms(10); }
}
}
}
댓글 1
조회수 8,008Board님의 댓글
Board 작성일작동을 하다가 JMOD128 모듈의 통신선택 스위치를 SPI 에서 UART로 바꾸면 작동을 멈춰버립니다 ㅜ...