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

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


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

Не 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 пользователей онлайн

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

  • Сообщения

    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
  • Похожий контент

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