Перейти к содержанию

Вопрос По Программе Джона Мортона "частотомер"


Рекомендуемые сообщения

Не 20, а 20000. Использовал знак ` для отделения разрядов, иначе считать неудобно.

Я так и понадеялся, что 20`000`000 делить на 1000 вы умеете :-)

Осталось ответить на вопросы. Они связаны с задачей.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 107
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Схема только для протеуса,принцип работы-подсчет импульсов за 1 сек.Предел измерения не велик но для понимания асм вполне подходит .Т0-для динамической индикации,Т1 для подсчета,после 1 сек идет преобразование (спасибо за программу-) в dec числа .Вывод на индикатор-непрерывный цикл.Для изменения частоты "мерцания" индикаторов изменить count_pause.Недостатки-нужно использовать Т0 для подсчета времени (и уменьшить время в 10 раз) а Т1 для подсчета импульсов,тогда в прерываниях будет минимум,но для динамической индикации надо вставлять "пустые" циклы,или брать мега8 с 3 таймерами.Плюс-простая программа,ну и возможность (немного изменить или кнопку) простого подсчета импульсов .Последний разряд "плавает" на единицу- из-за прерывания с высокого на низкий (заметил при отключении Т1 и сбросе счетчика.Первые 2 разряда не нужны-столько частоту не покажет,только сумму,простой счетчик

частотомер.zip

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

rcall bin_bcd_ram;ïåðâûé ïåðåâîä hex-dec,äàëåå ïîñëå êàæäîãî âûâîäà èíäèêàòîðà
Сохраните в unicode, чтобы можно было читать комментарии.

Кроме того, очевидно, вы не читали тему. Готовый код уже есть: подсчет импульсов в течении 1 мс для диапазона 1 кГц - 9999 кГц (теоретический максимум для тактовой частоты 20 МГц) и в течении 100 мс для диапазона 0.01 кГц - 99.99 кГц. Схема тоже есть, приведена в первом же сообщении. Кстати, вам бы тоже не мешало ее привести. Не модель протеуса, а именно схему, картинкой.

Сейчас я пытаюсь объяснить Dastan89, как работает частотометр, в частности, режимы таймеров.

Анализировать ваш код целиком мне лень, но пару моментов рассмотреть стоит. В основном по форматированию.

.macro nomber0 outi portb,0b00111111

.endm

.macro nomber1 outi portb,0b00000110

.endm

.macro nomber2 outi portb,0b01011011

.endm

Какой смысл делать макрос ради одного действия? Они предназначены для сокращения объема исходного кода за счет скрытия повторяющихся фрагментов. Макрос outi хороший пример, особенно если его допилить до более универсального (когда надо адресовать регистры, отображаемые в ОЗУ):

.macro outi
   ldi r16,@1 ;именно r16, а не temp - мало ли что этим temp'ом назовут.
   .if @0<0x40
       out @0,r16
   .else
       sts @0,r16
   .endif
.endm
.macro ini
   .if @1<0x40
       in r16,@1
   .else
       lds r16,@1
   .endif
.endm

Второе - изменить соответствие сегмента номеру порта при вашем подходе довольно сложно. Сравните с вот этим вариантом.

cpi data,0

breq out_n0

cpi data,1

breq out_n1

Форматирование куда-то сползло, очевидно, все проверки должны быть одна под другой, а вот прыжки можно и выделить. Кроме того, вы проверяете каждую цифру 1-10 раз вместо прямого чтения из памяти по заданному адресу.

;вывод цифры в заданную позицию, с преобразованием число-код

DIG2STR: ;led_num - position. temp - value
 ldi ZH,high(INT2LED*2)  ;адрес кодов цифр в ПЗУ
 ldi ZL,low(INT2LED*2)
 add ZL,temp ;переходим к нужной цифре простым сложением
 ldi temp,0
 adc ZH,temp ;правим старший байт, если при сложении младший оказался переполнен
 lpm temp,Z ;загружаем код символа в регистр temp
 ldi ZH,0 ;адрес начала "видеобуфера" в ОЗУ
 ldi ZL,digit
 add ZL,led_num ;переходим к нажному разряду (здесь корректировать старший байт не нужно)
 st Z,temp ;и записываем туда код символа
ret

st -z,r19

pop r20

push r20

clt

Что хотели выделить здесь таким образом мне вообще непонятно.
int1_ok:
По моим приблизительным подсчетам, прерывание обрабатывается за 40 тактов. То есть максимальная измеряемая частота - 500 кГц, при максимальной теоретической 10 МГц (половина тактовой). А поскольку контроллер и сам небыстрый, имеет смысл выжимать максимальные допустимые параметры. Тем более, что он обладает соответствующим аппаратным модулем: оба таймера можно тактировать от внешнего сигнала.
outi tccr0b,0b00000101 ;1024 -15624

outi tccr1b,0b00001101 ;1024 ctc

За такое по рукам бить надо. Что это за магические двоичные числа? Что мешало указать биты напрямую?

outi TCCR1B, (0b011<<CS10) ;F_CPU/64

.org 0

;---------------

rjmp init

;--------------------

init:

.macro outi

Объявлять макросы внутри процедуры инициализации? Нет, правиламя языка это не запрещено, но обычно все-таки выносят наружу, чтобы не мешались.
но для динамической индикации надо вставлять "пустые" циклы,или брать мега8 с 3 таймерами.
А что мешало вынести динамическую индикацию в бесконечный цикл? Там частота не важна. А, хотя она туда и вынесена, но зачем-то завязана на Timer0. Кроме того, непонятно, зачем ее делать такой громоздкой, когда можно было за один проход цикла отображать одну цифру.

DISPLAY:
 ldi ZH,0  ;переходим к началу "видеопамяти"
 ldi ZL,(digit)
 add ZL,led_num ;сдвигаемся к нужному разряду
 ldi temp,0b00001111
 out PORTD,temp    ;сначала отключаем все разряды
 ld temp, Z
 out PORTB,temp    ;потом меняем включенные сегменты
 adiw ZL,4
 ld temp, Z
 out PORTD,temp    ;и наконец включаем нужный разряд
 inc led_num
 andi led_num,3   ;именно для "круглого" числа разрядов (4 в данном случае) проще обрезать счетчик по маске, чем делать явную проверку
 ldi temp,0
 DISPLAY_WAIT:        ;чтобы не переключалось слишком быстро, поставим задержку
   dec temp
   brne DISPLAY_WAIT
ret

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

я прочитал тут, для того чтобы гибко можно было делить частоту выберем масштабированый системный тактовый сигнал clkT1=clk(io)/N.

И выберем режим стс сброс при совпадении.

Ссылка на комментарий
Поделиться на другие сайты

Какой смысл делать макрос ради одного действия?

Для других программ (скопировал из своей старой). По поводу temp-он почти у всех временный,не сохраняется.

Что хотели выделить здесь таким образом мне вообще непонятно.

был случай когда этот же регистр изменился при записи в лсд (там был указателем адреса).Представьте что было со стеком

За такое по рукам бить надо. Что это за магические двоичные числа? Что мешало указать биты напрямую?

учился по книгам Белова,привык,но можно и переписать.

А что мешало вынести динамическую индикацию в бесконечный цикл? Там частота не важна. А, хотя она туда и вынесена, но зачем-то завязана на Timer0. Кроме того, непонятно, зачем ее делать такой громоздкой, когда можно было за один проход цикла отображать одну цифру

.

делал такое-получалась слишком большая частота показа индикатора и изображение "расплывалось",помогла только пауза (в железе!!),в протеусе может и не видно. Учту на будущее.Хотя все таки спаяю платку,посмотрю что будет.

Изменено пользователем den2313
Ссылка на комментарий
Поделиться на другие сайты

N может принимать всего несколько значений: 1, 8, 64, 256 и 1024. А нам нужно 20000. Либо 2000000 (для 10 Гц).

Ладно, видимо, придется уже дать ответ. Применить можно любой из режимов - просто потому, что нам не нужно больше одного периода, и аппаратный вывод сигнала мы не используем, а в этом диапазоне они ведут себя одинаково. В качестве ответа я ожидал либо "любой", либо CTC, там даже дана формула частоты: f = F_CPU/(2*N*(1+OCRxA)).

Однако, проще использовать режим Normal, именно потому что он самый простой.

С 3 вопросом тоже все просто - используем предделитель.

1:1 даст частоту тактирования 20 МГц и необходимый делитель 2000000 (для результирующей частоты 1 Гц). Он не влезает в 2 байта.

1:8 даст частоту 2.5 МГц и делитель 250000. Тоже не влезает.

1:64 даст частоту 312500 и делитель 31250. Уже подходит! Но, может, найдется получше?

1:256 даст частоту 78125 и делитель 7812.5, а это уже дробное число, которое в регистр не записать

1:1024 даст частоту 19531,25 и делитель 1953,125. То есть опять дробное число.

Таким образом из всего многообразия нас устроил только вариант N = 64, (1+OCR1A)=31250.

.

Сможете написать программу, чтобы прерывание по сравнению с OCR1A генерировалось с частотой 1 кГц, то есть с интервалом в 1 мс?

ldi zh,0

ldi zl,0x65

ld data,z ;1

А чем lds не устроил?

На счет задержки - у меня вставлена на 256 тактов. Я исходил из того, что гасим предыдущий разряд, пауза на извлечение следующего, зажигаем следующий. А потом сразу надо обрабатывать следующую итерацию цикла, то есть сразу гасить. Так хоть 256 тактов гореть будет (если прерывание влезет - несколько больше).

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Попробую завтра переписать , как вы сказали- таймера на время и подсчет а паузу-на динамическую индикацию. lds использую в старших контроллерах (m64)

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

Изменено пользователем den2313
Ссылка на комментарий
Поделиться на другие сайты

Так а здесь lds чем не угодил? В вашем коде идет 5 байт, 3 такта, 3 команды и использование регистра Z, а с lds 4 байта, 2 такта и 1 команда.

Ладно, вот мой вариант прошивки.

main.asm.tar.gz

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Я видел эту формулу F_CPU/(2*N*(1+OCRxA)) Но расскажите откуда вы взяли это (1+OCR1A)=31250?

Уточню вопрос, где вы взяли число 31250?

Ничего не понимаю, мы узнали что предделитель 64 так, так число в OCRxA=31250 так,так! Как по этой формуле считать???? если 20 000 000/(2*64*(1+31250))=5 ???????

А лучше распишите как вы брали числа и подставляли в эту формулу.

Это же вообще все нелогично.

Ссылка на комментарий
Поделиться на другие сайты

Сможете написать программу, чтобы прерывание по сравнению с OCR1A генерировалось с частотой 1 кГц, то есть с интервалом в 1 мс?

ldi zh,0

ldi zl,0x65

ld data,z ;1

А чем lds не устроил?

На счет задержки - у меня вставлена на 256 тактов. Я исходил из того, что гасим предыдущий разряд, пауза на извлечение следующего, зажигаем следующий. А потом сразу надо обрабатывать следующую итерацию цикла, то есть сразу гасить. Так хоть 256 тактов гореть будет (если прерывание влезет - несколько больше).

Это вы мне или другому собеседнику? Если мне то, в самоучителе обычно приводил кусок кода который делает аналогичную операцию. Я ведь новичек и не знаю как составить с нуля программу.
Ссылка на комментарий
Поделиться на другие сайты

5 Гц это частота на выходе. За 1 период выходной частоты прерывание возникает 2 раза. В первый переключает выход с лог.0 в лог.1, во второй - наоборот. То есть частота возникновения прерывания - 10 Гц.Можно зайти и с другой стороны. Тактовая частота контроллера 20 МГц, после делителя остается 312500 Гц, то есть период 3,2е-6 с. Делим желаемый период 0.1 с на период колебаний таймера, получаем 31250, то есть именно столько периодов тактового сигнала укладывается в 0.1 с.Только не OCR1A = 31250, а (1+OCR1A) = 31250.

Предложение lds'а относилось к den2313, это кусок его кода. Использование ld выгоднее для доступа к изменяемому адресу, либо когда много записей последовательно, как я предлагал для масок катодов.

ldi XH,0
ldi XL,num_mask
ldi temp,0b00001110
st X+,temp
ldi temp,0b00001101
st X+,temp
ldi temp,0b00001011
st X+,temp
ldi temp,0b00000111
st X+,temp

вместо

ldi temp,4
sts Digit ,temp ;загрузка начальных значений
ldi temp,3
sts Digit+1,temp
ldi temp,2
sts Digit+2,temp
ldi temp,1
sts Digit+3,temp

В качестве упражнения можете посчитать, сколько байтов и тактов занимают оба варианта. У меня получилось 10(5) и 16(8).

Изменено пользователем COKPOWEHEU

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Частоту CTC-сигнала да.

Осталось написать код, инициализирующий Timer1 на частоту прерывания 1 кГц и по этому прерыванию останавливающийся. В принципе, можно потом сразу перезапустить, но пока усложнять не будем.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Неужели проблема написать прошивку с использованием прерывания? Все необходимые регистры настроек таймера (OCR1AH, OCR1AL, TIMSK, TCCR1B) прописаны у Евстифеева.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Вопрос к COKPOWEHEU: кварц 12мГц,таймер Т1 считает время 1 секунду, таймер Т0-количество импульсов. При переполнении Т0 "adiw XL,1" после достижения 1 секунды первое это из Т0 в регистр (r16) далее перевод в десятичные числа,(r16,r17,r18-три байта). Пара XL нигде в цикле не используется . Если в протеусе задам фиксированные числа (r16,r17,r18) без прерывания ,то показывают правильно,если подаю частоту до 249кГц то в протеусе все правильно,но если выше (250кГц) -показывает неверно,где может быть ошибка,вроде все верно? (хотел собрать эту схему)

chast3.zip

Ссылка на комментарий
Поделиться на другие сайты

Вы не сохраняете SREG, он может портиться в прерываниях. Попробуйте сначала исправить это.

overT0:
 push temp
 in temp,SREG
 adiw XL,1
 out SREG,temp
 pop temp
reti

Форматирование как было кошмарным, так и остается. Блоки выделены не по смыслу, а скорее по рандому.

Запись в двухбайтный регистр единого числа, а не набора битов, лучше осуществлять в десятичном виде и с использованием макросов high, low и комментариев

outi OCR1AL, low(46875)
outi OCR1AH,high(46875)

А еще лучше использовать макрос и для расчета константы

.equ F_CPU = 12000000
.equ OCR1 = F_CPU/256
outi OCR1AL,low(OCR1)
outi OCR1AL,high(OCR1)

Точность в 8 знаков ИМХО избыточна. Вроде как точность самого кварца всего 5 знаков. С трудом представляю задачу, где надо было бы измерять с точностью больше 3-4 знаков, лучше сделать несколько диапазонов.

К советам по динамической индикации, да и прочим, вы не прислушались, жаль.

Ну и еще, при задании частоты в протеусе, посмотрите фронты, вроде там по умолчанию 1 мкс, я на это наткнулся, когда ловил частоты до 10 МГц.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

понял про sreg,думал сэкономить такты,про high-low пишу их для таймеров а здесь почему то не написал,8 знаков не нужна,поэтому стоит 6,а в программе сделаю если 3-х байтовое число больше 999.999 то будет или сдвиг на 2 разряда или пересчет,но просто хочу разобраться почему не показывает протеус,про фронты не знал ,попробую.

Ссылка на комментарий
Поделиться на другие сайты

Пробовал сохранять SREG не поменяло ничего а уменьшил в протеусе фронты ,так сразу 500кГц увидел (больше не пробовал ,долго ждать ),ну и high-low переписал,осталось дописать измерение от 999.999 и выше (просто изменю 1сек на 0.1 сек если старший байт превысит значение FF)- и будет 2 предела. 6 индикаторов у меня спаяны (без дела) поэтому столько и разрядов.Спасибо за помощь,спаяю-напишу

Изменено пользователем den2313
Ссылка на комментарий
Поделиться на другие сайты

SREG в прерываниях надо сохранять всегда, когда они его могут изменить. Самая большая проблема, что прерывания возникают в случайные моменты времени относительно остального кода, и могут изменить регистры хоть между cpi и breq, или между двумя сдвигами. Замучаетесь потом такие ошибки ловить, лучше сразу сделать правильно.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Неужели проблема написать прошивку с использованием прерывания? Все необходимые регистры настроек таймера (OCR1AH, OCR1AL, TIMSK, TCCR1B) прописаны у Евстифеева.

Доброго времени суток! Пишет Вам товарищ, которому Вы помогали в написании программы частотомера(Тема называлась:"Вопрос по программе частотомер Джона Мортона"). Я не мог столь долгое время что либо написать Вам по той причине, что проходил службу в резерве(Я командир 152мм САУ Гиацинт-С), поэтому если Вас не затруднит, давайте продолжим наше обучение. Правда некоторый материал я повторяю заново, без практики забывается. Спасибо!
Ссылка на комментарий
Поделиться на другие сайты

Не затруднит, конечно. Если я правильно перечитал тему, мы разбирались с блоками для дальнейшей работы:

Первый таймер настраиваем на прерывание каждые 100 мс либо каждую секунду. Было бы удобно уметь переключать период на лету, но как раз это можно добавить в любой момент.

Второй таймер настраиваем на счет внешних прерываний с ноги T0 или T1 (смотря какой таймер больше понравится). Он прерываний не генерирует.

Третий таймер (или бесконечный цикл, что проще) отводим под динамическую индикацию.

Если эти блоки не вызывают проблем, напишите программу, в которой они все есть. Если же не все так очевидно, как кажется мне (после 8 лет общения с AVR), скажите что именно вызывает проблемы. Поскольку этот код будет скелетом для всей прошивки, не стоит пренебрегать форматированием и комментариями.

Более важный вопрос, понимаете ли ВЫ логику работы устройства или же пытаетесь слепо повторить мою идею. Возможно, вы слышали про способы Нильса Бора определить высоту здания с помощью барометра. Если интересно, попробуйте предложить еще несколько способов (не обязательно на конроллере) измерения частоты. Но пошагово описать хоть один способ, применимый в нашей ситуации, все-таки важнее.

.

Небольшой фикс по своему предыдущему высказыванию:

SREG в прерываниях надо сохранять всегда, когда они его могут изменить.

Немного не так: надо сохранять всегда, когда это может повлиять на команды из основного цикла. На соседнем форуме привели пример с пустым основным циклом, там можно обойтись и без сохранения. Еще можно заключить опасный кусок основного цикла в cli/sei, тогда прерывание ему тоже ничего не сделает.

Но если нет острой необходимости экономить такты в прерывании уж до такой степени, лучше сохранять SREG не оглядываясь на подробности, оно надежнее.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо что ответили. Я думаю что необходимо все начать с начала, пока был в армии подумал как бы правильно сформулировать вопрос насчет того что же я хочу получить за устройство и какие навыки я на данный момент имею. Все дело в том что сперва я начал собирать и прошивать различные устройства: часы реального времени с датчиком температуры на Atmega8, обычные часы без сохранения памяти(Attiny 2313), шим привод униполярного шагового двигателя(Attiny 2313), термостат(Attiny 2313A), гирлянды на 13 светодиодов с 12 программами(Attiny 2313). Все это у меня работает. Программатор AVR 910 Protoss(Atmega8) тоже спаял и успешно применяю вместе с платой с переходными панельками для различных контроллеров. Далее я решил что готовые программы это хорошо конечно, но надо и свои начать писать. Первая моя книга которую я более менее дочитал до середины была как Вы догадываетесь Джон Мортон "Микроконтроллеры AVR- Вводный курс". Почему дочитал именно до середины спросите Вы, отвечу: автор более менее объяснял как писать программы на ASMe вплоть до программы частотомера(хотя программа светофор и симулятор логических элементов до этого тоже были весьма спорными и не совсем понятными(как говорил один автор книги по языку С: такие авторы пишут первые несколько глав для новичков, а потом как будто это забывают и начинают писать ТАКОЕ непонятное чтобы выпендриться перед своими друзьями из колледжа) Так вот этот Мортон, я по его уроку делал программу работы одного таймера(AT90S1200), а как работать с 2-мя таймерами он не рассказал. Самое главное что нужно: начать с простого процесса инициализации и до пункта Start основного тела программы. А то я сбился с верного пути по которому шел, уже и книг перечитал и видео пересмотрел(а учитывая что на АСМе мало чего есть почитать да посмотреть). Я хочу просто научиться правильно в конкретном случае правильно написать всю инициализацию до пункта Start.Спасибо за то что прочитали сей длинный текст.

Ссылка на комментарий
Поделиться на другие сайты

С инициализацией-то какие проблемы? По нулевому адресу прошивки идет прыжок на метку RESET или как она там называется - начало программы. Потом все до бесконечного цикла - инициализация. Переферии встроенной, переферии внешней, переменных и прочего. Причем чаще всего переферийные модули друг от друга не зависят. Те же таймеры можно настраивать в произвольном порядке:

.org 0
rjmp RESET
;векторы прерываний (пропущены)
RESET:
;инициализация стека (2-4 команды пропущено)
;инициализация Т0 (режим Normal, F_CPU/1)
ldi temp, (0b001<<CS00)
out TCCR0
;инициализация T1 (режим Normal, F_CPU/1)
ldi temp, (0b001<<CS10)
out TCCR1A
;разрешение прерываний от Т0 по переполнению и от Т1 по сравнению. Единственное, где могут смешаться несколько таймеров.
ldi temp,(1<<TOIE0 | 1<<OCIE1A)
out TIMSK,temp
;глобально разрешаем прерывания (раз уж они разрешены локально, наверное, будут использоваться)
sei
;бесконечный цикл (надо же контроллеру что-то делать, пока прерывания не возникнут
CYCLE:
 rjmp CYCLE

Это грубый пример инициализации двух таймеров, туда же можно включить и остальную переферию, никаких хитростей для этого не нужно. Вообще, инициализация - самый простой этап. Разрабатывать логику работы программы (особенно если используются параллельные процессы, хотя бы на прерываниях) гораздо сложнее.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Шота дохрена. Это если мультик может на килогерце. Обычно нет, предел 400 Гц.
    • Да, сначала был написан бутлодер для тини 24. Там нет выделенной памяти под бутлодер и заморочек с областями откуда можно записывать и перезаписывать флеш из программы, там все просто! Также там нет УАРТА, пришлось написать. Ну и самое главное: перезаписывай любые страницы флеш из любого места! В тини 24 под бутлодер ушло 48% памяти. В проекте технологи выделили слишком мало физического места под схему. Потом развел плату, оказалось, что места не так уж и мало. Потом выяснилось, что пинов впритык, и если будет дальнейшее расширение, их может не хватить. И после долгих (ну очень долгих) изысканий (цена, доступность, размеры) остановился на 88 (очень низкая цена, корпус чуть больше чем у 24, датчик температуры, а это важно, но не критически). Да, и сейчас все программируют на С и др. языках высокого уровня, что занимает очень (ну очень) много места, и чипы с небольшой памятью остаются не востребованы, и как следствие низкий спрос, и низкая цена!!! И при тупом переносе программы перезаписи страниц флеш программа не заработала... Ну и пошли изыскания, и я набрел на ВАШ проект, самый полный и законченный на то время. Нужно было выяснить чип который был у меня битый или я что-то упустил при программировании? (в бутлодерах я новичек) Недостаток 88 на сегодня, то что из пользовательской памяти нельзя перепрограммировать флеш, хотя страница стирается.   По поводу ВАШЕЙ программы: выяснилось, что при включенном фьюзе WDT в конфигурации, соединение не устанавливается, а в хелпе это не отражено. В некоторых ситуациях соединение можно восстановить лишь отключив / включив питание, сброс через ножку ресет не помагает. Будем копать дальше,... и глубже....!   Иногда при "установить соединение" выдается сообщение, "соединение не установлено", а на осциллографе виден ответ с чипа?
    • Сейчас по входу стоит керамика 0,1 мкФ + электролит 220 мкФ, иголок вроде нет, ну во всяком случае старичек С1-93 их не показывает.
    • Платы материнки и УВ пока в брак.  - Семён Семёныч... (с) Вы ничего не забыли, сэр? Как вы собрались регулировать УВ по уровню выходного сигнала??? Решение уже есть, пока в процессе. Вот так оно лучше работает.
    • Ну в идеале каптоновым скотчем как вам сказали,но можно обмотать чем угодно лижбе диалектриком было и хотябы немного высокотемпературное,я бы термо усадку взял,поидеи хорошо пойдет  Ещё видел где трансформатор медно алюминиевой жилой был на ампер 10 если не больше на вид аж,и там алюминиевая обмотка сечением пол сантиметра была замотана в бумагу пропитанную в воске,слоем миллиметр примерно эта изоляция была 
    • Всем привет. Собрал мх50, запустился с первого раза, когда делал замеры, соскочил щуп, спалил выходники и пред, заменил, все ок. Питание тор 250 ватт 30х2 выход, после выпрямителя 44В 20000мкф в плечо  увеличил входные емкости на оконечниках, добавил шунтирующую пленку  плата софт старта присутсвует цепь буше взял из ОМ2.7 ТП выставил 100мА добавлена термозащита на каждый канал( но как оказалось, с таким корпусом хрен перегреешь) АС kef q150 dac Aiyima a5 max получилось снять 81 ватт с канала при 8ом нагрузке (на фото самое точное измерение на левом мультиметре) без сигнала если прислонится к ас еле уловимое шипение  при наличии сигнала все ок, играет отлично, мне очень понравилось. в планах ОМ2.7
    • Уже 52 скачивания. Значит актуальна.
  • Похожий контент

×
×
  • Создать...