제가 아직 걸음마 수준이라...직접 코딩을 하고도 제대로 했는지 모르겠네요...직접 AVR에 다운로드해서 해보는게 가장 정확하겠지만 지금 상황이 안되고 급해서요...제가 짠 프로그램이 에러가 없이 잘 작동될지...궁금해서 올려봅니다....너무 간단한거라 웃으실지 모르겠지만 저에게 한마디라도 부탁드려요...
동작은 포트 C의 pc0~pc4 중 하나에 신호가 들어오면 포트 A의 pa0,pa1에 출력을 바꿔주면서 매 출력을 내보낼때마다 initial_sw()함수(초기화기능)를 실행시켜 주는 겁니다.... 부족하지만 한마디 한마디 새겨듣겠습니다.
Chip type : ATmega128L
Program type : Application
Clock frequency : 16.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 1024
*****************************************************/
#include <mega128.h>
#include <delay.h>
#define CBI(x,bit) (x &=~(1<< bit))
#define SBI(x,bit) (x |= (1<< bit))
// Declare your global variables here
void initial_sw(void)
{
CBI(PORTA,4); //리셋
delay_ms(500);
SBI(PORTA,4);
delay_ms(500);
CBI(PORTA,5); //시작
delay_ms(500);
SBI(PORTA,5);
delay_ms(500);
}
void main(void)
{
// Declare your local variables here
DDRA = 0xFF; //A는 출력
DDRC = 0x00; //C는 입력
PORTA = 0x00; //출력초기화
initial_sw();
while(1)
{
if(PINC == 0x01) //입력이 0000001 일때
{
SBI(PORTA,1);
initial_sw();
}
else if(PINC == 0x02) //입력 0000010 일때
{
CBI(PORTA,1);
initial_sw();
}
else if(PINC == 0x04) // 입력 0000100 이면
{
SBI(PORTA,0);
initial_sw();
}
else if (PINC == 0x08) // 0001000 이면
{
CBI(PORTA,0);
initial_sw();
}
}
}
#define SBI(x,bit) (x |= (1<< bit))
이거 괜찮은데요. ㅋ 이렇게 쓸 생각은 안해봤네요.
그나저나 별 이상 없어 보이는 데요. 다만 어떠한 상황인지 모르겠지만 마이컴이 매우 빠르게 돌기 때문에
신호가 오는 파형이 깨끗한지 아닌지가 중요하겠네요.
현재 연결되어 있는 하드웨어의 상황에 따라 어떻게 동작할지는 예측이 안되네요.
이거 될라나 모르겠는데요~?
ATMEGA128은 16Mhz까지 지원가능하지만
ATMEGA128L은 8Mhz까지밖에 안되는걸로 알고있는데...(아닌가? ^^;;)
퓨즈비트를 어떻게 설정하셨는지.. 또 위에 주석처리된부분을 보면
16Mhz로 설정하신거 같은데 자동으로 8Mhz로 인식할런지 잘 모르겠네요 ㅎ
#define SBI, #define CBI << 이렇게 정의한건 어떤이유인지 모르겠는데 좀 이상한데요?(패스~)
그리고 메인 무한루프에서 initial_sw()함수안에 저렇게 딜레이를 2초씩이나 준다면
딜레이를 처리 다할동안 스위치 동작은 이뤄질수 없습니다. 소스가 저게 전부라면 상관없겠지만
이외에도 훨씬 많은명령들을 처리해야할 상황이 다반사기 때문에 저런 딜레이함수는 자제하시는게
좋다고 생각해요
감사합니다
감사합니다~