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

Attiny2313


apolon1919

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

http://radioskot.ru/publ/programmirovanie_attiny2313/1-1-0-49

Вот этим.

НО я подключил внешний тактовый генератор. с конденсаторами

К контакту 4,5 подключил тактовый генератор, с конденсаторами

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

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

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

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

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

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

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

Такого нет, а самому не собрать что по проще?

Может мне просто вот такой купить? http://almaty.satu.kz/p741403-tl866cs-minipro-usb.html

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

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

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

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

К контакту 4,5 подключил тактовый генератор, с конденсаторами

Ты доключил, скорее всего, кварц, а не внешний генератор.

Собери такую схему:

post-100193-0-16762400-1385226913.png

и подключи:

post-100193-0-64826800-1385226941_thumb.jpg

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

Я просто пока на ассемблере программирую.

И записываю интервал в регистр совпадения OCR1A

а в том коде все на "c" И столько лишнего кода.

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

Вот я подумал и решил так.

Таймер отсчитывает такты кварца. Так?

У меня кварц на 4 000 000 Гц.

Мне нужно узнать за сколько секунд проходит 1 колебания 1Гц.

делим 1/4 000 000 = 0,00000025 секунд проходит 1 Гц.

Допустим, мне нужно что бы прерывания работало каждые 200 мс - это 0.2 секунды

тогда делим 0,2/ 0,00000025 = 800 000 Гц.

Это значит что таймер-счетчик должен отсчитать 800 000 герц.

тут возникает проблема! Таймер всего 16 разрядный, а значит он может отсчитать только 65536 герц!

И что бы решить эту проблему в контроллере есть пред делитель.

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

И я выбираю 1024. Одно из значений.

Теперь значит, когда таймер подсчитанное количество тактов будет делить на 1024.

итак значит 4 000 000 Гц будут поделены на 1024.

4 000 000/1024 = 3 906,25

Значит 1 секунда равна 3 906,25 Гц.

И так как в секунде 1000 мс, нам надо 1000/200 = 5. значит делим 3 906,25/5 = 781,25. Но так как наверное дробью записать не получится пишем в регистр совпадений OCR1A число 781. это будет 200 мс.

.def temp = R16
.equ kdel = 781
.......................
; Установим старший байт числа совпадения таймера счетчика
ldi temp, high(kdel)
out OCR1AH, temp

; Установим младший байт числа совпадения таймера счетчика
ldi temp, low(kdel)
out OCR1AL, temp

И если я все правильно понял, то это будет моей памяткой

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

Возьмите предделитель равный 256:

_ частота 4 000000 герц

- предделитель 256

Тогда реальная частота процессора будет равна 4 000000/256=15625 герц.

- одна секунда равна 15625 тактов процессора.

Тоесть отсчитать в каждом прерывании сумму равную 15625, получим 1 секунду ровно, либо 156 тактов равен 1 им + каждый четвертый считаем как 157(дабы сотые не потерять), ....ну както так...

Так правильнее и точнее.

Предделитель, это делитель частоты процессора для вычесления РЕАЛЬНОЙ ЧАСТОТЫ,...

Проблема может возникнуть, если вам частота нужна РЕАЛЬНАЯ ВЫШЕ ,чем 63356...

Но самое простое и легкое, это ввести две переменных для использования счета прерываний. Например переменные А и В.

Каждое прерывание добавляем единиццу к А.

При достижении А равное 4 000 обнуляем А и добавляем единицу к В, где В является счетчиком миллисекунд, при частоте проца 4 000000 герц и предделителе равному 1.

Далее в теле программы обрабатываем переменные В,С и Д - миллисекунды, секунды п минуты.

П.С. Обнуление переменной В необходимо делать в прерывании

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

  • 2 недели спустя...

У меня возникла проблема.

В протеусе все нормально работало, но сегодня я написал вот такую программу простенькую

.include "tn2313def.inc"
.list

.def temp = R16
.equ time = 3906



.cseg
.org 0
rjmp init
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti



init:
; Устанавливаем начало стека
ldi temp, RAMEND
out SPL, temp


ldi temp, 0x08
out DDRB, temp

ldi temp, 0x00
out DDRD, temp

ldi temp, 0xFF
out PORTB, temp

ldi temp, 0x7F
out PORTD, temp


; Отключаем аналоговый компаратор
ldi temp, 0x80
out ACSR, temp


ldi temp, 0b00001101
out TCCR1B, temp


ldi temp, low(time)
out OCR1AL, temp
ldi temp, high(time)
out OCR1AH, temp


ldi temp, 0b01000000
out TCCR1A, temp



; Основной цикл программы
main:

rjmp main

Задача программки мигать ножкой OC1A каждую секунду. но дело в том какое бы я время не установил, все равно он мигает раз 10 в секунду!. Что случилось с протеусом?

osciloscope.rar

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

Поменял их местами

ldi temp, low(time)
out OCR1AL, temp
ldi temp, high(time)
out OCR1AH, temp

ldi temp, high(time)
out OCR1AH, temp
ldi temp, low(time)
out OCR1AL, temp

Стал в 2 раза медленнее работать

ААААААА, вот!

