프로그램 사용/gcc2011. 12. 28. 11:05
기억력 감퇴인가.. 아무튼 c언어에서는 2진수 표기를 할 방법이 없어서
16진수로만 하는데 검색을 하다 보니 이상한 문장을 발견 -_-
  
보통 c에서는 00111111b 와 같이 사용하는데, 2진수로 바로 쓰려면 어떻게 해야하나요?
아시는 분 있으면 답변해주시면 감사하겠습니다. ^^; 

[링크 : http://www.terabank.co.kr/bbs/zboard.php?id=comunity01...no=1343]
[링크 : http://donghwada.tistory.com/entry/ATmega-Pin-Configurations-DDR-PORT-PIN]

gcc에서 제공하는 비표준 C문법으로
0x0000 이라고 16진수를 입력하듯
0b0000 이라고 2진수를 입력이 가능하다.

물론 vi에서도 인식되지 않는 문법이라 문법강조도 되지 않음 -_-
+ winavr역시 gcc 의 한 종류 이므로 이러한 문법을 허용한다.

$ vi temp.c 
  1 #include <stdio.h>
  2
  3 void main()
  4 {
  5     unsigned char binval = 0b1000000;
  6     unsigned char binval2= 10000;
  7 }
 
$ gcc temp.c
temp.c: In function ‘main’:
temp.c:6: warning: large integer implicitly truncated to unsigned type 

Most people use hexadecimal for binary numbers in C.
(GCC and some other compilers have an non-standard 0b####### extension

[링크 : http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=64658]  

흐음.. C99 표준에 넣으려다가 기각당했군 -ㅁ-
dl8dtl - Nov 26, 2006 - 08:38 PM
Post subject: RE: Binary constants in IAR C ?
> Binary notation was added in C99 if I remember correctly. 

No, it's been rejected by the committee. 

In the C99 rationale, you can find under 6.4.4.1 Integer constants: 

``A proposal to add binary constants was rejected due to 
lack of precedent and insufficient utility.'' 

So please tell your (national) standards body there *is* sufficient utility for 
it. As for the first part, I'm trying to get the 0b patch officially 
as an extension into GCC. Once that happened, there will be at least 
one very prominent C implementation that sets a precedent case. ;-) 
All those microcontroller implementations are probably nothing the ISO 
C standardization body might be aware of, but for sure, GCC is. 

> IAR is not fully up to C99 yet, 

It's about the most complete C99 implementation I've seen.  

[링크 : http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=44082&start=0]

그나저나.. 0000b 는 누구 문법일까?
Posted by 구차니
embeded/AVR (ATmega,ATtiny)2011. 3. 31. 17:58
PINA_Bit0 이런 녀석이 winavr 쪽의 PINA0 이런것과 1:1 매칭이 되는지
PINA0 PORTA0 이런것이 정말 비트 단위로 읽어올수 있고 조작이 가능한지도 모호한 상황인데..
아무튼 아래의 링크는 iar 용 매크로 라던가 변수선언들을 변환하여
일반적인 avr용 컴파일러에서 컴파일이 가능하도록 해주는 래핑소스이다.

#define GPIO_BITREG(port,bitnum) \
        ((volatile BitRegisterType*)_SFR_MEM_ADDR(port) \
        )->bit ## bitnum

#define PINA_Bit0  GPIO_BITREG(PINA,0)
#define PINA_Bit1  GPIO_BITREG(PINA,1)
#define PINA_Bit2  GPIO_BITREG(PINA,2)
#define PINA_Bit3  GPIO_BITREG(PINA,3)
#define PINA_Bit4  GPIO_BITREG(PINA,4)
#define PINA_Bit5  GPIO_BITREG(PINA,5)
#define PINA_Bit6  GPIO_BITREG(PINA,6)
#define PINA_Bit7  GPIO_BITREG(PINA,7)

[링크 : http://www.koders.com/c/fid4B73863201A18CBCB1076C1A7430B0EBF15B6E9F.aspx?s=crc
 


아무튼 자세한건 집에가서 AVR에다가 올려봐야 하려나 -_-
/* Input Pins, Port A */
#define PINA      _SFR_IO8(0x19)
/* Data Direction Register, Port A */
#define DDRA      _SFR_IO8(0x1A)
/* Data Register, Port A */
#define PORTA     _SFR_IO8(0x1B)

/* Port A Data Register - PORTA */
#define    PA7       7
#define    PA6       6
#define    PA5       5
#define    PA4       4
#define    PA3       3
#define    PA2       2
#define    PA1       1
#define    PA0       0

/* Port A Data Direction Register - DDRA */
#define    DDA7         7
#define    DDA6         6
#define    DDA5         5
#define    DDA4         4
#define    DDA3         3
#define    DDA2         2
#define    DDA1         1
#define    DDA0         0

/* Port A Input Pins - PINA */
#define    PINA7        7
#define    PINA6        6
#define    PINA5        5
#define    PINA4        4
#define    PINA3        3
#define    PINA2        2 
#define    PINA1        1
#define    PINA0        0

[출처: C:\WinAVR-20100110\avr\include\avr\iom128.h] 
 
-- 퇴근후 추가
대충해보니 머.. 정의문이라서 정수로 들어가다 보니 아무런 의미도 없는듯 -_-
아무튼, PINA.0 이런식으로 구성이 가능한것은  code vision 쪽 확장인것으로 추측되고
winavr에서는 표준적으로 비트 마스킹을 통해서만 가능한 것으로 추측된다.

[링크 : http://down.file.naver.com/howpc/kin.nhn?m=read&section=read&docid=117760743&page=362]
[링크 : http://cafe359.daum.net/_c21_/bbs_search_read?grpid=1DDsW&fldid=9E8k
Posted by 구차니
embeded/AVR (ATmega,ATtiny)2011. 3. 31. 09:37
아래는 winavr의 iom64.h의 내용중 일부이다
/* Input Pins, Port A */
#define PINA      _SFR_IO8(0x19)

/* Data Direction Register, Port A */
#define DDRA      _SFR_IO8(0x1A)

/* Data Register, Port A */
#define PORTA     _SFR_IO8(0x1B)

정리하자면
PINA는 입력된 값을 읽고
PORTA는 출력할 값을 읽고
DDRA는 그 포트의 방향을 정해준다.

예를들어, UART 같은 경우
TX 값은 PORTA에 쓰고, RX값은 PINA에서 읽는 식이라고 하면 되려나?
Pin* is for read, Port* is for write and DDR* is for direction... 
* = Register ( A, D,C...) 

PIN* is the register you use to read the value on a port if it is an input (so if the corresponding bit in DDR* is '0'). PORT* is used to output values, or to read earlier outputted values back.
 
[링크 : http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=197070]
 


Posted by 구차니
embeded/AVR (ATmega,ATtiny)2009. 10. 20. 22:27
#include "stdio.h"

static int uart_putchar(char c, FILE *stream);

static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,
                                         _FDEV_SETUP_WRITE);

static int
uart_putchar(char c, FILE *stream)
{
  if (c == '\n')
    uart_putchar('\r', stream);
  loop_until_bit_is_set(UCSRA, UDRE);
  UDR = c;
  return 0;
}

int
main(void)
{
  init_uart();
  stdout = &mystdout;
  printf("Hello, world!\n");

  return 0;
}
winavr의 설명에 의하면 위의 예제가 printf를 사용하기 위한 초기화라고 나와있다.
(일단 설명서는 잘 읽어야 제맛)

위의 예제는 범용적인 것이고,
실제로 적용하기 위해서는 두부분을 수정해야 한다.

 loop_until_bit_is_set(UCSRA, UDRE);
 UDR = c;

초기화해준 포트에 따라서

UART0를 했다면 UCSR0A / UDR0
UART1을 했다면 UCSR1A / UDR1

로 수정을 해주면된다.


UDRE는 선언상, 비트플래그의 순서로 배열되어 있으므로
굳이 UDRE0 / UDRE1 로 수정해주지 않아도 이상은 없었다.

참고로 stdio.h를 포함하면 3KB 정도 크기가 증가한다(ELF 기준)
"사본"은 아래 소스에서 printf 관련을 전부 삭제한것이다.


atmega128 에서 uart0 를 115200-N-8-1로 16MHz 클럭에서 초기화한 뒤 printf() 하는 예제

Posted by 구차니
embeded/AVR (ATmega,ATtiny)2009. 10. 9. 11:21
오랫만에 winAVR을 판올림했는데 거의 1년 정도의 버전 차이가 있었다.
그것만으로는 별 문제가 없을줄 알았는데

이상하게 AVR Studio 에서 make 파일과 avr-gcc를 못찾겠다고 떼를 쓴다.
Build started 9.10.2009 at 11:17:02
Build failed... No build tools defined.

Loaded plugin STK500
Loaded plugin AVR GCC
Loaded partfile: C:\Program Files\Atmel\AVR Tools\PartDescriptionFiles\ATmega128.xml

하단의 메시지에는 이런식으로 plugin AVR GCC가 Loaded로 떠야 하는데,
plugin이 검색하지 못할 경우에는 Fail이 나게 되고, 이 플러그인은 레지스트리를 검색하는 것으로 보인다.


이런 경우에 확인을 해보니,
`HKEY_LOCAL_MACHINE\SOFTWARE\WinAVR\{VERSION}`
라는 레지스트리 키가 제대로 등록되어 있지 않아서 생기는 문제로 파악되었다.
(다른 부분에서도 등록되지만, 이 부분만 삭제되어 있었다.)

아마도 신버전을 먼저 설치하고, 구버전을 나중에 삭제하면서
위의 키를 삭제했기 때문에 발생한 문제라고 생각된다.

해결법으로는
1. winAVR을 삭제 후 재설치한다.
2. 위의 레지스트리값만 추가한다.

'embeded > AVR (ATmega,ATtiny)' 카테고리의 다른 글

avr 에서 printf 사용하기  (2) 2009.10.20
7 segment font  (4) 2009.10.16
winAVR outp/inp 매크로  (0) 2009.10.09
ATmega128 UART 에코 서버 만들기 (echo server)  (4) 2009.10.08
ATmega128 USART 사용하기  (0) 2009.10.07
Posted by 구차니
embeded/AVR (ATmega,ATtiny)2009. 10. 9. 10:59
outp() inp()는 매크로이다.
정확한 시기는 모르겠지만, winAVR-20050414 버전 이후 제외된 것으로 보인다.
물론 <compat/deprecated.h> 를 사용하면 호환되도록 작동은 가능할 것으로 보이지만,

문법적으로 깔끔하지 않고, 표준 C를 따르지 않는(이 부분은 좀 이해가 안됨) 이유로 인해서
불편함을 감수하고 위의 매크로가 제외되었다고 한다.

There was a discussion a while back on the avr-gcc mailing list.  Some
"old stuff" has been purged.  Some people are not happy about it.  But
the purged macros were non-standard, had confusing syntax and unclear
semantics, and had been deprecated for over two years, so (IMHO) the
maintainers were justified in purging them.

The quick fix for legacy code is to create a new header (e.g.
"legacy.h") that defines the purged macros for you.  E.g.,

   #define sbi(p,b) (p) |= (1<<(b))
   #define cbi(p,b) (p) &= ~(1<<(b))

etc.  Then #include "legacy.h" in legacy code as a stopgap measure to
get that code to compile with the new compiler.

And be sure to _NOT_ #include "legacy.h" in new code.

Regards,

                               -=Dave

[링크 : http://www.embeddedrelated.com/usenet/embedded/show/25084-1.php]


[링크 : http://winavr.sourceforge.net/]



20091022 추가>
outp(value, PORTn); 은
PORTn = valuel 로 사용하면 된다.

예를들어,
outp(0xff, PORTA); 는
PORTA = 0xff; 로 사용한다.
Posted by 구차니