Страница 1 из 2

Применение CKOUT фьюза с практической точки зрения и 74НС595

Добавлено: Сб окт 05, 2013 21:22:51
c2n
Доброго дня.
Повышая свой маленький уровень,задался я таким вопросом:

У тини2313 иммется фьюз CKOUT, выставив который, на ноге, в случае 2313 - PD2, получается тактовый сигнал, который можно применить, например, для жесткой синхронизации нескольких МК между собой.

Изображение

решение мне известное....

Возник вопрос: А можно ли от этого сигнала тактировать например сдвиговые регистры?
Изображение
например вот так.
очевидно, что при такой схемотехнике - отпадает необходимость городить в программном коде генератор тактовых импульсов.

Для проверки этой идеи я взял ТИНИ2313, выставил ей фьюзы:
Изображение
ограничив частоту по минимуму.

Загнал не хитрую программку в память:

Код: Выделить всё

#include <avr/io.h>

int main(void)
{
	
	DDRD =  1;
	PORTD = 0;
    while(1)
    {
	PORTD = 1;
	PORTD = 0;
    }
}
и подцепился логическим анализатором, Осциллограф - ВМ8020 мастеркит - другого увы нет :(
результат - очень огорчил:


А0 и красный график - выход CKOUT
А1 и синий график - нога МК

Изображение

При этом - данная картинка подтверждается осциллограммой:
Изображение

получается, что мое ожидание:
Изображение

было напрасным? и данную возможность можно применять только для тактирования ядер микроконтроллеров?
Может быть я не до выставил чего нибудь? какой нибудь регистр надо хитро настроить, перед запуском цикла???
подскажите пожалуйста.

В интернете я ответа на данный вопрос не нашел.

Дополнительно интересно - почему на такую простую операцию уходит 4 такта? во всех учебниках пишут - один.

Компилятор и программатор - фирменный: Атмел Студия 6 и Драгон

при этом фьюз CKDIV8 - уменьшает скорость в 8 раз - это правильно? и для чего это нужно?

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Сб окт 05, 2013 21:55:41
Леонид Иванович
c2n писал(а):Дополнительно интересно - почему на такую простую операцию уходит 4 такта?
Посмотрите, во что это компилится. Две команды обращения к порту и команда перехода для организации цикла. Всё правильно. Использовать CKOUT для тактирования сдвигового регистра не получится.

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Сб окт 05, 2013 22:01:02
c2n
Жалко конечно, что с тактированием регистров - облом.

Подскажите тогда как считать такты для кода на C++.
АСМ пока не освоил :(

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Сб окт 05, 2013 22:15:25
ILYAUL
Открыть дизasm - посмотреть применённые команды asm - открыть DS - посмотреть сколько тактов тратит проц на исполнения каждой команды - сложить. Знание asm не требуется

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Сб окт 05, 2013 22:50:35
c2n
помогло :) местами.... :oops:

только не понял магии перехода в начале:

Код: Выделить всё

rjmp   L002E
порядка 20 раз.
нафиг он это делает? какой то бессмысленный цикл...

ну и судя по дизасемленутому - сишный код - больно громоздкий, и явно не в одно выполняться должно...

Код: Выделить всё

;	DDN Research [http://ddn.at.ua/]
;	DiAVR Generated Assembler Listing
;	Date: 10-05-2013 || Time: 23:43:48
;	Search File: .....AVR\PWMATTINY2313\GccApplication1\GccApplication1\Debug\GccApplication1.hex
;	 
;	 
0x0:		rjmp +0x28	 ;Relative Jump   PC<-PC + k +1, send to 0x2A  
0x2:		rjmp +0x58	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x4:		rjmp +0x56	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x6:		rjmp +0x54	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x8:		rjmp +0x52	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0xA:		rjmp +0x50	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0xC:		rjmp +0x4E	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0xE:		rjmp +0x4C	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x10:		rjmp +0x4A	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x12:		rjmp +0x48	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x14:		rjmp +0x46	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x16:		rjmp +0x44	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x18:		rjmp +0x42	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x1A:		rjmp +0x40	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x1C:		rjmp +0x3E	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x1E:		rjmp +0x3C	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x20:		rjmp +0x3A	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x22:		rjmp +0x38	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x24:		rjmp +0x36	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x26:		rjmp +0x34	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x28:		rjmp +0x32	 ;Relative Jump   PC<-PC + k +1, send to 0x5C  
0x2A:		eor r1, r1	 ;Exclusive OR Registers  Rd <- Rd ffl Rr
		; equivalent function = clr r17	 ;Clear Register  Rd <- Rd ffi Rd
0x2C:		out  0x3F, r1	 ;Out Port    P<-Rr
0x2E:		ldi r28, r15	 ;Load Immediate  Rd <-K
0x30:		out  0x3D, r28	 ;Out Port    P<-Rr
0x32:		ldi r1, r0	 ;Load Immediate  Rd <-K
0x34:		ldi r10, r16	 ;Load Immediate  Rd <-K
0x36:		ldi r11, r0	 ;Load Immediate  Rd <-K
0x38:		ldi r14, r30	 ;Load Immediate  Rd <-K
0x3A:		ldi r15, r0	 ;Load Immediate  Rd <-K
0x3C:		rjmp +0x4	 ;Relative Jump   PC<-PC + k +1, send to 0x42  
0x3E:		push r0, Z+	 ;Load Program Memory and Post-lnc    Rd <- (Z), Z <- Z+1
0x40:		st X+, r0		 ;Load Indirect  ;Store Indirect
0x42:		cpi r26,  0x50	 ;Compare Register with Immediate Rd-K
0x44:		cpc r27, r17	 ;Compare with Carry  Rd-Rr-C
0x46:		brbc  0x1, -0xA	 ;Branch if Status Flag Cleared => if (SREG(Z)=0) then goto 0x3E
Equivalent: 	breq -0xA ;Branch if Equal if(Z=1)thenPC<-PC + k + 1
0x48:		ldi r1, r0	 ;Load Immediate  Rd <-K
0x4A:		ldi r10, r16	 ;Load Immediate  Rd <-K
0x4C:		ldi r11, r0	 ;Load Immediate  Rd <-K
0x4E:		rjmp +0x2	 ;Relative Jump   PC<-PC + k +1, send to 0x52  
0x50:		st X+, r1		 ;Load Indirect  ;Store Indirect
0x52:		cpi r26,  0x50	 ;Compare Register with Immediate Rd-K
0x54:		cpc r27, r17	 ;Compare with Carry  Rd-Rr-C
0x56:		brbc  0x1, -0x8	 ;Branch if Status Flag Cleared => if (SREG(Z)=0) then goto 0x50
Equivalent: 	breq -0x8 ;Branch if Equal if(Z=1)thenPC<-PC + k + 1
0x58:		rcall +0x4	 ;Relative Subroutine Call, me goto: 0x5E  
0x5A:		rjmp +0xE	 ;Relative Jump   PC<-PC + k +1, send to 0x6A  
0x5C:		rjmp -0x5E	 ;Relative Jump   PC<-PC + k +1, send to 0x0  
0x5E:		ldi r8, r1	 ;Load Immediate  Rd <-K
0x60:		out  0x11, r24	 ;Out Port    P<-Rr
0x62:		out  0x12, r1	 ;Out Port    P<-Rr
0x64:		out  0x12, r24	 ;Out Port    P<-Rr
0x66:		out  0x12, r1	 ;Out Port    P<-Rr
0x68:		rjmp -0x6	 ;Relative Jump   PC<-PC + k +1, send to 0x64  
0x6A:		cli		;no comments
0x6C:		rjmp -0x2	 ;Relative Jump   PC<-PC + k +1, send to 0x6C - Maiby, this is a Stop Program
и другой программкой:

Код: Выделить всё

; reassembly of "GccApplication1.hex"
; created by ReAVR V3.2.0
; at 2013/10/05 - 23:44:13
; for ICCAVR assembler
;---------------------------------------
; AVR_TYPE=<unknown>
; FLASH_SIZE=8KB
; SRAM_START=0x60
;---------------------------------------
	.area	text
;; older iccavr need different setup:
;;	.area	text (abs,ovr)
;;	.org	0x0000
;---------------------------------------
; byte constants:
;
k00	= 0x00	;
k01	= 0x01	;
k60	= 0x60	; '`'
k6E	= 0x6E	; 'n'
kDF	= 0xDF	; 'Я'
;
; io register addresses:
;
p11	= 0x11
p12	= 0x12
p3D	= 0x3D
p3F	= 0x3F
;
; bit numbers:
;
b0	= 0x00
b1	= 0x01
b2	= 0x02
b3	= 0x03
b4	= 0x04
b5	= 0x05
b6	= 0x06
b7	= 0x07
;---------------------------------------
;
L0000:
	rjmp	__start	; L0015
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
	rjmp	L002E
;	-----------	jump on last line
;
__start::
; L0015:
	clr	r1
	out	p3F,r1
	ldi	r28,kDF
	out	p3D,r28
	ldi	r17,k00
	ldi	r26,k60
	ldi	r27,k00
	ldi	r30,k6E
	ldi	r31,k00
	rjmp	L0021
;	-----------	jump on last line
L001F:
	lpm	r0,Z+
	st	X+,r0
L0021:
	cpi	r26,k60
	cpc	r27,r17
	 brne	L001F
;	-----		branch on last line
	ldi	r17,k00
	ldi	r26,k60
	ldi	r27,k00
	rjmp	L0029
;	-----------	jump on last line
L0028:
	st	X+,r1
L0029:
	cpi	r26,k60
	cpc	r27,r17
	 brne	L0028
;	-----		branch on last line
	 rcall	L002F
	rjmp	L0035
;	-----------	jump on last line
L002E:
	rjmp	L0000
;	-----------	jump on last line
L002F:
	ldi	r24,k01
	out	p11,r24
	out	p12,r1
L0032:
	out	p12,r24
	out	p12,r1
	rjmp	L0032
;	-----------	jump on last line
L0035:
	cli
L0036:
	rjmp	L0036
;	-----------	jump on last line
; pc=0x37(0x6E)
;
__text_end::
;
; last flash byte address = 0x006D
; last flash word address = 0x0036
;---------------------------------------
; Code not seems to use any RAM.
;---------------------------------------
;<eof>

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Вс окт 06, 2013 03:09:55
Eugene.Negrobov
А что мешает подключить регистр прямо к аппаратному SPI?
Я таким образом 7-сегментники драйвить привык. Скорости передачи можно получить просто сумасшедшие, вплоть до двенадцати мегабит, если кварц будет на 24 МГц.

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Вс окт 06, 2013 10:27:22
c2n
а SPI положим занят уже. Если у меня сеть контроллеров, и часть из них лишены USART?
Вывод на экран осуществляется с одного МК? Ну и если у меня не семисегментник?... ну в общем тут много всяких НО.. Спасибо за разъяснения :)

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Вс окт 06, 2013 11:27:45
Kavka
Мнда, с 595-м регистром это ещё надо успеть дёрнуть защёлкой, при непрерывном тактовом, чтобы на выход попало то что надо. Сразу можно было отбрасывать этот вариант.
Как мне кажется, более вероятно получить нормальный результат если генерировать такты с помощью таймера (output compare unit). Выход можно включать и отключать, когда надо. Вот только параметры таймера и количество тактов на вывод бита всё равно надо будет подбирать/подгонять.

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Вс окт 06, 2013 15:19:47
Eugene.Negrobov
c2n, на то и придумали Chip Select, дабы к SPI можно было сколько угодно всего подключать.

P.S.
По моему подрубать сдвиговый регистр куда угодно, кроме аппаратного SPI- это полный бред. Более удобного способа драйва просто не найти. Ну и плюс можно прямо байты на SPI кидать, аппаратная часть сама все сделает.

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Вс окт 06, 2013 20:09:05
nirq
магии перехода в начале
По-умному это "вектора прерываний", а попроще и не сформулировать.

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Вс окт 06, 2013 20:19:56
vek
и по неумному тоже:-) можешь нафиг рджампы эти затереть:-)

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Вс окт 06, 2013 20:42:44
vek
c2n писал(а): порядка 20 раз.
нафиг он это делает? какой то бессмысленный цикл...
Си не дает вам понять как работает контроллер изнутри.
Дело в том что обработчик прерываний пишется во флеше,причем где угодно.
Когда вызывается прерывание,этот дебильный кусок кремния не знает где находится обработчик.Поэтому он прыгает куда-то в начало,причем не абы-как,а по нужному вектору(!).Например по ресету програмный счетчик прыгает в самый 0-й адрес,а если сработает вход захвата,то на 3-й,и т.п.
А вот тут-то мы пишем команду-прыгун RJMP и указываем куда нам надо прыгнуть для обработки прерывания.
Обычно в этой области флеша ничего полезного не пишут,потому-что если где-то каким-то,по какой-то причине,например марс окажется в козероге, вылезет запрос на прерывание,то прога прыгнет на вектор и продолжит выполняться с адреса вектора. И задолбаешься эту ошибку ловить.Из этой ситуации есть простой выход - за джампить все на ресет, что-б вместо неправильной работы получить ваашпе перезагруз

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Вс окт 06, 2013 23:25:45
c2n

