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

Помогите Написать Программу Для Микроконтроллера


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

Господа инженеры/программисты, прошу вашей помощи.

Разработать алгоритм и написать программу на языке ассемблера, обеспечивающую поочередное формирование на пьезоизлучателе ZQ2 с интервалом в 0,5 сек звукового сигнала с частотой 400 и 800 Гц.

Формирование временного интервала 0,5 сек реализовать в режиме обработки прерываний от таймера T0. Формирование звука на пьезоизлучателе ZQ2 обеспечить в режиме обработки прерываний от таймера T1.

Intel 8051

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

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

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

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

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

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

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

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

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

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

Нужно различать "помогите сделать" и "сделайте мне". Второе - платная услуга в соответствующем разделе.

"Я не знаю какой там коэффициент, я просто паять умею. "

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

Нужно различать "помогите сделать" и "сделайте мне". Второе - платная услуга в соответствующем разделе.

Я понимаю. Мне нужна помощь в разработке. Я сам не хочу, чтобы за меня это кто-то делал

DSEG AT 030h

count_Lo Ds 1

Count_ho Ds 1

Flag BP Ds 1

Stack equ 060h

Beep bit p1.1

Cseg at 0000h

Using 0

Important main

Main

Org 0003h

Reti

Org 000Bh

Jmp timer_0

Org 000Bh

Reti

Org 001Bh

Jmp Timer_1

Org 0023h

Reti

Org 002Bh

Reti

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

Тогда выкладывайте свои наработки и в каком месте случился "затык".

Если найдется спец по вашему МК, поможет.

"Я не знаю какой там коэффициент, я просто паять умею. "

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

Timer_0

Inc count_L0

Mov A, count_L0

Jnz Tim0_Ex

Inc count_Hi

Mov a,count_Hi

Cjne a, #8,time_ex

Mov count_hi, #0

Mov a, flag BP

Jnz beep

Могу выложить схему лабораторного макета

Схема макета

post-198002-0-20603700-1454337445_thumb.jpg

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

Ну что ты боронишь?

Что за чудовищный код?

Иди от простого к сложному, элементарно начни программу с инверсии порта:

CPL P1.1

Который, выдаст частоту с кратностью цикла МК на порт

Бипер висит именно на этом порту.

Далее, пишешь задержки NOPами, можно и таймерами, но зачем плодить сущности.

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

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

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

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

Один машинный цикл оригинального 8051-ядра занимает 12 временных тактов
NOP, или приращение коунтера/таймера- один цикл, такт-один период кварца. При 12 МГц кварце, цикл ровно 1 мкс. Изменено пользователем o_l_e_g

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

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

Далее, пишешь задержки NOPами

Не сбивайте человека с пути истинного. В задании чётко указано, что задержки и частоты формируются прерываниями от таймеров. Даже указано, какие таймеры для чего использовать.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

Так, ну с таймером T0 я разобрался. 11,059 МГц частота мк. Те 1105900/12 =921583 раз в секунду таймер инкрементируется. Интервал между тиками составляет 65536/921583=0,071 с. По прошествии 0,5 с таймер должен перегрузиться 0,5/0,071=7,04 раза.

Подскажите пожалуйста, как рассчитать и написать код для инвертирование пьезоизлучателя с частотой 400 Гц?

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

Ну также и считай 921583 тиков секунда делить на 400 =2304 тика для 400 Гц. Каждый раз по прерыванию по переполнению загружаешь в ТС FFFF- 901(hex) и делаешь инверсию ножки.

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

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

Возможный вариант:

;начальный адрес программы
org 00h
   ljmp    begin    ;обходим таблицу прерываний
;
;подпрограмма обработки прерывания Т0
;Отсчет 0,5 сек
;
org 0Bh
   ljmp    timer0    ;обходим таблицу прерываний
;
;подпрограмма обработки прерывания Т1
;прерывание каждые 125мксек или 250мксек (таймер в режиме 2)
;Формирование сигнала 800 или 400 Гц
;
org 1Bh
   inc	 R1	  ;наращиваем счетчик прерываний (считает 5 прерываний)
   jb	  PSW.7,m2;если не переполнился, то уходим
   mov	 R1,#250 ;перезагружаем счетчик
   cpl    P1.1    ;инвертируем бит Р1.1
m2:
   reti        ;выход из прерывания

;
; обработка прерывания таймера 0
;
timer0:
;настраиваем таймер на генерацию 50-ти миллисекундного интервала времени
   mov    TH0, #HIGH(-50000)  ;Загрузить старший байт таймера
   mov    TL0, #LOW(-50000)   ;Загрузить младший байт таймера
