BASIC4MCU | 질문게시판 | 도어락 제작중 소스 질문드립니다.
페이지 정보
작성자 Board 작성일2019-04-06 19:33 조회9,514회 댓글1건본문
온도측정+도어락을 제작중에 있습니다.
현재 안드로이드 핸드폰이없어서 컴퓨터와 통신중이구요
여러 질문도드리고 예제 참고해서 잘 나가다가 한번 디버깅이 막히더니 도저히 진도가 안나가서 질문드립니다.
문을 열았다가 닫았을떄 초음파센서에 3cm이하로 감지되면 자동으로 닫히는 코딩을 만드려고합니다
추가로 비밀번호를 설정하고 일치시에 문이 열리게 하고싶은데 배열 사용해서 하면 될까요?
PORTA는 FND
PORTB 0~4 : FND
PORTB 5 : SG-90(서보모터)
PORTC = 4*4 키패드
PORTE = 초음파센서 (HC-SR04)
PORTG 0 = 부저
PORTG 1 = 릴레이
PORTF 0 = LM35
JMOD128 사용중이고 JMOD bt 블루투스모듈 장착중입니다.
다른기능 모두 잘되다가 전에 코딩했던 초음파센서를 추가하면서 전기능이 마비되었습니다.
타이머카운터 0번과 1번이 모두 키스캔이랑 모터로 사용중이여서 2번으로 바꿔서 사용했는데
아무래도 거기서 문제가 발생한거같습니다.
지식이 많이 부족해서 어떤식으로 사용해야하는지 도움 요청드립니다.
#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
//
unsigned char count; // 거리 저장 변수
char fnd_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //캐소드
unsigned char fnd_cnt=0,fnd_buf[4]={0,};
unsigned char Step[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
char adc_flag=0,str[50];
double ADC_F;
int ADC_I,i,data0,val=0;
//
char RX0_char(void){ while(!(UCSR0A&0x80)); return UDR0; }
char RX1_char(void){ 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++); }
//
ISR(TIMER2_COMP_vect)
{
count+=1;
}
//
char KeyScan(void){
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;
}
//
ISR(TIMER0_COMP_vect){
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;
//
val=ADC; adc_flag=1;
}
//
void RC_Motor(int angle){
int i;
i=(angle)*20+2999;
OCR1A=i;
}
//------Ultrasonic Sensor-----------------------------------------------------//
void trig(void)// triger 핀에 초음파 발생 신호를 보냄
{
PORTE|=0x01;
_delay_us(10); // trig에 최소 10us 공급
PORTE&=~0x01;
}
//
void waitPulse(void)// 되돌아 오는 초음파를 받아들임
{
while(!(PINE&0x02));
//초음파를 입력받으면 echo핀이 high 유지
trigOn();
while(PINE&0x02);
// 초음파를 전부 다 받고 수신되는 것이 없으면 LOW 유지
trigOff();
}
//
void trigOn(void)//timer0 on
{
TCNT2=0x00;
TCCR2|=(ClockSpeed<<CS20); //타이머 카운터 시작
}
//
void trigOff(void)//timer0 off
{
TCCR2&=~(ClockSpeed<<CS20); //타이머 카운터 정지
}
//
void timerSet(void)//timer setting
{
TCCR2=(0x01<<WGM21); // CTC mode(OCR과 비교일치시 초기화)
TIMSK=(0x01<<OCIE0); //출력 비교일치 인터럽트 사용
OCR2=14; // pulse width(us)/58=distance(cm)4us*14=56us,약간의 오차 존재
}
//--------------------------------------------------------------------------------------
int main(void){
int i,k,t=0,temperature; float result; char key,old; int countsave=0;
DDRA=0xFF; DDRB=0xFF; DDRG=0xFF; DDRE=0x01;
TCCR0=0x0C; OCR0=249; TIMSK=2; //16000000/64/(1+249)=1000Hz=1ms
ADMUX=0x40; ADCSRA=0xE7;
UCSR0A=2; UCSR0B=0x18; UBRR0L=16; // 115200
UCSR1A=2; UCSR1B=0x18; UBRR1L=16;
TCCR1A=0xAA;
TCCR1B=0x1A;
OCR1A=3000;
ICR1=39999;
SREG=0x80;
old=KeyScan();
//--------Ultrasonic sensor-----------------
timerSet(); // 타이머 기능 초기화
sei(); // 전역 인터럽트 허용
while(1){
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')
{
RC_Motor(90);
PORTG=0x01;
sprintf(str,"Door's Open\n"); TX0_STR(str);
_delay_us(10);
if(countsave<=5)
{
PORTG=0x00;
RC_Motor(-90);
_delay_us(10);
}
}
else if(old=='2')
{
RC_Motor(-90);
PORTG=0;
sprintf(str,"Door's Close\n"); TX0_STR(str);
_delay_us(10);
}
if(old=='5')
{PORTG=0x02;
sprintf(str,"Relay's Close\n"); TX0_STR(str);
_delay_us(10);
}
if(old=='6')
{PORTG=0x00;
sprintf(str,"Relay's Open\n"); TX0_STR(str);
_delay_us(10);
}
if(adc_flag){ adc_flag=0;
temperature=val;
result=temperature*500.0/1023.0;
sprintf(str,"temperature%4.2f\r\n",result); TX1_STR(str);
sprintf(str,"temperature%4.2f\r\n",result); TX0_STR(str);
_delay_ms(100);
}
//
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); } _delay_ms(1000);
}
}
}
}
댓글 1
조회수 9,514master님의 댓글
master 작성일
타이머를 잘 모르시는 것 같고
트리거를 쏘는 곳과 에코를 받는 코드가 없습니다.