Поскольку регистры сравнения выхода OCR1A и OCR1B являются 16-разрядными, то для обеспечения одновременного занесения старшего и младшего байтов данных в регистры OCR1A/B используется регистр временного хранения TEMP. Когда CPU записывает старший байт, то данные временно сохраняются в регистре TEMP. Когда же CPU записывает младший байт в OCR1AL или OCR1BL, то одновременно содержимое регистра OCR1BH переписывается в OCR1AH или OCR1BH. Следовательно, при 16-разрядных операциях старшие байты регистров OCR1A/B должны записываться первыми.

Вот, понял! Но всеравно время идет не так

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

Да, в общем все так. Коэффициент для OCR правильно рассчитали.

Хотя 3905 должно быть поточнее, согласно f = fclk/2*N(1+OCR)

Только вот рассчитали для тактовой 8МГц, а в Proteus-е эмулируете на 4.

Мало того, обратите внимание на фьюз- CLKDIV8, он у вас установлен

"по умолчанию", т.е. запрограммирован(активен)(см.DS), при этом тактовая

дополнительно делится на 8.

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

А что это за формула? f = fclk/2*N(1+OCR)

и где ее описания?

И почему я рассчитываю так просто, а формула такая сложная?

И почему в результате вычисляется частота, а не время в секундах????

Подставил свои значения, какойто бред вышел

f = 4000000/(2*1024(1+3906))

будет 0.4

нееее, какойто бред

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

Для установки прерывания таймера на 0,2с (считаю что фьюз CKDIV8=1 - неустановлен) считаем так:

Период требуемого прерывания Tп=0,2с

Период тактовых импульсов таймера Tт=1/4000000=0,00000025с

Прикидываем коэф.деления Кд=0,2/0,00000025=800000

Т.к. непомещаемся в два байта то заюзываем предделитель таймера/счетчика

Оцениваем на сколько требуемый Кд больше чем максимально возможный для 16бит.таймера 800000/65536=12,207

Отсюда делаем вывод что предделитель должен быть не менее 12,207

Принимаем предделитель равным 64 (Для tiny2313 он может быть 1, 8, 64, 256, 1024)

Считаем какое число нужно загнать в регистр сравнения таймера/счетчика

Кд'=0,2/(0,00000025*64)=12500

Если установим CKDIV8, то

Кд'=0,2/(0,00000025*64*8)=1562,5 - дробное число может быть не удобно, если требуется точное значение выдержки то лучше округлением не заниматься

Лучше поступить так: установить предделитель таймера на 8, вместе с делителем тактовой частоты они образуют как раз 64 (8*8) как в примере выше.

Кд'=0,2/(0,00000025*8*8)=12500

Если охота формулу, то вышесказанное можно выразить так:

K=F*Tп/N, где

K - число которое надо засунуть в регистр сравнения таймера счетчика;

F - частота тактового генератора, Гц (если включен CKDIV8 (=0), то делим дополнительно на 8);

Тп - требуемый период сработки прерывания таймера/счетчика, сек;

N - предделитель таймера/счетчика;

расчет по частоте сработки прерывания:

K=F/(N*fпр), где fпр - частота прерывания (fпр=1/Tп=1/0,2=5Гц)

Нет никакой заслуги тому, кто даёт золото, думая, что даёт камень (Будда)

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

Да как рассчитывается это я понял)))))))

OCR = F*T/N

OCR Число которое загоняется в регистр OCR

F - частота кварцевого резонатора

T - Время которое нужно

N - Число предделителя

просто про CKDIV8 не знал

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

А самый прикол, когда про него незнают выставляя малую тактовую частоту (128кГц), тогда камень от большинства программаторов вообще перестает прошиваться. Так что аккуратнее с этим.

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

Как уже выше заметили существует и программный метод деления. Особенно полезен он когда выдержка очень большая или когда их много и нужно всего одним аппаратным таймером обойтись. Про это пояснять нужно?

Нет никакой заслуги тому, кто даёт золото, думая, что даёт камень (Будда)

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

То что предделитель один для всех таймеров знаете?

да,

Как уже выше заметили существует и программный метод деления. Особенно полезен он когда выдержка очень большая или когда их много и нужно всего одним аппаратным таймером обойтись. Про это пояснять нужно?

Не, это пока понятно, если будут проблемы отпишусь, спасибо

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

А что это за формула? f = fclk/2*N(1+OCR)

и где ее описания?

Где же ей быть как не в DS(Datasheet), стр. 95 для режима CTC.

И почему в результате вычисляется частота, а не время в секундах????

Потому, что формула для вычисления частоты))

Если хотите время, т.е. период, то T=1/f

Подставил свои значения, какойто бред вышел

f = 4000000/(2*1024(1+3906))

будет 0.4

нееее, какойто бред

«нееее», будет 0.5Гц

Период = 1/0.5=2с

Что абсолютно точно подтверждает Proteus.

Да как рассчитывается это я понял)))))))

OCR = F*T/N

Неее, единичку не учли.

Не ищите формулы на всемирной «свалке»

Практически все, что нужно есть в DS.

post-140046-0-40793200-1386612573_thumb.png

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

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

Нет никакой заслуги тому, кто даёт золото, думая, что даёт камень (Будда)

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

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

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

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

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

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

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

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

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

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

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

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