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

Вопрос По Mega16


mx7

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

Написал программу мигания светодиодом используя прерыванию таймера счетчика1 по переполнению для attiny2313. Откомпилировал в CodeVision. Все работает прекрасно (проверял в VM_lab-е и Proteus-е).

Решил попробывать запустить эту программу на atmega16. Создал новый проект в CodeVision и поменял только

файл библиотеки <TINY2313.H> на <MEGA16.H> и в настройках проекта выбрал MEGA16, больше ничего не

трогал. Откомпилировал и запустил в VM_lab, но прерывания не возникает соответственно и светодиод не моргает.

Попробывал в Proteus-е таже фигня.

Может кто поможет решить проблему.

Текст программы и проекты в CodeVision и VM_lab для attiny2313 и mega16 прилагаются в архиве.

1.rar

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

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

вот так так все рабоает,

PORTB=0xFF; а у тебя 0x00 было

Проверил в протеусе

#include <mega16.h>

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1H=0xFE;
TCNT1L=0xFF;
PORTB = PORTB ^ 0b00000010;// èíâåðòèðóåì ïðåä ïîñëåäíèé áèò ïîðòà 
}

void main(void)
{
PORTA=0x00;
DDRA=0x00;

PORTB=0xFF;
DDRB=0xFF;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xFE;
TCNT1L=0xFF;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;


TIMSK=0x04;

ACSR=0x80;
SFIOR=0x00;

#asm("sei")

while (1)
  {};
}

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

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

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

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

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

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

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

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

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

Например нам нужно мигать светодиодом 1 раз в секунду.

Тактовая частота нашего контроллера (частота кварца): 4 МГц. Его период: 1/4000000 = 250 нс.

Максимальное значение таймера: 2^16 = 65535

250 нС * 65536 = 16,38 мс (маловато будет)

А если делить частоту кварца на 64 то получим 16,38мс*64=1,048с - то что надо.

Итак, выяснилось, что нам подойдет коэффициент деления 64. Ну значит, смотрим, какой код соответствует этому коэффициенту по даташиту (см. таб. 10).

Сигналу CK/64 соответствует код 011.

Пишем его в соответствующие биты TCCR1B. А остальные биты этого регистра нам не интересны. Итак:

TCCR1B = 0b00000011 (TCCR1B=0x03)

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

Мы уже знаем, что тактовая частота таймера в 64 раза меньше частоты кварца. Значит ее период - в 64 раза больше:

250 нс * 64 = 16 мкс.

Считаем количество тактовых импульсов, которое пройдет за это время:

1с /16 мкс = 62500 имп.

То есть, задержка в 1с равна 62500 такту.

Теперь от 65535 отнимаем 62500 и получаем 3035.

Число 3035 нужно загрузить в регистр TCNT1. Единственное, что надо помнить: этот регистр - составной. То есть, он состоит из двух 8-битных регистров. Поэтому, сначала нужно преобразовать это число в шестнадцатеричную систему и загрузить старшие и младшие разряды в соответствующие регистры: TCNT1H и TCNT1L.

3035(10) = 0BDB(16). Итого имеем:

TCNT1H = 0x0B

TCNT1L = 0xDB

Итог: мы загрузили в регистр TCNT1 число 3035, таймер начнет отсчет с этого числа и будет считать до 65535, как только он досчитает до 65535 он переполнится и начнет считать снова с числа 3035 и это время будет равно 1 секунде (или 62500 тактам).

post-39818-1193576245_thumb.png

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

Проблема была в том что я в регистре TIMSK установил 8 бит как для attiny2313, а по даташиту для нужно было установить 3 бит и все заработало.

Вот рабочий код мигания двумя последними светодиодами на порту В:

#include <mega16.h>

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1H=0xFE;
TCNT1L=0xFF;
PORTB = PORTB ^ 0b00000011;
}

void main(void)
{

PORTB=0x03;
DDRB=0x03;

TCCR1A=0x00;
TCCR1B=0x05; 

TCNT1H=0xFE;
TCNT1L=0xFF;

TIMSK=0x04;

#asm("sei")

while (1)
  {};
}

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

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

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

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

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

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

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

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

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

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

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