Код: Выделить всё

Си не дает вам понять как работает контроллер изнутри.
КУ!!!!111одинодинодин


а что надо почитать? керниган-ритчи найду?
це 20 пририваний изнутри
так бы сразу и сказали....

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Вс окт 06, 2013 23:29:23
c2n
угу и все 20 в себе и сами на себя О-о

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Вс окт 06, 2013 23:30:08
c2n
АААААААААААААААааааааааааааа говорящий я = c2n

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Пн окт 07, 2013 04:46:10
vek
http://radiokot.ru/start/mcu_fpga/avr/ сойдет?

Видите-ли.Контроллер не понимает что такое if,while и т.п. и т.д. контроллер
понимает эллементарные инструкции что-то вроде 0110001110111011(это HEX-ом
называют)подавляющее большинство из которых действительно выполняются за 1 такт.
только проблема в том что мы теперь перестаем понимать что это значит :)
Так вот,умный С#компилятор в итоге переделает наш код в конструкцию из таких -вот нулей
и единиц.
Ассамблер - это такой язык который чуть-чуть более наглядно(согласитесь приятнее писать/читать rjmp MAIN вместо 1100000000010010 - что одно и то-же) чем это зашито во флеше описывает происходящее.В связи с этим всплывает нужность в понимании асм-а(Не нужно быть джедаем 80-го уровня по асм-у просто немного понимать чего к чему) и будет вам счастье. Есть такая книжка " Создаем устройства на
микроконтроллерах (Белов)(2007) " - Там самые азы объясняются на 2-х языках

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Пн окт 07, 2013 05:04:49
Kavka
vek писал(а):что-то вроде 0110001110111011(это HEX-ом называют)
Vek, вы, наверное, имели в виду двоичные данные, точнее их представление в виде записи с помощью символов "0" и "1"?
Если вы имели в виду расширение файла в котором генерируется прошивка (.hex), то это всего лишь ещё один вариант хранения двоичной "прошивки" для МК. А сокращение "hex" происходит от слова "hexadecimal" (по русски: тыц).

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Пн окт 07, 2013 06:33:55
c2n
а вот за книжечку спасибо :) надо будет при случае прикупить :)

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Пн окт 07, 2013 07:24:42
vek
Ну да.имел ввиду именно двоичные данныные,просто хотел этим слегка подчеркнуть
что контроллер считает внутри именно 0-ми и 1-ками.Надеюсь что больше подсказал,чем запутал

Re: Применение CKOUT фьюза с практической точки зрения и 74Н

Добавлено: Пн окт 07, 2013 08:45:44
c2n
то что внутри у МК двоичный код - это мы знаем...
И отличие BIN, OCT, DEC, HEX - между собой представляем :)
Специальность у меня - АСОиУ. А электроникой увлекаться начал, ибо это интересней чем просто информационные системы разрабатывать...
Естественно нам, в том объеме, электронику не читали, и сдавали мы ее... :oops:... соответственно.
а вот к диплому - заразился :)

Естественно курса по ASM у меня небыло, и некоторые простые конструкции вызвают у меня благоговейный ужЫс.