현재 ATmega에서 외부확장메모리를 이용하여 외부디바이스를 제어하고 있는데요.
예를 들어,
0x8400 이면 relay output address 입니다.
#define relay = (*(extern volatile unsigned char *)0x8400)
relay = 0x01;
CLEARBIT(PORTG,0) // /wr active
하면 첫번째 relay output 이 나가게 됩니다.
그리고,
0x9000 이면 Digital input 의 address 입니다.
#define Dinput = (*(extern volatile unsigned char *)0x9000)
unsigned char input_value;
CLEARBIT(PORTG,1) // /RD active
input _value = Dinput;
하면 8개의 입력이 들어오게 되겠죠.
제가 하고자 하는 것들은 이러한 입출력 채널이 꽤 많은 편이라, 이걸 구조체 배열로 꾸며서 main()에서
손쉽게 제어하고 쉽거든요.
예를 들어,
void main() {
if( Dinput[0] ==1) Dout[0] =1;
}
하면 첫번째 입력 채널이 active 이면, 첫번째 릴레이로 출력이 나가도록 하고자 하는 것입니다.
이걸 구조체 배열을 사용해서 구현하고자 하는데, c를 잘 몰라서 틀을 못 잡겠습니다.
도움 부탁 드립니다.
#define relay = (*(extern volatile unsigned char *)0x8400)
relay = 0x01;
CLEARBIT(PORTG,0) // /wr active
하면 첫번째 relay output 이 나가게 됩니다.
AVR Writing 타이밍을 보면. Write 시에 /WR 신호를 LOW 로 만들고, 데이터를 내보냅니다.
즉,
/WR : LOW
A15 : HIGH
A14 ,A13,A12 : LOW
A11 : LOW
A10 : HIGH
A9,.............A0 : LOW 신호를 발생하게 됩니다.
이 신호들을 적절히 맵핑 시켜 래치 신호를 만들어 사용하면 되는 거구요.
입력은 위와 마찬가지이구요..(/WR 대신 /RD 신호를 사용하는 것이 차이점입니다.)
해보면 아시겠지만, C 언어보다는 하드웨어 꾸미는게 더 힘든 일입니다.
자세한 것은 아래를 참조하시구요..~~.
http://whiteat.com/zbxe/?document_srl=297