본문 바로가기
코스웨어/10년 시스템제어

시스템제어 - 4월14일 안태민(16번)

by 알 수 없는 사용자 2010. 4. 14.
728x90
반응형

######################################### 네트워크 #################################################

1번문제

typedef struct test
{
  int A;
  char B[4];
  double C;
  short D[2];
  char E;
  
}TEST;

p-> 는 사용안하도록.

아래와 같이 출력하시오

main()
{
  test EX;
  
  Ex A = 10;
  Ex B[0= 'a';
  Ex B[1= 'b';  
  Ex B[2= 'c';
  Ex B[3= 'd';

  Ex c = 3.14;
  Ex D[0= 20;
  Ex D[1= 30;
  Ex E = A;
}

---------------------------------------------------------------------------------------------------

1번문제 답안

typedef struct test{
  int A;
  char B[4];
  double C;
  short D[2];
  char E;
} TEST;

int main() {
  void *P;
  int i;
  TEST Ex;
  Ex.A = 10;
  Ex.B[0= 'a'
  Ex.B[1= 'b';
  Ex.B[2= 'c';
  Ex.B[3= 'd';
  
  Ex.C = 3.14;
  Ex.D[0= 20;
  Ex.D[1= 30;
  
  Ex.E = 'A';

  P = &Ex;
  printf("int A = %d\n", *(int *)P) ;
  
  P = (char*)P+4;
  for(i=0; i<4; i++){
    printf("char B[%d] = %c\n",i, *(char *)P);
    ++(char*)P;
  }
  
  printf("double C = %.2f\n", *(double *)P) ;
  
  P = (char*)P+8;
  for(i=0; i<2; i++){
    printf("short D[%d] = %d\n",i, *(short *)P);
    ++(short*)P;
  }
  
  printf("char E = %c\n", *(char *)P) ;

  return 0;
}

===================================================================================================

2번문제

typedef struct test
{
  int A;
  char B;
  double C;
  short D[2];
  char Ex5 text;
  
  printf(
"%d, *(int *)p)
}TEST;

p-> 는 사용안하도록.

출력하시오

main()
{
  test EX;
  
  Ex A = 10;
  Ex B[0] = 'a';
  Ex B[1] = 'b';  
  Ex B[2] = 'c';
  Ex B[3] = 'd';

  Ex c = 3.14;
  Ex D[0] = 20;
  Ex D[1] = 30;
  Ex E = A;
}

---------------------------------------------------------------------------------------------------

2번문제 답안

#pragma pack(push,1)
typedef struct test{
  int A;
  char B ;
  double C;
  short D[2];
  char E;
} TEST;
#pragma pack(pop)

int main() {
  void *P;
  int i;
  TEST Ex;
  Ex.A = 10;
  Ex.B = 'Z'; 
  Ex.C = 3.14;
  Ex.D[0] = 20;
  Ex.D[1] = 30;
  
  Ex.E = 'A';

  P = (void *)&Ex;
  
  printf("
int A = %d\n", *(int *)P) ;
  P = (char*)P+4;
    
  printf("char B = %c\n", *(char *)P);
  P = (char*)P+1;  
  
  printf("double C = %.2f\n", *(double *)P) ;
  
  P = (char*)P+8;
  for(i=0; i<2; i++){
    printf("short D[%d] = %d\n",i, *(short *)P);
    ++(short*)P;
  }
  
  printf("char E = %c\n", *(char *)P) ;

  return 0;
}



########################################## 아트메가 ############################################


★★★★★★★★★★★★★★★  원본  ★★★★★★★★★★★★★★★

#include "SYS_CTR.h"
#include <avr/signal.h>
#include <avr/interrupt.h>

#define CPU_CCLOCK    16000000  //CPU_CCLOCK = 16,000,000 Hz 
#define TICKS_PER_SEC  1000    //TICKS PER SEC = 1,000
#define PRESCALER    64      //PRESCALER = 64
                  //클럭의 배수(크기, 오버헤드)

volatile unsigned int g_elapsed_time=0//시간변수

void initLED(void);    //LED 초기화
void setTCCR0(void);  //TCCR0 설정
void initTCNT0(void);  //TCNT0 초기화
void setTIMSK(void);  //TIMSK 설정
void toggleLED(char *state);  //LED 반전
void sleep(volatile unsigned int elapsed_time); //1초대기
SIGNAL(SIG_OVERFLOW0);      //timer0의 오버플로우함수

int main(){
  char state = 0;
  initLED();    //LED 초기화
  setTCCR0();    //TCCR0 설정
  initTCNT0();  //TCNT0 초기화  
  setTIMSK();    //TIMSK 설정
  sei();      //인터럽트 활성화  
  
  while(1) {
    toggleLED(& state);    //LED 반전
    state++;
    sleep(1000);      //1초 대기    
  }
  return 1;
}
    
void initLED(void){    //LED 초기화
  DDRF = 0xFF;
  PORTF = 0xFF;
}

void setTCCR0(void){  //TCCR0 설정
  TCCR0 = TCCR0 | 1<<2;
  TCCR0 = TCCR0 & (~(1<<1));
  TCCR0 = TCCR0 & (~(1<<0));

  //방법1
  //TCCR0 |= 1<<cs02;
  //TCCR0 &= ~(1<<cs01);
  //TCCR0 &= ~(1<<cs00);  
}

void initTCNT0(void){  //TCNT0 초기화
  TCNT0 = 6;      //256-(16000000/1000/64)
}

void setTIMSK(void){  //TIMSK 설정
  TIMSK = 1<<TOIE0 ;
}

void toggleLED(char *state){  //LED 반전
  if((*state)%2 ==0)
    PORTF = 0x00;
  else
    PORTF = 0xFF;
}

void sleep(unsigned int elapsed_time){

  while(g_elapsed_time < elapsed_time);
  
  g_elapsed_time = 0;
}

SIGNAL(SIG_OVERFLOW0){
  TCNT0 = 6;
  g_elapsed_time++;
}

------------------------------------------------------------------------------------------------------

★★★★★★★★★★★★★★★  수정본  ★★★★★★★★★★★★★★★

#include "SYS_CTR.h"
#include <avr/signal.h>
#include <avr/interrupt.h>

#define CPU_CCLOCK    16000000  //CPU_CCLOCK = 16,000,000 Hz 
#define TICKS_PER_SEC  1000    //TICKS PER SEC = 1,000
#define PRESCALER  128    //PRESCALER = 128로 수정 ★★★★★
          //클럭의 배수(크기, 오버헤드)

volatile unsigned int g_elapsed_time=0//시간변수

void initLED(void);    //LED 초기화
void setTCCR0(void);  //TCCR0 설정
void initTCNT0(void);  //TCNT0 초기화
void setTIMSK(void);  //TIMSK 설정
void toggleLED(char *state);  //LED 반전
void sleep(volatile unsigned int elapsed_time); //1초대기
SIGNAL(SIG_OVERFLOW0);      //timer0의 오버플로우함수

int main(){
  char state = 0;
  initLED();    //LED 초기화
  setTCCR0();    //TCCR0 설정
  initTCNT0();  //TCNT0 초기화  
  setTIMSK();    //TIMSK 설정
  sei();      //인터럽트 활성화  
  
  while(1) {
    toggleLED(& state);    //LED 반전
    state++;
    sleep(1000);      //1초 대기    
  }
  return 1;
}
    
void initLED(void){    //LED 초기화
  DDRF = 0xFF;
  PORTF = 0xFF;
}

void setTCCR0(void){  //TCCR0 설정
  TCCR0 |= 1<<2;    // 128 로 수정,  100이므로 ★★★★★    
  TCCR0 |= ~(1<<1);  // 128 로 수정,  010이므로 ★★★★★
  TCCR0 |= 1<<0;    // 128 로 수정,  001이므로 ★★★★★  
}

void initTCNT0(void){  //TCNT0 초기화
  TCNT0 = 131;    // 16000 / 128(PRESCALER분주기) = 125  이므로 256-125 = 131(초기화값) ★★★★★
}        // 16000 / 64(PRESCALER분주기) =  256  이므로 256-250 = 6(초기화값) ★★★★★   

void setTIMSK(void){  //TIMSK 설정
  TIMSK = 1<<TOIE0 ;
}

void toggleLED(char *state){  //LED 반전
  if((*state)%2 ==0)
    PORTF = 0x00;
  else
    PORTF = 0xFF;
}

void sleep(unsigned int elapsed_time){

  while(g_elapsed_time < elapsed_time);
  
  g_elapsed_time = 0;
}

SIGNAL(SIG_OVERFLOW0){
  TCNT0 = 131;    // 131로 수정 ★★★★★
  g_elapsed_time++;
}


------------------------------------------------------------------------------------------------------

★★★★★★★★★★★★★★★  수정본  ★★★★★★★★★★★★★★★

#include "SYS_CTR.h"
#include <avr/signal.h>
#include <avr/interrupt.h>

#define CPU_CLOCK    1600000
#define TICKS_PER_SEC    1000
#define PRESCALER    64     // 분주기 64 

volatile unsigned int g_elapsed_time =0;  //시간변수

void initLED(void);        //LED초기화
void setTCCR0(void);        //TCCRO설정
void setOCR0(void);        //OCR0설정    ★★★★★ 함수추가
void initTCNT0(void);        //TCNTO초기화
void setTIMSK(void);        //TIMSK설정
void toggleLED(char * state);    //LED반전
void sleep(unsigned  int elapsed_time);// 1초대기
SIGNAL(SIG_OUTPUT_COMPARE0);      //TIME 0의  오버플로우함수

int main(void)
{
  char state=0;
  initLED();
  setOCR0();      ★★★★★ 함수추가
  setTCCR0();
  initTCNT0();
  setTIMSK();  
  sei();

  while(1)
  {
    toggleLED(&state);
    state++;
    sleep(1000);
  }

  return 1;
}

void initLED()
  {
    PORTF = 0xff;
    DDRF  = 0xff;
  }
void setTCCR0()
  {
    TCCR0 |= 1<<CS02;   ★★★★★  PRESCALER  64일때 cs02 = 1 이므로 
                
        

    TCCR0 |= 1<<3;     ★★★★★  Mode | WGM01 | WGM00 | TOP
                                  ----------------------------- 이므로 ppt 105쪽 참조.  
                                       |  1    |   0   | OCR0  
  }
void initTCNT0()
  {
  
    TCNT0 = 0;    ★★★★★
  }
void setOCR0()        
  {
    OCR0 = 250;    ★★★★★   250 = 초기화값
  }

void setTIMSK()
  {
    TIMSK = 1<<1;
  }

void sleep(unsigned elapsed_time)
{
  while(g_elapsed_time < elapsed_time);
  g_elapsed_time = 0;
  
}
void toggleLED(char *state)
  {
    if((*state) %2== 0)
    {
      PORTF = 0x00;  
    }
    else 
    {
      PORTF = 0xff;
    }
  }
SIGNAL(SIG_OUTPUT_COMPARE0)     C:\ => WinAVR => avr => include => avr => iom128.h 에서찾기(SIG_OUTPUT_COMPARE0)
{
  g_elapsed_time++;        ★★★★★ 자동초기화되므로 초기화안시켜도되서 TCNT0 없애줌.
}


728x90