BASIC4MCU | 질문게시판 | master님 정말감사합니다! 마지막 질문드릴께요 ㅠㅠ
페이지 정보
작성자 이민호 작성일2018-09-07 17:13 조회184,256회 댓글16건본문
//
#include <iom128.h>
#include <ina90.h>
//
unsigned char fnd[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
char flag=0,run=0,mode=0,buf[2];
int cnt=0;
//
#pragma vector=TIMER0_OVF_vect
__interrupt void TIMER0_OVF_Isr(void){ // 1ms
static char fnd_cnt=0;
TCNT0=131;
PORTC&=~0x80; PORTD=0x7F; // 세그먼트 OFF
if(run){
switch(fnd_cnt){
case 0: PORTD=fnd[buf[0]]; PORTD|=0x80; break;
case 1: PORTD=fnd[buf[1]]; PORTC|=0x80; break;
}
if(++fnd_cnt>1)fnd_cnt=0;
//
if(mode==0){ if(++cnt>15000)cnt=0; } // 30 // 15sec
if(mode==1){ if(++cnt>10000)cnt=0; } // 60 // 10sec
if(mode==2){ if(++cnt> 5000)cnt=0; } // 90 // 5sec
if(cnt==0){
if(PORTC&1){ PORTC&=~1; PORTC|=2; }
else { PORTC&=~2; PORTC|=1; }
}
}
else{ PORTC&=~3; }
}
//
void main(){
char n=30;
DDRC=0x83; DDRD=0xFF;
TCCR0=4; TCNT0=131; TIMSK=1; //8000000/64/(256-131),1ms
__enable_interrupt();
while(1){
if(PINA&1)run=1;
else run=0; // PA0 // 토글스위치 // ON/OFF
//
if(PINA&2){
if(flag==0){ flag=1; if(++mode<2)mode=0; cnt=0; } // PA1 // 푸쉬스위치
}
flag=0;
//
if(mode==0){ buf[0]=3; buf[1]=0; } // 30 // 15sec
if(mode==1){ buf[0]=6; buf[1]=0; } // 60 // 10sec
if(mode==2){ buf[0]=9; buf[1]=0; } // 90 // 5sec
}
}
보내주신대로 코딩했는데 위에 회로랑 맞는지 한번만 확인해주실수 있나요?ㅠㅠ
댓글 16
조회수 184,256이민호님의 댓글
이민호 작성일위에 회로는 말씀해주신대로 변경한 회로입니다!
master님의 댓글
master 작성일
스위치 풀다운 저항 사용하라고 했더니 풀업저항 사용하는 형식으로 바꿨군요?
if(PINA&1==0)run=1;
if(PINA&2==0){
스위치 체크하는 문장 수정하세요
이민호님의 댓글
이민호
감사합니다 근데 궁금한게 있습니다 결과에대한건데
Warning[Pe177]: variable "n" was declared but never referenced C:\Users\com1-1\Documents\asdk\ox.c 65
418 bytes of CODE memory (+ 18 bytes shared)
18 bytes of DATA memory (+ 8 bytes shared)
Errors: none
Warnings: 1
Done. 0 error(s), 1 warning(s)
이렇게 뜨는데 괜찮은건가요?? 저도 warning은 신경안써도된다고 들어서 괜찮을거같은데 밑에뜨는 글을보면 main문으로 돌아가지않는다고 되있어서 궁금합니다 ㅠ
master님의 댓글
master
변수 n을 선언만 하고 사용하지 않았다는 워닝입니다.
변수 선언 삭제하세요
//
인터럽트에서 사용하는 전역 변수는 volatile 형을 사용해야 합니다.
volatile unsigned char fnd[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
volatile char flag=0,run=0,mode=0,buf[2];
volatile int cnt=0;
master님의 댓글
master 작성일
세그먼트 저항을 1K에서 330옴으로 변경하고
핀번호 맞추세요
PD0---seg A
PD1---seg B
PD2---seg C
PD3---seg D
PD4---seg E
PD5---seg F
PD6---seg G
PD7---10자리 common
PC7---1자리 common
이민호님의 댓글
이민호
회로도 상에서 말씀이신가요??? 아니면 용접해서 연결할때를 말씀하시는 건가요??
master님의 댓글
master
둘 다 하세요
이민호님의 댓글
이민호
감사합니다 말씀해주신대로 코딩 수정해봤습니다
//
#include <iom128.h>
#include <ina90.h>
//
volatile unsigned char fnd[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
volatile char flag=0,run=0,mode=0,buf[2];
volatile int cnt=0;
//
#pragma vector=TIMER0_OVF_vect
__interrupt void TIMER0_OVF_Isr(void){ // 1ms
static char fnd_cnt=0;
TCNT0=131;
PORTC&=~0x80; PORTD=0x7F; // 세그먼트 OFF
if(run){
switch(fnd_cnt){
case 0: PORTD=fnd[buf[0]]; PORTD|=0x80; break;
case 1: PORTD=fnd[buf[1]]; PORTC|=0x80; break;
}
if(++fnd_cnt>1)fnd_cnt=0;
//
if(mode==0){ if(++cnt>15000)cnt=0; } // 30 // 15sec
if(mode==1){ if(++cnt>10000)cnt=0; } // 60 // 10sec
if(mode==2){ if(++cnt> 5000)cnt=0; } // 90 // 5sec
if(cnt==0){
if(PORTC&1){ PORTC&=~1; PORTC|=2; }
else { PORTC&=~2; PORTC|=1; }
}
}
else{ PORTC&=~3; }
}
//
void main(){
DDRC=0x83; DDRD=0xFF;
TCCR0=4; TCNT0=131; TIMSK=1; //8000000/64/(256-131),1ms
__enable_interrupt();
while(1){
if(PINA&1==0)run=1;
else run=0; // PA0 // 토글스위치 // ON/OFF
//
if(PINA&2==0){
if(flag==0){ flag=1; if(++mode<2)mode=0; cnt=0; } // PA1 // 푸쉬스위치
}
flag=0;
//
if(mode==0){ buf[0]=3; buf[1]=0; } // 30 // 15sec
if(mode==1){ buf[0]=6; buf[1]=0; } // 60 // 10sec
if(mode==2){ buf[0]=9; buf[1]=0; } // 90 // 5sec
}
}
맞는지 확인한번 해주실수있나요??
master님의 댓글
master
체크는 직접 해보세요
이민호님의 댓글
이민호
감사드립니다 직접연결후 프로그램 다운로드까지 했는데 실행이되지않습니다. 혹시 입력포트가 A0, A1 이맞는지랑 릴레이출력포트가 C0,C1이맞는지 궁금합니다. 추가적으로 입출력포트선언을 따로 안해주신것같은데 안해도 괜찮은건가요? 마지막으로 if(mode==0){ buf[0]=3; buf[1]=0; } // 30 // 15sec
if(mode==1){ buf[0]=6; buf[1]=0; } // 60 // 10sec
if(mode==2){ buf[0]=9; buf[1]=0; } // 90 // 5sec
이코드의 주석이 궁금합니다.ㅠㅠ 감사합니다!!
master님의 댓글
master 작성일
회로도에 스위치 A0,A1 릴레이 C0,C1으로 되어 있지 않나요?
입력포트는 리셋 디폴트 값이라서 안해도 됩니다.
모드에 따라서 30,60,90 넣어주는겁니다.
이민호님의 댓글
이민호
네 회로도상으로 했습니다. 그런데 작동이 안됩니다..ㅠㅠ 배선도 10번이나 다시 해봤는데 혹시 스위치 쪽 저항이 너무 높은건가요?? A0포트 쪽 on/off스위치를 누르면 C0 릴레이 먼저 작동되서 15초 뒤에 꺼지고 C1 릴레이가 켜져야되는데 작동을 안합니다. 혹시 따로 아트메가 128보드에 5v를 넣어주는 코드선이 있는데 그것을 연결해서 그런건가요??? 배선이 반대로 되었을까봐 A1푸시 스위치도 눌러 봤는데 작동이 안됩니다..ㅠㅠ
master님의 댓글
master
보드가 없는 사람은 디버깅을 할 수가 없습니다.
공부해서 직접 디버깅해보세요
이민호님의 댓글
이민호
128보드를 이용해서 디버깅은 하였습니다
master님의 댓글
master
디버깅은 회로와 소스코드에 문제가 없도록 수정하는 작업을 말합니다.
이민호님의 댓글
이민호
어제 하루동안 열심히 공부를 했습니다. 부분부분 디버깅을 하려고하는데 처음이라서 제가 한동작씩 확인을 해봐야된다는것을 숙지하지 못했습니다.
그래서 그런데 5v릴레이 두개를 8Mhz를 이용해서 on/off 스위치(입력포트는 A0)를 이용하여 15초간간격으로 출력포트 C0릴레이를 먼저 켜주고 15초뒤에 출력포트C1릴레이를 켜주는 코드를 부탁드려도 될까요?