;наращиваем счетчик (считает 10 прерываний)
   inc	 a
   jnz	 m1
;устанавливаем начальное значение счетчика
   mov	 a,#246
;инвертируем младший бит указателя
   cpl	 B.0
;переносим в регистр-указатель
   mov	 R0,B
;считываем данные для ТН1 либо из R2, либо из R3
   mov	 TH1,@R0

;выход из подпрограммы
m1:
   reti

;
;
;
begin:
;инициализация
   mov    sp,#70h ;установка стека
   mov    tmod,#21h ;установка таймера 0 в режим 1, таймера 1 в режим 2
   setb    tcon.4 ;разрешение работы таймера 0
   setb    tcon.6 ;разрешение работы таймера 1

   mov	 a,#246  ;предустановка счетчика для подсчета количества прерываний таймера 0
   mov	 B,#2    ;предустановка указателя считывания данных для ТН1 на R2
   mov	 R2,#82h ;параметр для ТН1 при формировании частоты 800Гц
   mov	 R3,#04h ;параметр для ТН1 при формировании частоты 400Гц

   setb    ie.7    ;разрешаем все прерывания
   setb    ie.3    ;разрешаем прерывание таймера 1
   setb    ie.1    ;разрешаем прерывание таймера 0

;цикл
loop:
   ljmp    loop    ;вечный цикл

Я не раздаю удочки. Я продаю рыбу.

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

Поправил ошибку:

TH1_800  equ R2 ;не изменять!
TH1_400  equ R3 ;не изменять!
counter0 equ R4 ;счетчик прерываний таймера0
counter1 equ R5 ;счетчик прерываний таймера1


;начальный адрес программы
org 00h
   ljmp    begin    ;обходим таблицу прерываний
;
;подпрограмма обработки прерывания Т0
;Отсчет 0,5 сек
;
org 0Bh
   ljmp    timer0    ;обходим таблицу прерываний
;
;подпрограмма обработки прерывания Т1
;прерывание каждые 125мксек или 250мксек (таймер в режиме 2)
;Формирование сигнала 800 или 400 Гц
;
org 1Bh
   inc	 counter1    ;наращиваем счетчик прерываний (считает 5 прерываний)
   mov	 a,counter1
   jnz    m2        ;если не переполнился, то уходим
   mov	 counter1,#251    ;перезагружаем счетчик
   cpl    P1.1        ;инвертируем бит Р1.1
m2:
   reti        ;выход из прерывания

;
; обработка прерывания таймера 0
;
timer0:
;настраиваем таймер на генерацию 50-ти миллисекундного интервала времени
   mov    TH0, #HIGH(-50000)  ;Загрузить старший байт таймера
   mov    TL0, #LOW(-50000)   ;Загрузить младший байт таймера
;наращиваем счетчик (считает 10 прерываний)
   inc	 counter0
   mov	 a,counter0
   jnz	 m1
;устанавливаем начальное значение счетчика
   mov	 counter0,#246
;инвертируем младший бит указателя
   cpl	 B.0
;переносим в регистр-указатель
   mov	 R0,B
;считываем данные для ТН1 либо из R2, либо из R3
   mov	 TH1,@R0

;выход из подпрограммы
m1:
   reti

;
;
;
begin:
;инициализация
   mov    sp,#70h ;установка стека
   mov    tmod,#21h ;установка таймера 0 в режим 1, таймера 1 в режим 2
   setb    tcon.4 ;разрешение работы таймера 0
   setb    tcon.6 ;разрешение работы таймера 1

   mov	 counter1,#250    ;предустановка счетчика для подсчета количества прерываний таймера 1
   mov	 counter0,#246    ;предустановка счетчика для подсчета количества прерываний таймера 0
   mov	 B,#2        ;предустановка указателя считывания данных для ТН1 на R2
   mov	 TH1_800,#83h     ;параметр для ТН1 при формировании частоты 800Гц
   mov	 TH1_400,#05h     ;параметр для ТН1 при формировании частоты 400Гц

   setb    ie.7    ;разрешаем все прерывания
   setb    ie.3    ;разрешаем прерывание таймера 1
   setb    ie.1    ;разрешаем прерывание таймера 0

;цикл
loop:
   ljmp    loop    ;вечный цикл

Я не раздаю удочки. Я продаю рыбу.

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

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

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

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

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

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

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

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

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

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

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