사랑한다1234 2013. 4. 30. 10:01

__________논리회로____________________________________________________________

 

 

 

 멀티플렉서(multiplexer or selector)

1. 멀티플렉서(multiplexer or selector)는 여러 개의 입력선들 중에서 하나를 선택하여 출력선에 연결하는

   조합 논리회로이다. 선택선들의 값에 따라서 특별한 입력선이 선택된다.

 

2. 멀티플렉서는 많은 입력들 중 하나를 선택하여 선택된 입력선의 2진 정보를 출력선에 넘겨주기 때문에

   데이터 선택기(data selector)라 부르기도 한다.

 

3. 디멀티플렉서는 정보를 한 선으로 받아서 2n 개의 가능한 출력 선들 중 하나를 선택하여, 받은 정보를

   전송하는 회로다. 디멀티플렉서는 n 개의 선택선(selection line)의 값에 의해 하나의 출력선이 선택된다.

 

 

 

 

※ 멀티플렉서는 C언어로도 짤수있음.

※ 입력이 0 이면 GND를 걸어주어야하는 특성이 있음, 그렇지 않으면 오작동 할 수있음.

※ 입력값과 상관없이 스트로브가 H이면 L 출력됨.

 

 

______________________________________________________________________________

 

 

 

 

 

 

__________C 수업____________________________________________________________

 

 정렬된 연결리스트의 삭제

 

#include <stdio.h>
#include <process.h>
#include <stdlib.h>


typedef struct node
{
      char data;
      struct node *next;


}NODE;


NODE *insert (char item, NODE *list);
NODE *append (NODE *list, NODE *temp);
void print_list (NODE *head);
NODE *delete(char item, NODE *list);


int main()

{

 FILE *fp;
 NODE *temp = NULL;
 NODE *list = NULL;
 char ch;

 

 if((fp = fopen ("d10-7.dat", "r")) == NULL)
 {
       printf("file open error!");
       exit(-1);

 }

 fscanf(fp, "%c", &ch);

 

 while(!feof(fp))
 {
       temp = (NODE *) malloc(sizeof(NODE));
       temp->data = ch;
       temp->next = NULL;
       list = append(list, temp);
       fscanf(fp, "%c", &ch);
  }
 fclose(fp);

 

 print_list(list);
 printf("\n");

 

 list = insert('c', list); // 기존 리스트의 제일 앞에 삽입
 list = insert('h', list); // 기존 리스트의 중간 삽입
 list = insert('m', list); // 기존 리스트의 제일 끝에 삽입

 

 print_list(list);
 

 printf("\n");
 
 list = delete('f', list);
 list = delete('e', list);
 list = delete('k', list);
 list = delete('m', list);

 

 print_list(list);
 printf("\n");
 

 return 0;
}

 

NODE *append (NODE *list, NODE *temp)
{
       NODE *current = list;

 if(list == NULL)
 {
       list = temp;
 }
 else
 {
       while(current->next != NULL)
       {
              current = current->next;
       }
       current->next = temp;
 }

 

 return (list);

}


void print_list (NODE *head)
{
      if(head == NULL)
      {
            printf("NULL");
      }
      else
      {
            printf("%c ==> ", head->data);
            print_list(head->next);

 }

}


NODE *insert(char item, NODE *list)
{
       NODE *current = NULL;
       NODE *follow = NULL;
       NODE *newnode = NULL;

 

  current = follow = list;

 if((newnode = (NODE *) malloc(sizeof(NODE))) == NULL)
 {
       printf("No memory allocated..\n");

       return NULL;
 }

 newnode->data = item;
 
 while((current != NULL) && (current->data < item)) //NULL을 만날때 까지, item을 삽입할 위치를 찾음
 {                                                                       //(어디로 삽입할지를 결정)  
       follow = current;   // 다음 노드로...
       current = current->next;    
 } 
 //while문을 탈출할때의 follow와 current 사이에 삽입
 // item의 대소 비교를  > 하면 역순 정렬이 됨

      newnode->next = current;

      if(current == list) // 제일 앞의 위치일 경우 current가 변하지않고 있게됨.
      {
           list = newnode;
      }
      else
      {
           follow->next = newnode;
      }
      return list;

}

 

NODE *delete(char item, NODE *list)   // 정렬된 연결리스트의 삭제
{
      NODE *current;
      NODE *follow;
  
      current = follow = list;

      while((current != NULL) && ( current->data != item)) // 지울 위치를 찾음 , 널인지 아닌지? && item과 data가 같은지??
      {                                                                        // 검색알고리즘 
              follow = current;
              current = current->next; // 한번 이동
      }

      if(current == NULL)
      {
             printf("Item is not found..\n");
             return list;
      }
 
      if(list == current)
      {
            list = current->next;
      }
      else if(current->next == NULL) // 이조건은 삭제해도 상관없음
      {
            follow->next = NULL;
      }
      else
      {
            follow->next = current->next;
      }
 
      free(current);

  

      return list;
}

 

 

 

 11.1 입출력 스트림과 저장형식

