BASIC4MCU | 질문게시판 | avr studio, (atmega128) lcd랑 키패드 질문드립니다!!
페이지 정보
작성자 leesk 작성일2018-12-17 16:57 조회11,991회 댓글5건본문
제가 지금 스위치 몇개랑 모터, lcd, 키패드, fnd, 초음파센서 를 다 연결해서 사용하는 걸 만들고 있는데
처음에는 초음파 센서랑 키패드 둘다 while문으로 돌게 해서 서로 꼬여서 동작이 안되는줄 알았으나
그부분은 얼추 해결이 된듯한데
그다음 문제가 lcd에 출력을 시키면 mcu_initialize() 인가 하는 명령에서 (외부 뭐시기였는데.....)
오류가 나는지 키패드는 계속 동작을 하고 lcd는 처음 딱 한번 돌고 그대로 멈춰버립니다
초음파가 업데이트가 안되는것인지는 led를 써서 확인해 보려고 하고 있는데 만약 lcd문제라면 어떻게 해결해야할지 감이 안와서 자문 남깁니다!ㅠㅠ
지금까지 짠 코드를 올리는게 문제해결에 좀 더 도움이 될까요?ㅜ
댓글 5
조회수 11,991master님의 댓글
master 작성일회로도 및 전체소스코드 등 필요한 자료를 첨부해야합니다.
leesk님의 댓글
leesk 작성일
// PASSWORD HW + sonic - KEYPAD PORTC, FND PORTA & PORTE FIX INITIALIZE -ING ver.//////////////////////////////////////////////////////
/*
#include "test.h" // 기본 위치에 두도록
#include "lcd.h" //
#define TIMER8_INTERVAL 125 // for 1msec at 8MHz , 0.5 msec at 16MHz
#define F_CPU 16000000UL
#define time 500
#include <avr/io.h>
#include <util/delay.h>
#define Trigger_1 PORTF|=1 //초음파 트리거
#define Trigger_0 PORTF&=~1 //초음파 트리거
#define Echo (PINF&2) //초음파 에코
unsigned char x[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ; //0,1,2,3,4,5,6,7,8,9
unsigned char open[] = {0xbf, 0xc0, 0x8c, 0x84, 0xc8} ; //{-,o,p,e,n}
unsigned char bar[] = {0xf7,0xf7,0xf7,0xf7,0xf7} ; // {_}
unsigned char z[5] = {0x08, 0x04, 0x02, 0x01} ; //출력 순서
unsigned char s[5] ;
unsigned char pw[5] = {0xf7,0xf7,0xf7,0xf7,0xf7};
unsigned char pwo[5] = {0xf7,0xf7,0xf7,0xf7,0xf7};
unsigned int range;
void OpenOutput(int b);
void MakeInputC(int c);
void MakeInputD(int d);
void MakeInputE(int e);
void MakeInputF(int f);
void SaveTobar(int g);
void MakePW(int h);
void BarOutput(int i);
void PassWord(int y);
void getEcho(void);
void ActiveSonic(void);
int password = 0;
int check=0;
int main()
{
// sonic part
DDRF=1; // PF0 ouput Trigger, PF1 input Echo
TCCR1A=0; TCCR1B=8; // CTC mode
// MCU_initialize();
// _delay_ms(50);
lcd_init();
// keypad
DDRC = 0xF0;
PORTC = 0x0F;
DDRE = 0xFF ;
DDRA = 0x1F ;
PORTA &= 0xE0 ;
for(int j = 0 ; ; j++)
{
// sonic
ActiveSonic; //이게문제가 아님 이니셜라이즈가 문제인듯
//keypad
int k = j % 4 ;
PORTA = z[k] ;
if(check == 0) PORTE = pw[k] ;
_delay_ms(5) ;
if(password != 1234)
{
if(pw[3]==0xf7)
{
// first column
PORTC = 0b01111111; if (!bit_is_set(PINC, 3)) MakeInputC(1) ;
// second column
PORTC = 0b10111111; if (!bit_is_set(PINC, 3)) ;
if (!bit_is_set(PINC, 2)) MakeInputC(0) ;
// third column
PORTC = 0b11011111; if (!bit_is_set(PINC, 3)) MakeInputC(9) ;
if (!bit_is_set(PINC, 2)) MakeInputC(6) ;
if (!bit_is_set(PINC, 1)) MakeInputC(7) ;
if (!bit_is_set(PINC, 0)) MakeInputC(8) ;
// fourth column
PORTC = 0b11101111; if (!bit_is_set(PINC, 3)) MakeInputC(5) ;
if (!bit_is_set(PINC, 2)) MakeInputC(2) ;
if (!bit_is_set(PINC, 1)) MakeInputC(3) ;
if (!bit_is_set(PINC, 0)) MakeInputC(4) ;
}
if(pw[2]==0xf7)
{
// first column
PORTC = 0b01111111; if (!bit_is_set(PINC, 3)) MakeInputD(1) ;
// second column
PORTC = 0b10111111; if (!bit_is_set(PINC, 3)) ;
if (!bit_is_set(PINC, 2)) MakeInputD(0) ;
// third column
PORTC = 0b11011111; if (!bit_is_set(PINC, 3)) MakeInputD(9) ;
if (!bit_is_set(PINC, 2)) MakeInputD(6) ;
if (!bit_is_set(PINC, 1)) MakeInputD(7) ;
if (!bit_is_set(PINC, 0)) MakeInputD(8) ;
// fourth column
PORTC = 0b11101111; if (!bit_is_set(PINC, 3)) MakeInputD(5) ;
if (!bit_is_set(PINC, 2)) MakeInputD(2) ;
if (!bit_is_set(PINC, 1)) MakeInputD(3) ;
if (!bit_is_set(PINC, 0)) MakeInputD(4) ;
}
if(pw[1]==0xf7)
{
// first column
PORTC = 0b01111111; if (!bit_is_set(PINC, 3)) MakeInputE(1) ;
// second column
PORTC = 0b10111111; if (!bit_is_set(PINC, 3)) ;
if (!bit_is_set(PINC, 2)) MakeInputE(0) ;
// third column
PORTC = 0b11011111; if (!bit_is_set(PINC, 3)) MakeInputE(9) ;
if (!bit_is_set(PINC, 2)) MakeInputE(6) ;
if (!bit_is_set(PINC, 1)) MakeInputE(7) ;
if (!bit_is_set(PINC, 0)) MakeInputE(8) ;
// fourth column
PORTC = 0b11101111; if (!bit_is_set(PINC, 3)) MakeInputE(5) ;
if (!bit_is_set(PINC, 2)) MakeInputE(2) ;
if (!bit_is_set(PINC, 1)) MakeInputE(3) ;
if (!bit_is_set(PINC, 0)) MakeInputE(4) ;
}
if(pw[0]==0xf7)
{
// first column
PORTC = 0b01111111; if (!bit_is_set(PINC, 3)) MakeInputF(1) ;
// second column
PORTC = 0b10111111; if (!bit_is_set(PINC, 3)) ;
if (!bit_is_set(PINC, 2)) MakeInputF(0) ;
// third column
PORTC = 0b11011111; if (!bit_is_set(PINC, 3)) MakeInputF(9) ;
if (!bit_is_set(PINC, 2)) MakeInputF(6) ;
if (!bit_is_set(PINC, 1)) MakeInputF(7) ;
if (!bit_is_set(PINC, 0)) MakeInputF(8) ;
// fourth column
PORTC = 0b11101111; if (!bit_is_set(PINC, 3)) MakeInputF(5) ;
if (!bit_is_set(PINC, 2)) MakeInputF(2) ;
if (!bit_is_set(PINC, 1)) MakeInputF(3) ;
if (!bit_is_set(PINC, 0)) MakeInputF(4) ;
}
else
{
for(int h=0; h<4; h++)
{
MakePW(h);
}
for(int y=0; y<4; y++)
{
PassWord(y);
}
pw[0] = 0xf7; pw[1] = 0xf7; pw[2] = 0xf7; pw[3] = 0xf7;
}
}
else
{
check = 1;
PORTE = open[k+1];
_delay_ms(300) ;
OpenOutput(0);
OpenOutput(1);
OpenOutput(2);
OpenOutput(3);
}
// MCUCR = 0x00; // enable external memory and I/O
// XMCRA = 0x00; // 0x1100-0x7FFF=1 wait, 0x8000-0xFFFF=2 wait
// XMCRB = 0x00; // enable bus keeper, use PC0-PC7 as address //이건 바꿔도 LCD에 영향은 없는듯
}
}
void MakeInputC(int c)
{
if(c < 0)
{
c = -c ;
}
else
{
pw[3] = x[c] ;
_delay_ms(500);
}
}
void MakeInputD(int d)
{
if(d < 0)
{
d = -d ;
}
else
{
pw[2] = pw[3] ;
pw[3] = x[d];
_delay_ms(500);
}
}
void MakeInputE(int e)
{
if(e < 0)
{
e = -e ;
}
else
{
pw[1] = pw[2];
pw[2] = pw[3];
pw[3] = x[e] ;
_delay_ms(500);
}
}
void MakeInputF(int f)
{
if(f < 0)
{
f = -f ;
}
else
{
pw[0] = pw[1];
pw[1] = pw[2];
pw[2] = pw[3] ;
pw[3] = x[f] ;
_delay_ms(500);
}
}
void OpenOutput(int b)
{
if(b < 0)
{
b = -b ;
}
else
{
s[0] = open[b/1000] ;
b = b % 1000 ;
s[1] = open[b/100] ;
b = b % 100;
s[2] = open[b/10] ;
s[3] = open[b%10];
}
}
void SaveTobar(int g)
{
if(g < 0)
{
g = -g ;
}
else
{
s[0] = bar[0];
s[1] = bar[1];
s[2] = bar[2];
s[3] = bar[3];
}
}
void BarOutput(int b)
{
if(b < 0)
{
b = -b ;
}
else
{
s[0] = bar[b/1000] ;
b = b % 1000 ;
s[1] = bar[b/100] ;
b = b % 100;
s[2] = bar[b/10] ;
s[3] = bar[b%10];
}
}
void MakePW(int h)
{
if(pw[h]==0xc0) pwo[h] = 0;
if(pw[h]==0xf9) pwo[h] = 1;
if(pw[h]==0xa4) pwo[h] = 2;
if(pw[h]==0xb0) pwo[h] = 3;
if(pw[h]==0x99) pwo[h] = 4;
if(pw[h]==0x92) pwo[h] = 5;
if(pw[h]==0x82) pwo[h] = 6;
if(pw[h]==0xf8) pwo[h] = 7;
if(pw[h]==0x80) pwo[h] = 8;
if(pw[h]==0x90) pwo[h] = 9;
}
void PassWord(int y)
{
password = ((1000*pwo[0]) + (100*pwo[1]) + (10*pwo[2]) + pwo[3]);
}
void getEcho(void)
{
while(!Echo); // high가 될때까지 대기 //
TCNT1=0; TCCR1B=2; // 카운터 시작, 8분주 = 0.5us //
while(Echo); // low가 될때까지 대기 //
TCCR1B=8; // 카운터 정지 //
range=TCNT1/116; // Cm로 변경 //
}
void ActiveSonic(void)
{
MCUCR = 0x80; // enable external memory and I/O
XMCRA = 0x46; // 0x1100-0x7FFF=1 wait, 0x8000-0xFFFF=2 wait
XMCRB = 0x80; // enable bus keeper, use PC0-PC7 as address //이건 바꿔도 LCD에 영향은 없는듯
Trigger_1; _delay_us(10); Trigger_0; // 10uS
getEcho();
lcd_init();
sprintf(time," %d " , range);
lcd_putstring(0,0,"length");
_delay_ms(5) ;
lcd_putstring(8,0, time);
_delay_ms(5) ;
MCUCR = 0x00; // enable external memory and I/O
XMCRA = 0x00; // 0x1100-0x7FFF=1 wait, 0x8000-0xFFFF=2 wait
XMCRB = 0x00; // enable bus keeper, use PC0-PC7 as address //이건 바꿔도 LCD에 영향은 없는듯
}
void MCU_initialize(void) // initialize ATmege128 MCU
{
MCUCR = 0x80; // enable external memory and I/O
XMCRA = 0x46; // 0x1100-0x7FFF=1 wait, 0x8000-0xFFFF=0 wait
//XMCRA = 0x46; // 0x1100-0x7FFF=1 wait, 0x8000-0xFFFF=2 wait
XMCRB = 0x80; // enable bus keeper, use PC0-PC7 as address
}
*/
leesk님의 댓글
leesk 작성일
죄송합니다 ㅠㅠ 제가 완전 마이크로 프로세서가 처음이고 코딩 경험이 많이 없다보니까 정리도 잘 안되고 정신없게 써뒀는데요
그 지금 코드는 키패드로 임의의 숫자를 입력하면 한자리씩 fnd에 출력이 되는데 동시에 초음파로 거리감지를 해서 감지된 거리를 lcd로 지속적으로 출력해주는 걸 짜본 것입니다.
leesk님의 댓글
leesk 작성일
포트는 fnd를 A와 E에 연결했고, keypad를 C, 초음파 에코,트리거를 F에 연결해둔 상황입니다.
모터나 다른 스위치 부분은 너무길어져서 제외했습니다 조언 부탁드리겠습니다
master님의 댓글
master
#include "test.h"
#include "lcd.h"
빠진 파일도 있어야하고
전체소스를 첨부하세요
하나라도 소스코드가 빠져있으면 컴파일을 해볼 수가 없습니다.
폴더째 압축해서 답변글로 첨부해보세요