좋은자료가 보여서 프랑켄님의 블로그에서 담아왔습니다! 주소는 아래와 같습니다!

http://blog.naver.com/PostList.nhn?from=postList&blogId=ranken&categoryNo=43&currentPage=5


상 수 (추가 : 2010. 4. 5, 수정 : 2010. 5. 4)

  RAMEND : 칩에 존재하는 RAM의 마지막 주소 (byte 주소)

  XRAMEND : 지정 가능한 램의 마지막 주소 (외부램의 없다면 RAMEND와 동일)

  E2END : EEPROM의 마지막 주소

  FLASHEND : flash memory 끝 주소 (byte 주소)

  SPM_PAGESIZE : flash memory page size (byte 단위)

  E2PAGESIZE : EEPROM의 페이지 크기

  SIGNATURE_0 : device signature (byte 0)

  SIGNATURE_1 : device signature (byte 1)

  SIGNATURE_2 : device signature (byte 2)

 

  FUSE_MEMORY_SIZE : FuseBit bytes의 크기 (fusebit bytes는 low, high, extended로 구성)

 

  F_CPU : 사용자가 제공하는 CPU 클럭 정보

 

 * SIGRD가 정의되어 있지 않다는 컴파일러 에러가 발생하는 버그가 존재하므로

  #ifndef SIGRD

  #define SIGRD  5

  #endif

  위의 코드를 추가하여 컴파일.

 

 

