본문 바로가기
코스웨어/13년 스마트컨트롤러

6월 7일 금요일 정리 조유진

by 알 수 없는 사용자 2013. 6. 7.
728x90
반응형

EEPROM : 비휘발성 메모리. 껐다 켜도 데이터가 메모리에 남아있다.

EEPROM의 접근 방법 : EEPROM은 SRAM/Flash와 같이 아예 따로 구분되어 있기 때문에, 일반적인 방법으로(포인터를 이용한 레지스터 접근은 SRAM안에서만 가능) 접근이 불가능하다. 그러므로 간접적으로 접근할 EEPROM주소 번지를 지정해주는 레지스터를 이용해 번지를 입력하고,( 0x000~0xFFF) EEPROM 데이터레지스터에 값을 남기는 방식으로 접근할 수 있다.


void EEPROM_WriteChar( unsigned int uiAddress, unsigned char ucData )
{
  while0 != EECR & ( 1 << EEPE ) );  // 앞의 동작이 다 끝났을 때 까지 기다린다.
  while0 != SPMCSR & ( 1 << SPMEN ) );
  EEAR = uiAddress;  // 접근할 EEPROM 번지를 등록
  EEDR = ucData;    // 데이터 레지스터에 넣을 값을 입력
  SREG = SREG & ~( 1 << 7 );  // 인터럽트가 활성화되어 있으면 작동에 문제가 생길 수 있다.
  EECR = EECR | (( 1 << EEMPE ) | ( 0 << EEPE ));  // 라이트가 가능하도록 허용.
  EECR = EECR | ( 1 << EEPE );  // 4 서아쿨 내에 1로 설정해야한다.
  return;
}

unsigned char EEPROM_ReadChar( unsigned int uiAddress )
{
  while0 != EECR & ( 1 << EEPE ) );  // 앞의 동작이 다 끝났을 때 까지 기다린다.
  EEAR = uiAddress;  // 접근할 EEPROM 번지를 등록
  EECR = EECR | ( 1 << EERE );  // 리드 하기 위한 신호를 준다
  return( EEDR );    // EEPROM을 접근하여 해당 데이터를 반환한다.
}


: UART통신으로 하이퍼 터미널에서 통신을 할 때, Recv_Char함수를 getch처럼 사용할 수도 있다!

Recv_Char를 쓰려면 입력 인터럽트를 해제해 주어야 한다. 전체 인터럽트(SREG)를 풀어주고, DBGU의 모드 설정 레지스터에서도 인터럽트를 0으로 설정해준다.

그리고 새로 그릴 때 구분하기 짜증나 불편하다면, 새로그릴 부분의 바로 앞에 \f를 출력하게 하면 새로 그려져 깔끔하다.





외부 인터럽트 : 외부에서 신호의 변경(H->L, L->H, 등등)을 잡아내어 인터럽트를 걸어주는 것을 말한다.


버튼을 이용한 외부 인터럽트


void INT_Init( void )
{
  EICRB = EICRB | ( 0 << ISC40 ) | ( 0 << ISC41 );  // 외부 인터럽트는 설정시 2개의 비트를 쓰는데
  // 장치 개수가 레지스터 1개로는 모지라므로 A와 B로 구분한다.
  //여기서 우리는 4번 장치를 이용할 것이므로 B로 설정하며, 0/0이면 하강에지를 반응한다.
  
  EIMSK = EIMSK | ( 1 << INT4 );  // INT4의 인터럽트를 켜준다.
  sei();  // 전체 인터럽트를 설정해준다.
  return;
}

void __vector_5( void )  // 인터럽트가 발생했을 때 불러와지는 함수.
{
  LCD_String( "PUSHED!" );
  
  return;
}


하강에지로 인터럽트를 설정해 주었으므로, INT4(PIN6)에 풀업을 달아 준다.

다소 오류가 있는지 여러번 입력되지만, 누를 때 반응한다는 것을 알 수 있다.



728x90