embeded/ARM2010. 6. 26. 08:09
위글러는 14핀과 20핀을 주로 지원한다. 이번에 업어온게 14pin인데 내꺼는 20pin. OTL
변환젠더를 만들던 아니면 보드쪽을 20pin으로 바꾸던 해야 하는지라.. 일단 데이터 수집!
음.. 근데 14핀이 저 자주 이용되고, 20핀은 간혹인가 ㄱ-


1.7.        What is a usual JTAG header pin-out?

 

More pin-outs see at http://www.ocdemon.net/pinouts.pdf

1.7.1.   14-pin JTAG header

Usual pin-out for 14-pin JTAG header (often used for ARM)

 

1  -Vddh (+3.3v)

2  - Vss (ground)

3  - nTRST

4  - Vss (ground)

5  - TDI

6  -Vss (ground)

7  - TMS

8  -Vss (ground)

9  - TCK

10-Vss (ground)

11- TDO

12-nRESET (optional)

13- Vddh (+3.3v)

14-Vss (ground)

 

1.7.2.   20-pin JTAG header

Usual pin-out for 20-pin JTAG header (sometimes used for ARM)

1  - Vddh (+3.3v)

2  - Vddh (+3.3v)

3  - nTRST

4-Vss (ground)

5  - TDI

6-Vss (ground)

7  - TMS

8-Vss (ground)

9  - TCK

10-Vss (ground)

11 --------

12-Vss (ground)

13 –TDO

14-Vss (ground)

15 – nRST

16-Vss (ground)

17---------

18-Vss (ground)

19---------

20-Vss (ground)

 

1.7.3.   8-pin JTAG header

Usual pin-out for 8-pin JTAG header, often used for PLD programming

1 – vddh (+3.3v)

2 – TDO

3 – TDI

4 – nTRST

5

6 – TMS

7 – vss (ground)

8 – TCK