매크로(추가 : 2010. 4. 5,  수정 : 2011, 11. 17)

  _BV() : bit value    특정 비트 플래그의 값을 검사하기 위한 비트마스크를 만드는 매크로

  예) 1 << TXC   =====>   _BV(TXC)

        while( !(UCSRA & (1<<TXC) );        ====>    while( !(UCSRA & _BV(TXC) );

  sei() : 전역 인터럽트 활성화, 어셈블리 명령어 sei와 동일함.

  cli() : 전역 인터럽트 비활성화, 어셈블리 명령어 cli와 동일함.

  bit_is_set(sfr, bit) : sfr레지스터의 bit가 set이면 참(0이아닌 값).

  bit_is_clear(sfr, bit) : sfr레지스터의 bit가 clear면 참(0이아닌 값).

  loop_until_bit_is_set(sfr, bit) : sfr레지스터의 bit가 set 될 때까지 대기. (while 루프)

  loop_until_bit_is_clear(sfr, bit) : sfr레지스터의 bit가 clear 될 때까지 대기. (while 루프)

 

헤더파일

  avr/io.h : device에 관련된 기본적인 정의 (추가 : 2010. 4. 23)

  컴파일러 옵션 '-mmc='으로 전달된 avr에 대한 적절한 입출력 관련된 정의들을 불러들인다.

  <avr/ioXXXX.h>를 include함으로써 이 작업을 수행한다. 모든 AVR에 공통적인 레지스터는

  <avr/common.h>에 정의 되어 있고, avr/io.h에서 읽어들인다.

  읽어들이는 헤더파일

  <avr/sfr_defs.h>

  <avr/portpins.h>

  <avr/common.h>

  <avr/version.h>

 

  avr/boot.h : 부트로더 지원 (추가 : 2010. 4. 16)

  부트로더에서 제공하는 기능들에 대한 C 언어 지원 매크로, 함수, 상수

  전역 인터럽트는 자동으로 disable 되지 않고 프로그래머가 결정하도록 한다.

  페이지 기록하는 예제 코드도 포함되어 있다.

 

  avr/pgmspace.h : flash memory에 접근 기능 제공 (추가 : 2010. 4. 16)

  장치의 플래시 메모리 영역에 저장된 데이터에 접근하기 위한 인터페이스를 제공한다.

  대상 장치는 LPM이나 ELPM 명령을 지원해야 한다. 

  IAR C의 헤더파일과의 호환성을 위해 제공되지만 100% 호환되지는 않는다.

  ram에 기초한 문자열을 다루는 경우에는 avr_string에서 설명하는 표준 문자열 함수를 사용.

 

  inttypes.h : 정확한 길이의 정수형 타입 정의 (추가 : 2010. 4. 16)

  그 길이를 정확하게 사용할 필요가 있는 정수형 데이터를 정의하는 stdint.h를 확장한다.

  "far" 포인터(64kbytes 초과하는 주소를 위한), printf/scanf에 사용하는 formatting options


 

  avr/interrupt.h : 인터럽트 서비스 루틴 작성에 필요한 매크로 지원(추가 : 2010. 5. 4)

  C언어는 하드웨어에 종속적이지 않은 추상화된 언어이기 때문에 하드웨어에 따라서 달라지

  는 인터럽트 서비스 루틴을 직접 지원할 수가 없다. 따라서, AVR 컴파일러에 따라서 인터럽트

  지원 방법을 나름대로의 방식으로 구현한다. avr-gcc에서는 인터럽트 벡터 테이블이 미리

  정의된 특정 이름을 가지고 있다.

 

  util/setbaud.h : 보오레이트 계산에 필요한 매크로 지원(추가 : 2010. 5. 11)

  F_CPU(시스템 클럭), BAUD_TOL(허용 오차율%, 기본값은 2%), BAUD(보오레이트)의 3개의

  상수를 제공 받아서 UBRRH_VALUE, UBRRL_VALUE, USE_2X(2배속 사용여부)를 전처리기에

  서 계산해서 상수로 쓸 수 있도록 한다.

 

 

 #undef BAUD      // 이전에 BAUD를 define 했다면 컴파일러 오류를 피한다.
 #define BAUD 38400
 #include <util/setbaud.h>
   UBRRH = UBRRH_VALUE;
   UBRRL = UBRRL_VALUE;
 #if USE_2X
   UCSRA |= _BV(U2X);
 #else
   UCSRA &= ~_BV(U2X);
 #endif

 

  avr/eeprom.h : EEPROM에 읽기/쓰기 위한 지원 매크로 및 함수 지원(추가 : 2010. 5. 13)

  EEPROM이 사용 가능한가를 알아보는 eeprom_is_ready()와 사용 가능할 때까지를 기다리는

  eeprom_busy_wait()를 제공하고, EEPROM에 읽고, 쓰는 eeprom_read_XXX, eeprom_write_XX

  제공. 단, 모든 함수는 폴링을 위한 인터페이스로서 인터럽트 기반 처리를 위해서는 스스로

  구현해야 한다.


  stdio.h :  C언어의 표준 입출력 함수를 제공 (추가 : 2010. 5. 14)

  AVR과 MCU는 제한된 기능으로 인해서 모든 표준 IO 인터페이스가 구현될 수가 없다.

  printf와 scanf를 AVR의 특정 IO로 연결 시키고 싶다면 입출력 함수를 작성해서 이 함수를

  fdev_setup_stream()을 이용해서 stream을 생성/등록하고 이것을 stdin, stdout, stderr과

  연결하면 된다.

네..압니다..에러때문에 짜증나시죠?..저도 그랬답니다.그래서 여기에 글을 써서 공유했고요..

만약 다른 에러해결책을 아신다면 다른사람들 위해서 나의 해결법을 댓글로 공유하시는건 어떨까요? ^^

 

PCB allegro로 넘어가기전 Orcad Capture의 DRC Error는 우리를 참 난감하게 만듭니다.

지금까지 그려온 도면에 무슨문제가 생겼길래?....

행여나 아래와 같은 에러가 발행하셨다면 참고해주세요 ^^


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


DRC004 : 전원과 연결된 단자가 잘못된 핀이다.

->해결 : 만약 회로에 이상이 없다면 교차지점을 두번 클릭한다. (지뢰찾기모양의 표에서)

            회로에서 해당단자가 전원과 잘못연결된 경우라면 수정하면됨.


DRC0007 : 도면에 점이나 찌꺼기가 찍혀있을때 발생한다.

 ->해결 : 경고가 뜬 좌표점에가서 삭제.


DRC0006 : Net has fewer than two connections

   어떤 NET이 두개 이하의 접속점을 가지고 있음.

 ->해결 : 해당 좌표의 NET을 삭제. 혹은 그리다 말았기 때문에 해당 핀으로 연결해준다.


DRC0010 : Reference가 중복됨.

->해결 : Annotating 단계에서 값을 새로부여하면 됨.



DRC0011 : part를 사용할 때 part reference를 보면 ? 가 붙는 것을 볼 수 있다. ?가 붙을 경우나 part reference 끝에 숫자를 붙여도 된다.

->해결 : R을 사용한다고 하였을 때 part를 불러다 사용하게 되면 R?이라고 나온다. 단순히 R이라고 적는 것이 아니라 R1이라고 해줘야 한다.



DRC0037 : Net has two or more aliases - possible short?

 해당 Net이 두개 이상의 Net이름을 가지고있음.

->해결 : 중복된 네트 이름을 제거 


DRC0039 : Tap may not be connected with the bus check Entire net

 해당 접점이 버스라인과 제대로 연결되지 않았다.

->해결 : 보통 버스name이 빠져서 그렇다. 이름은 LED[0..7] 형식으로 하면 됨.



Warning(Spmhod -33) :~ not found in PSMPATH or must be "dbdoctor"ed 

->해결 : 보드파일(brd)이 있는 폴더에 제작해줬던 소자의 풋프린트파일이 없어서 생긴문제다.

            직접 패스를 걸어주는방법이 있으며 가장 쉬운방법은 path설정된 폴더에 dra파일을 copy해주면 해결됩니다.

            

            패스를 걸어주는것은 PCB Editor에서 Setup-User Preferences Editor-Paths-Library-psmpath 의 value값에

            Dra를 저장한 폴더명을 추가해주세요.




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



에러가 아니라 경고는 netlist 생성에는 영향을 끼치지 않습니다. 그러나 회로 판독시 Net 연결지점을 못찾아 혼란을 야기할수 있으므로 해당 Net을 삭제하고 마감을 하던지 혹은 모든 경고를 찾아 고치기를 바랍니다.


PCB Artwork은 전문기술이기도 하며 현재 ORCAD보다는 다른 캐드프로그램을 많이 쓰시는 분이 많기때문에..정보가 적은것 같습니다..저도 이제 독학으로 시작한 초짜지만..가르쳐주시는분이 없어서..몇번이나 맨땅에 헤딩한지 모르겠습니다..

그래서 에러가 날때마다 정리해놓은 이자료가 도움이 되시길 바랍니다..


'Engineering > Using the ORCAD' 카테고리의 다른 글

[ORCAD] ORCAD 16.3 버전 설치  (2) 2012.10.23

Moving Average Filter [이동 평균 필터]


(1) 일부 데이터에 더 많은 비중을 두고 계산을 행한 평균 값.
(2) 시계열의 각 항에 대하여 그것을 중심으로 하는 전후 일정 항 수의 평균값을 연결하여 경향선을 구하는 방법. 이 방법은 이해하기가 쉽고 계산이 쉬운 반면에 항수에 대한 일정한 규칙이 없어 항수에 따라 그 결과가 달라질 수 있으며, 첫 항과 끝 항의 추세값을 계산할 수 없으므로 최근의 추세선을 구하기 어려운 단점이 있다.


초음파센서와 같이 입력받는 데이터의 값이 가끔 일정치 않거나 틱과 같이 값이 튈때 주로 사용합니다.

구현자체가 어렵지 않아서 많은 분들이 사용합니다.



예제)


        float value[20]={0},Av_M=0,Good_value=0; 

unsigned char flag=0,gap=0;


if(flag==0) 

{

for(i=0;i<20;i++)

value[i]=distance_cal1(Read_Adc());

Av_M += value[i];

if(i==19)

Av_M=(Av_M/20); 


}

}


while(flag==1) //피크값 검출

{

Good_value=distance_cal1(Read_Adc());

gap = abs(Av_M - Good_value);

if(gap<369)

{

flag=0; 

}

else

{

flag=1;

}

}flag=1;



for(i=0;i<19;i++)

value[i]=value[i+1];

Av_M += value[i];


if(i==18)

{

value[i+1]=Good_value;

Av_M += Good_value;

Av_M=(Av_M/20);

}

}



+ Recent posts