※ C언어는 자체에서 입출력의 기능은 제공하지 않고 라이브러리 함수를 이용하여 데이터의 입출력을 처리함.

※ C언어에서는 여러가지 입출력 장치를 논리적인 파일로 본다.

※ C언어의 입출력 시스템에서는 파일과 프로그램사이의 데이터의 교환은 스트림을 통해서 이루어짐.

스트림이란 파일과 프로그램 사이에 교환되는 연속적인 바이트의 흐름을 말함.

    

 

______________________________________________________________________________

 

 

 

 

 

__________ARM____________________________________________________________

 

 ADC.h (추가된 내용만....)

 

#define SWRST  0    //  Software Reset
#define START   1    //  Start Conversion

#define CH0       0    // ADC 채널 define
#define CH1   1
#define CH2   2
#define CH3   3
#define CH4   4
#define CH5   5
#define CH6   6
#define CH7   7

#define Light  CH4         // 빛센서를  채널4로 define

#define LOWRES      4    //Resolution(분해능)  0 : 10bit, 1 : 8bit
#define PRESCAL    8    // PRESCAL은 8~15이기 때문에 8시프트 해야함.

 

#define DRDY  16          // ADC_SR : 컨버젼되면 H로 값이 변하는 레지스터
#define EOC0  0  
#define EOC1  1
#define EOC2  2
#define EOC3  3
#define EOC4  4
#define EOC5  5
#define EOC6  6
#define EOC7  7

 

unsigned int ADC_Run(); // 컨버젼을 시작하고 그 값을 정수로 반환하는 함수의 원형선언

 ADC.c

#include "ADC.h"


void ADC_Init()
{
      PMC_PCER = (1<<ADC_ID);                          //at91sam7s의 ADC 장치번호(4)를 넣어 clk enalble 시킴

      ADC_CR = SWRST;                                       //ADC Control Register 리셋

      ADC_CHER = (1<<Light);                               // 4번 채널 활성

      ADC_MR = (5<<PRESCAL) | (0<<LOWRES); //5를 prescal 자리에 넣음,  Resolution : 10bit,  Convesion time : 4Mhz 

 

      return;
}


unsigned int ADC_Run()  // 컨버젼을 시작하고 얻어진 값을 정수로 반환하는 함수
{
      ADC_CR = (1<<START);

      while(0 == (ADC_SR & (1<<DRDY))); //16 자리 bit MASK , 컨버젼타임을 벌어줌.

 

      return (ADC_LCDR & 0x3FF);     // LCDR 의 값을 10비트만 반환
                                                   // 10비트 외에 있는 값은 마스킹 해서 없애줌 
}

 LCD.c

void LCD_Number(unsigned short usNum) //65535 까지 가능
{
      unsigned char ucSting[] = "00000";

      ucSting[0] = '0'+(usNum / 10000);   // 넘겨받은 usNum값을 단위별로 나누어 각 배열자리에 대입
                                                         // 아스키코드 값으로 넘겨줘야 하기때문에 '0'값에 더함
    

      ucSting[1] = '0'+((usNum % 10000) / 1000);

      ucSting[2] = '0'+((usNum % 1000) / 100);

      ucSting[3] = '0'+((usNum % 100) / 10);

      ucSting[4] = '0'+(usNum % 10);

      ucSting[5] = '\0';
 
      LCD_Cmd_write(LCD_CLEAR); //화면 지우고
      LCD_Cmd_write(LCD_HOME);  // 커서 맨처음으로 이동
 
      LCD_String(ucSting);
 
      return;

}

 main.c

#include "project.h"
#include "LCD.h"
#include "ADC.h"

 

int main()
{
     unsigned int uiNum;
     volatile unsigned int vuiCnt;
  
     LCD_Init();
     ADC_Init();
     //LCD_String("HELLO");
 
     while(1)
     {
          uiNum = ADC_Run();  // 컨버젼된 값을 넣음

          LCD_Number(uiNum); // 컨버젼된 값을 LCD에 출력

          for(vuiCnt = 0;  vuiCnt <150000; ++vuiCnt); // 너무 빨리 값이 변하는걸 막기위한 지연
     }
 
     return 0;

}

※ 센서의 한쪽 다리에 3.3V(또는 5V)를 넣으면 밝을수록 높은 값나옴

    센서의 한쪽 다리에 GND를 연결하면 어두울 수록 높은 값 나옴. 

 

______________________________________________________________________________

 

 

 

 

 

______논리회로 && 실습파일____________________

 

0430_조합논리_회로.pptx

 

 

 

10-7.c

 

d10-7.dat

 

 

 

ADC.c

 

ADC.h

 

LCD.c

 

LCD.h

 

main.c

 

______________________________________________