[링크 : http://hri.sourceforge.net/tools/jtag_faq_org.html#_Toc63218715]

'embeded > ARM' 카테고리의 다른 글

ARM용(암용) 툴체인, 컴파일러 - arm-linux-gcc : tool chain for ARM  (0) 2010.07.03
ARM JTAG 14pin / 20pin 변환하기  (0) 2010.07.01
Cortex-A8 ?  (2) 2010.05.10
별 시덥지 않은 이야기 (ST40 core 와 ARM)  (0) 2010.05.03
ARM JTAG DIY  (0) 2010.05.03
Posted by 구차니
embeded/ARM2010. 5. 10. 18:26
코어텍스-A8은 ARMv7 구조/아키텍쳐 기반의 프로세서이다.
300mW의 소비전력과 600Mhz~1Ghz의 클럭을 지원하며 2000 DMIPS의 프로그램을 처리할수 있다.
라고 해석하면 되려나?

Cortex-A8 Processor

The ARM Cortex™-A8 processor is based on the ARMv7 architecture and has the ability to scale in speed from 600MHz to greater than 1GHz. The Cortex-A8 processor can meet the requirements for power-optimized mobile devices needing operation in less than 300mW; and performance-optimized consumer applications requiring 2000 Dhrystone MIPS.

[링크 : http://www.arm.com/products/processors/cortex-a/cortex-a8.php]

머.. 갑자기 Cortex가 떨어진건 아니고 Cortex-M 시리즈도 있었군

ARM9은 ARMv9이 아니라 ARMv5 기반의 프로세서이다.
현재까지는 ARMv7가 가장 최신 아키텍쳐인것으로 보이며
결론은 ARM7과 ARMv7은 천지차이(결론이 이상해!)

[링크 : http://www.arm.com/products/processors/index.php]

 
[링크 : http://www.ti.com/ww/kr/embedded/arm/index.html]

DMIPS / Dhrystone MIPS
Dhrystone is a synthetic computing benchmark program developed in 1984 by Reinhold P. Weicker intended to be representative of system (integer) programming. The Dhrystone grew to become representative of general processor (CPU) performance until it was superseded by the CPU89 benchmark suite from the Standard Performance Evaluation Corporation, today known as the "SPECint" suite. The name is a pun on a different benchmark algorithm called Whetstone.

The Dhrystone benchmark contains no floating point operations, thus the name is a pun on the then-popular Whetstone benchmark for floating point operations. The output from the benchmark is the number of Dhrystones per second (the number of iterations of the main code loop per second).

[링크 : http://en.wikipedia.org/wiki/Dhrystone]

Posted by 구차니
embeded/ARM2010. 5. 3. 01:42
문득 회사에서 사용하는 JTAG인 STmicroconnect를 ARM 코어에서 사용이 가능할까?
라는 의문이 들었다.

이것저것 찾아봤지만 아마도 결론은 사용불능

일단 셋탑박스에서 사용하는 칩셋은 ARM 코어가 아닌 SH(SuperH / Hitachi core) 이라는 점
물론 ST에서 ARM 코어를 판매하지만 모델이 STi 가 아닌 STR 모델이다.

STR71x       STR71x: 144/64-pin ARM7TDMI MCU with up to 256KB FLASH, 64KB RAM and EMI
[링크 : http://www.st.com/mcu/devicedocs-STR710FZ1-86.html]

  • Samsung (ARM7/ARM9/Cortex-M3 Family)
    S3C2410A, S3C2440A, S3C44B0X, S3C4510B
  • XScale (ARM7/ARM9/ARM11 Family)
    PXA210, PXA255, PXA270
  • STMicroelectronics (ARM7/ARM9/Cortex-M3 Family)
    STR710FZ1, STR710FZ2, STR711FR0, STR711FR1, STR711FR2,
    STR712FR0, STR712FR1, STR712FR2, STR715FR0, STR730FZ1, STR730FZ2, STR731FV0, STR731FV1,
    STR731FV2, STR735FZ1, STR735FZ2, STR736FV0, STR736FV1, STR750FL2, STR750FV0, STR750FV1,
    STR750FV2, STR751FR0, STR751FR1, STR751FR2, STR752FR0, STR752FR1, STR752FR2, STR755FR0,
    STR755FR1, STR755FR2, STR755FV0, STR755FV1, STR755FV2, STR910FM32, STR910FW32, STR911FM42,
    STR911FM44, STR912FW42, STR912FW44, STR10XX, STM32F10xx
  • Analog Devices (ARM7/ARM9/Cortex-M3 Family)
    ADuC7019, ADuC7020, ADuC7021, ADuC7022,
    ADuC7024, ADuC7025, ADuC7026, ADuC7027, ADuC7032, ADuC7033, ADuC7128, ADuC7129
  • Atmel (ARM7/ARM9/Cortex-M3 Family)
    AT91C140, AT91F40416, AT91F40816, AT91FR40162,
    AT91FR4042, AT91FR4081, AT91M40400, AT91M40800, AT91M40807, AT91M42800A, AT91M43300,
    AT91M55800A, AT91M63200, AT91R40008, AT91R40807, AT91RM3400, AT91RM9200, AT91SAM7A1,
    AT91SAM7A2, AT91SAM7A3, AT91SAM7S128, AT91SAM7S256, AT91SAM7S32, AT91SAM7S64,
    AT91SAM7SE256, AT91SAM7SE32, AT91SAM7SE512, AT91SAM7X128, AT91SAM7X256, AT91SAM7XC128,
    AT91SAM7XC256, AT91SAM9260, AT91SAM9261
  • Freescale Semiconductor (ARM7/ARM9/Cortex-M3 Family)
    MAC7101, MAC7104, MAC7105, MAC7106,
    MAC7111, MAC7112, MAC7114, MAC7115, MAC7116, MAC7121, MAC7122, MAC7124, MAC7125, MAC7126,
    MAC7131, MAC7134, MAC7135, MAC7136, MAC7141, MAC7142, MAC7144
  • Luminary Micro (ARM7/ARM9/Cortex-M3 Family)
    LM3S101, LM3S102, LM3S301, LM3S310, LM3S315,
    LM3S316, LM3S328, LM3S601, LM3S610, LM3S611, LM3S612, LM3S613, LM3S615, LM3S628, LM3S801,
    LM3S811, LM3S812, LM3S815, LM3S828
  • NXP (founded by Philips) (ARM7/ARM9/Cortex-M3 Family)
    LPC2101, LPC2102, LPC2103, LPC2104,
    LPC2105, LPC2106, LPC2114, LPC2119, LPC2124, LPC2129, LPC2131, LPC2132, LPC2134, LPC2136,
    LPC2138, LPC2141, LPC2142, LPC2144, LPC2146, LPC2148, LPC2194, LPC2210, LPC2212, LPC2214,
    LPC2220, LPC2290, LPC2292, LPC2294, LPC2364, LPC2366, LPC2368, LPC2378, LPC2458, LPC2468,
    LPC2880, LPC2888, LPC3180
  • OKI (ARM7/ARM9/Cortex-M3 Family)
    ML674000, ML674001, ML674002, ML674003, ML675001, ML675002,ML675003, ML67Q4050, ML67Q4051, ML67Q4060, ML67Q4061, ML696201, ML69Q6203
  • Sharp (ARM7/ARM9/Cortex-M3 Family)
    LH75400, LH75401, LH75410, LH75411
  • TI (ARM7/ARM9/Cortex-M3 Family)
    TMS470R1A128, TMS470R1A256, TMS470R1A288, TMS470R1A384,
    TMS470R1A64, TMS470R1B1M, TMS470R1B512, TMS470R1B768

[링크 : http://www.devicemart.co.kr/mart7/mall.php?cat=010001000&query=view&no=24495]

아무튼 이녀석들이라면 Wiggler 호환 JTAG으로 사용이 가능할듯!

'embeded > ARM' 카테고리의 다른 글

ARM용(암용) 툴체인, 컴파일러 - arm-linux-gcc : tool chain for ARM  (0) 2010.07.03
ARM JTAG 14pin / 20pin 변환하기  (0) 2010.07.01
ARM JTAG - Wiggler 14pin , 20pin pinout  (0) 2010.06.26
Cortex-A8 ?  (2) 2010.05.10
ARM JTAG DIY  (0) 2010.05.03
Posted by 구차니
embeded/ARM2010. 5. 3. 01:04
암용 JTAG 중에 자작가능한 것으로 Wiggler 라는 녀석이 있다.
eleparts에서 완제품 팔기도 하고, 회로도 구해서 만들수도 있다.
예전에 주워온 PalmPalm 보드에서 지원가능한지는 모르겠다.

아무튼 74AC244 칩이 핵심인듯
그러고 보니.. AVR에는 74HC244인데 호환이 되려나?


[링크 : http://www.eleparts.co.kr/front/productdetail.php?productcode=017023007001000006&sort=]


[링크 : http://www.frozeneskimo.com/electronics/arm-tutorials/jtag-wiggler-clone/]

검색을 해보니
74HC/HCT vs.74AC/ACT

"AC / ACT stands for Advanced CMOS Logic (ACL for short).
 HC / HCT stands for High-speed CMOS Logic (HCL).

The AC and ACT subfamilies are faster than the HC and HCT subfamilies, and draw some more power in some circuits. All chips in the AC* subfamily have lower output resistance than HC* and can sink and source 24 mA at logic levels and up 70 mA (typ) per gate for motor loads. As a result AC* gates can handle more than twice the current of HC* gates (50 - 70 mA vs. 24 mA). Note, though, that while most HC* chips have a 25 mA limit, the HC* driver chips such as the 74HC240 and the 74HC245 (i.e., buffers) can handle 35 mA per device, and a maximum of 75 mA per chip.

The AC & ACT families also draw about twice as much current as the HC & HCT chips (but we speaking here of microamps, so it's usually not a huge deal).

It is occasionally possible to find (high quality) motors that you can drive directly from an HC chip. For intermittent operation, such as you get with a quadcore, you COULD drive very efficient (i.e., very low-current) motors directly. You would definitely need a capacitor (say 0.47 uF) across each motor to keep the noise under control.

[링크 : http://www.extremetesting.tv/forums/showthread.php?t=16755]

머.. 결론은 It works! 라는데.. 흐음..

아래 문서에는 74HC244로 되어있다.
[링크 : http://files.tomek.cedro.info/electronics/doc/jtag/doc/openocd_preliminary_20060102.pdf]

아무튼, PalmPalm은 PXA255 칩이고 이녀석은 ARMv5TE 계열이고 Intel XScale 인데
[링크 : http://en.wikipedia.org/wiki/XScale]

일단은 Wiggler에서 지원하니 Wiggler 호환에서도 되지 않을려나?
[링크 : http://www.macraigor.com/cpus.htm]
Posted by 구차니
원래 목적은, 임의의 인터럽트를 소프트웨어적으로 발생시키는 건데
딱히 그에 맞는 문서를 발견하지 못했다.

그와 유사한 것은
외부 인터럽트의 경우 입력으로 설정되어 있더라도, 핀값을 설정해서 임의로 인터럽트를 발동시킬수 있다고 한다.

[링크 : http://gnc.chungbuk.ac.kr/?module=file&act=procFileDownload&file_srl=38154&sid=bdc58bb2e09e0bbfb91e3d176e68a1cf]
Posted by 구차니
embeded/AVR (ATmega,ATtiny)2010. 2. 16. 22:46
별건 아니지만, 예전 프로그램을 조합+개조하여 만들어 본 녀석인데..
흐음.. 엔터를 두번이나 눌러야 하다니 이걸 어떻게 개선을 해야 하려나..

아무튼 이녀석의 목적은
- 서보모터를 시리얼 포트를 통해 값을 입력받아 제어한다.

일단 약간의 버그로 인해
- 숫자 입력후 엔터를 두번 눌러야 각도가 변경되고
- 엔터만 눌러대거나, 이상한 각도를 입력하면 서보가 길길댄다.

입력가능한 숫자 범위는 서보마다 다르겠지만
ES-311 엘레파츠의 저렴한 모터로는
32~112 값으로 0도에서 180도까지 이동이 가능하다(정확하게는 한 160도 정도 되는듯?)

Posted by 구차니
embeded/AVR (ATmega,ATtiny)2010. 1. 14. 16:00


일단은 보면 두개의 파형이 다르다.
하나는 45Hz 이고 다른 하나는 48Hz 이다...

위의 사진(45Hz)은 180도로 설정하기 위한 2000us 이고
아래 사진(48Hz)은    0도로 설정하기 위한 600us 이다. (grid 하나당 10ms)

아무튼, 20ms 간격은 맞지만, 문제는 20ms 로 반복되는 것이 아니라
20ms 이후에 신호가 나옴으로 인해서 점점 주기에서 벗어나는 문제가 발생했다.
이래저래 PWM 신호 발생 루틴을 수정해야할듯 하다.



ES-311은 원래 HS-311의 클론이고,
HS-311은 1500usec neutral에 +- 900 usec으로 제어신호를 보내면 된다.(머리 데굴데굴 0ㅁ0)

[링크 : http://www.servocity.com/html/hs-311_standard.html]

2010.02.03 추가
HS-311 은 90도 버전과 180도 버전 두가지가 존재하나 보다.

2010/01/11 - [AVR / 8051] - Atmega128에서 아날로그 서보모터 작동시키기(Atmega128 analog servo tutorial)

Posted by 구차니
embeded/AVR (ATmega,ATtiny)2010. 1. 11. 23:55
How to control analog servo using Atmega128 timer0 (8bit timer)

서보모터는, 재미난 녀석이다. 근데 다루기 쉽지는 않다 ㅠ.ㅠ
예전에 구매한 녀석으로 이렇게 생겨먹었다.

특이하게도 색이 흰색/빨강/검정이 아니라 주황/빨강/갈색이다.
빨강은 Vcc
갈색은 GND
주황은 Signal 이다.


서보 스펙
아날로그 신호를 받아들이며(아날로그 서보)
4.8V에 0.19sec/60' 대략 180도 전체 이동에 0.6sec 정도 걸린다.(생각보다 빠른거 같은데 막상보면 느리다.)

AVR 스펙
us-technology 사의 제품으로 16Mhz로 작동하며
PORTC 는 디버깅용 LED
PORTF 는 PWM 출력용으로 사용하였다.

Timer0(8bit timer)를 이용하여, PWM 신호를 만들어낸다.(Timer만으로 제어함)
[링크 : http://www.us-technology.co.kr/product/product_main.asp?mode=101&smode=2]

소스코드는 AVR BIBLE (배성중/북두출판사) 를 참고하였으며
winavr 요즘 버전에 맞추고(ISR, outp 매크로, include 경로), 클럭이 맞지않아 변수들을 수정하여 타이밍을 조절하였다.

지루한 계산
16Mhz = 16,000,000 hz 이고
서보 모터는 20ms = 0.02sec 단위로 신호를 넣어준다.
그리고 PWM 신호는 0.5ms ~ 2ms 사이의 길이를 넣어주면 0 ~ 180도의 각도로 이동한다.
(책에는 1.5ms 에서 길거나 짧거나 라고 하는데 서보마다 다른듯.. 데이터 시트에도 없다 ㄱ-)

일단 8bit timer를 사용함으로 256 clock 마다 overflow를 발생시키며
    16,000,000(clock/sec) / 256 = 62,500 times
1초에 62,500 번의 overflow가 발생하게 된다.
    1/62500 = 0.000016 sec 이며
    62500/50 = 1250 이다.(20ms 는 1초에 50회)
즉, 256번씩의 overflow를 1250번 반복하게 되면 0.02sec = 20msec 간격을 잡을수 있다.
그리고 1msec는 62.5 인터럽트가 모이면 되고,
실험적으로 서보에서 사용하는 PWM의 width를 얻어내면 된다.

엘레파츠 ES-311 서보에서
     0도는 0.512ms = 32 overflows
    90도는 1.216ms = 76 overflows
    180도 1.792ms = 112 overflows

아무튼 위의 값은 정확한건 아니지만.. (ㄱ-) 대략적으로 맞아들어가며
0도와 180도의 하한/상한을 찾은뒤 평균내면 90도가 잡아진다.(레드썬!)
(위의 값으로는 180도 쪽이 약간 5도 정도 부족해 보이나,
끽끽대며 더이상 가지 못하는 문제가 있어 실질적으로 90도를 약간 좌측으로 수정해야 하지 않을까 싶다.)

대충의 계산방식이 들어있는 스프레드시트 파일.
클럭과 timer overflow 에 필요한 clock을 입력하면 된다.



Posted by 구차니
타이머는 처음인데.. 머가 먼지 모르겠다 ㅠ.ㅠ
#include "stdio.h"
#include "avr/io.h"
#include "avr/interrupt.h"
#include "util/delay.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(UCSR0A, UDRE);
  UDR0 = c;

  return 0;
}

#define OVERFLOW 256
#define TICKS_PER_SEC 1000
#define Prescaler 64

volatile unsigned int tic_time;

ISR(TIMER0_OVF_vect)
{
	tic_time++;
	TCNT0 = OVERFLOW - (F_CPU / TICKS_PER_SEC / Prescaler);
}

int main(void)
{
	/* for USART */
	UBRR0H = 0;
	UBRR0L = 8; // 115k with U2X = 0
	UCSR0A = 0x00; // U2X = 0;
	UCSR0B = 0xD8;
	UCSR0C = 0x06; //Asyncronous - no parity - 1bits(stop) - 8bits(data)

	DDRD = 0x00;

	stdout = &mystdout;

	TCCR0 = 0x04;     // Prescaler 설정
	TCNT0 = OVERFLOW - (F_CPU / TICKS_PER_SEC / Prescaler);// 오버플로우에 사용될 초기값
	TIMSK = 0x01;     // 오버플로우 인터럽트 허용
	sei();

	int count = 0;
	for(;;)
	{
		if(tic_time == 1000)
		{
			tic_time = 0;
			printf("c %d\n",count++);
		}
	}
    return 0;
}
일단 사용법을 몰라서. 구글 검색하다 나온 rcan 님의 블로그 내용을 일단 복사해서 붙여넣었다.
[링크 : http://rcan.net/560]


기본적인 내용은 printf() 사용하는 것들이고, F_CPU는 cpu 클럭에 관한 선언문으로
AVRStudio wizard 사용시 클럭을 넣어주면 생성되는 변수이다.

타이머 관련 내용은 다음과 같다.

ISR(TIMER0_OVF_vect) // 8bit Timer0 에 대한 인터럽트 루틴
TCCR0;             // 타이머 프리스케일러
TCNT0;             // 타이머/타운터용 초기값
TIMSK;              // 타이머 오버플로우시 인터럽트 발생

일단 TCCR0를 보자면


타이머/카운터 제어용 레지스터로서,

Bit 7 – FOC0: Force Output Compare
Bit 6, 3 – WGM01:0: Waveform Generation Mode
Bit 5:4 – COM01:0: Compare Match Output Mode
Bit 2:0 – CS02:0: Clock Select

에 대한 설정을 하게 된다.

TCCR0 = 0x04 에서 0은 WGM01:0=0 으로 아래의 테이블을 보면(엄밀하게는 0x48 값의 위치이다)
Timer/Counter Mode of OperationNormal로 되어있다.

이 모드에서는 0에서 부터 255까지(8bit 타이머) 증가하며,
별도의 카운터 값 리셋은 하지 않으나 오버플로우 된상태로 계속 더하므로,
실질적으로 255다음에 0부터 계속 증가하게 된다. (TCNT0는 수정하는 즉시 그 값부터 증가하게 됨)


TCCR0 = 0x04 에서 4는 CS02=1로 아래의 테이블을 보면
clkT0S/64 (From prescaler) 라고 되어있다. 즉, 입력 클럭을 64로 나누어서 느긋하게 증가시킨다.




그리고 TCNT0
카운트를 위한 변수이고, 8bit timer/counter 이므로 0x00 에서 0xFF 즉, 0 에서 255 값을 가지며
255가 되면 overflow interrupt를 발생시킨후 0부터 다시 숫자를 증가시킨다. (normal mode)

그런데 이 변수에 복잡한 수식으로 값을 넣는 이유는 정확한 시간을 발생하기 위해서이다.
클럭마다 다르겠지만, 일단 클럭을 위에서 1/64로 주므로 64 clock 마다 1씩 증가된다.
16Mhz 에서 64clock 마다 인터럽트를 생성하면(F_CPU / Prescaler) 1초에 250,000 번 발생하게 되고
이 오버플로우 갯수를 세어 1000번을 묶으면 (tic_time == 1000 그리고 F_CPU / TICKS_PER_SEC / Prescaler)
1초에 250번의 오버플로우가 발생하게 된다.
그런데 오버플로우 값은 255 까지(총 256) 이므로, 0부터 증가해서 255까지 timer를 증가시키면
1초가 맞지 않게 되므로, TCNT0의 값을 OVERFLOW - 250 으로 하여 초기값을 맞춰주게 된다.
결과적으로 TCNT0의 값은 6이 된다.
(음.. OVERFLOW가 255여야 하지 않을려나..)



그리고 TIMSK는 이름대로 타이머 인터럽트 마스크 레지스터로,

Bit 1 – OCIE0: Timer/Counter0 Output Compare Match Interrupt Enable
Bit 0 – TOIE0: Timer/Counter0 Overflow Interrupt Enable

오버플로우시에 인터럽트를 발생시키거나
OCR0(Output Compare Register) 값과 TCNT0의 값이 동일할때 인터럽트를 발생시키도록 설정한다.

TIMSK = 0x01; 이므로 TOIE0가 설정되었고, 이 값은 overflow 시에만 인터럽트를 발생시키도록 한다.


Posted by 구차니

서보에 주어야 하는 데이터는 20ms 간격, 개당 2.5ms 씩
그런 이유로 1개의 타이머로 제어시 최대 8개 까지 가능
Posted by 구차니