Страница 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
помогло

местами....
только не понял магии перехода в начале:
порядка 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 - между собой представляем

Специальность у меня - АСОиУ. А электроникой увлекаться начал, ибо это интересней чем просто информационные системы разрабатывать...
Естественно нам, в том объеме, электронику не читали, и сдавали мы ее...

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