Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 51
1

Получение пилообразного сигнала, с использованием прерывания (8051)

11.05.2015, 18:26. Просмотров 1275. Ответов 18
Метки нет (Все метки)

Необходимо получить пилообразный сигнал.

Суть такая:
Я использую ЦАП(8 бит), максимальное число 255, при таком числе у меня не получиться период 0.1сек, для этого я использую прерывание, но не работает

Получение пилообразного сигнала, с использованием прерывания (8051)


Подскажите в чем ошибка, что не так я делаю, пожалуйста.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ORG 0
  JMP START
 
ORG 000BH
  JMP PR_1
 
START:
    MOV A,#0
    MOV TMOD, #00000001B
    MOV TL0, #01111001b
    MOV TH0, #11111110b
    MOV IE,#10000010B
    SETB EA
    SETB TR0    
    SETB TF0 
    M:JMP M
PR_1:  
    MOV P2,A
    INC A
    CLR EA
    CLR TF0 
    CLR TR0
        RETI
END
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2015, 18:26
Ответы с готовыми решениями:

В чем ошибка? График пилообразного сигнала
Доброго времени суток. Выходит ошибка "Syntax error, missing operator or `;`". Никак не могу...

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

таймер прерывания 8051
Здравствуйте такой вопрос #загрузка указателя 0006 0200: 90 03 00 p: MOV ...

Влияние ступенчатого сигнала на апериодическое звено (8051)
Всем привет! Такая задача: Влияние ступенчатого сигнала на апериодическое звено. Через z...

18
Модератор
Эксперт по электронике
8329 / 6181 / 829
Регистрация: 14.02.2011
Сообщений: 21,477
11.05.2015, 20:09 2
Цитата Сообщение от lariso4ka Посмотреть сообщение
SETB EA
включить все прерывания
и уже в прерывании
Цитата Сообщение от lariso4ka Посмотреть сообщение
CLR EA
отключить
разумеется прерывание больше не вызывается

Добавлено через 2 минуты
Цитата Сообщение от lariso4ka Посмотреть сообщение
CLR TR0
остановить таймер
он больше считать не будет
1
950 / 580 / 96
Регистрация: 15.05.2012
Сообщений: 3,379
12.05.2015, 09:18 3
Можно же проще, без прерывания, программной задержкой.
0
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 51
12.05.2015, 13:40  [ТС] 4
Цитата Сообщение от pyzhman Посмотреть сообщение
Можно же проще, без прерывания, программной задержкой.
задача именно через прерывания
0
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 51
12.05.2015, 13:49  [ТС] 5
ValeryS,
все убрал
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ORG 0
  JMP START
 
ORG 000BH
  JMP PR_1
 
START:
    MOV A,#0
    MOV TMOD, #00000001B
        MOV TL0, #01111001b
        MOV TH0, #11111110b
    MOV IE, #10000010B
    SETB TR0    
    SETB TF0 
    M:JMP M
PR_1:  
    MOV P2,A
    INC A
    CLR TF0 
        RETI
END
Через секунд 20 появляется, вот такой сигнал и все, и опять так же через примерно 20 сек
Получение пилообразного сигнала, с использованием прерывания (8051)
0
Модератор
Эксперт по электронике
8329 / 6181 / 829
Регистрация: 14.02.2011
Сообщений: 21,477
12.05.2015, 14:05 6
во первых задавай свое число не в аккумуляторе а в каком то регистре
я например не уверен что аккумулятор не портится при заходе в прерывание
во вторых если ты используешь Протеус то используй по полной в частности его возможности отладки
когда запустишь программу стрелочкой то нажми паузу, и появится окошко с листингом, может не появится в меню нужно добавить
и вот там можешь программу и по шагам прогонять и точки останова устанавливать

Добавлено через 2 минуты
вот что подумал
а ты в какой режим таймер загнал?
тебе нужен 8 битный с перезагрузкой
во всех других нужно записывать значения в TL0 TH0 в прерывании иначе счетчик начинает считать с 0
1
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 51
12.05.2015, 18:48  [ТС] 7
Цитата Сообщение от ValeryS Посмотреть сообщение
во первых задавай свое число не в аккумуляторе а в каком то регистре
пронял запишу в R0
Цитата Сообщение от ValeryS Посмотреть сообщение
когда запустишь программу стрелочкой то нажми паузу, и появится окошко с листингом, может не появится в меню нужно добавить
и вот там можешь программу и по шагам прогонять и точки останова устанавливать
паузой я пользуюсь, пошагово смотрю как работает программа
Цитата Сообщение от ValeryS Посмотреть сообщение
а ты в какой режим таймер загнал?
я загнал 2 (00000001)
Цитата Сообщение от ValeryS Посмотреть сообщение
тебе нужен 8 битный с перезагрузкой
понял тогда будет так (00000010)

программа заработала, большой вам поклон

правильно ли я заношу число в регистровую пару?
период 0,1 сек. значит делим 0,1/256=0,00039 (это 0,39 мс)
получаем число 65145 и заносим его
0
Модератор
Эксперт по электронике
8329 / 6181 / 829
Регистрация: 14.02.2011
Сообщений: 21,477
12.05.2015, 19:06 8
Цитата Сообщение от lariso4ka Посмотреть сообщение
получаем число 65145 и заносим его
каким образом получилось это число???
во первых во вторых ты не сможешь в 8 бтьный регистр загнать это число
частота таймера(тик) равен 1/12 частоты кварца
значит на 12 мГц это будет 1 мГц 1 тик =1 микросекунде
тебе нужно 390 микросекунд
это больше чем 256, значит 8 ричным иаймером не обойдемся нужен 16ричный
нужно в регистры TL0 TH0 нужно записать такое число чтобы через 390 тиков таймер должен быть равен 0
число это -390 в шеснадцетиричке FE7A
вот и записываем
C++
1
2
MOV TH0,0FEh
MOV TL0,07Ah
при чем и при инициализации и при срабатывании таймера

Не по теме:

Цитата Сообщение от lariso4ka Посмотреть сообщение
большой вам поклон
для спасибы кнопка есть

1
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 51
12.05.2015, 20:14  [ТС] 9
ValeryS, пытался разобраться со 2ым режимом, почему то не работает, я что то недопонимаю наверное (даже при изменении значения в регисторах, сигнал не меняется) читаю книжку и там написано при каждом переполнении TL0, происходит перезагрузка из TH0 в TL0 (не понимаю это)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ORG 0
  JMP START
 
ORG 000BH
  JMP PR_1
 
START:
    MOV R0,#0
    MOV TMOD, #00000001B
    MOV TH0,0FEh
    MOV TL0,07Ah
    MOV IE, #10000010B
    SETB TR0     
    M:JMP M
PR_1:  
    MOV P2,R0
    INC R0
    CLR TF0 
        RETI
END
попытался сделать через 1 режим, все заработало, как вы и сказали

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ORG 0
  JMP START
 
ORG 000BH
  JMP PR_1
 
START:
    MOV R0,#0
    MOV TMOD, #00000001B
        MOV TL0, #01111001b
        MOV TH0, #11111110b
    MOV IE, #10000010B
    SETB TR0     
    M:JMP M
PR_1:  
        MOV TL0, #01111001b
        MOV TH0, #11111110b
    MOV P2,R0
    INC R0
    CLR TF0 
        RETI
END
0
Модератор
Эксперт по электронике
8329 / 6181 / 829
Регистрация: 14.02.2011
Сообщений: 21,477
12.05.2015, 20:27 10
Цитата Сообщение от lariso4ka Посмотреть сообщение
итаю книжку и там написано при каждом переполнении TL0, происходит перезагрузка из TH0 в TL0 (не понимаю это)
это значит что не надо загружать в прерывании в TL0 значение оно само загрузится из TH0
но это 8 битный режим т.е максимально возможный пересчет 256 (значение 0)
256 мкС, тебе этого мало
Цитата Сообщение от lariso4ka Посмотреть сообщение
почему то не работает,
потому что в TH0 0xFE 2 такта и переполнение, ты из прерывания выбраться не можешь только в порт скинул новое прерывание и так по кругу
1
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 51
12.05.2015, 20:55  [ТС] 11
Цитата Сообщение от ValeryS Посмотреть сообщение
потому что в TH0 0xFE 2 такта и переполнение ты из прерывания выбраться не можешь только в порт скинул новое прерывание и так по кругу
пытался вкурить это предложение,посмотрел в учебнике, но так и не понял
да я заметил, что из прерывания я выбраться не могу.
Здесь встал и все:
Assembler
1
M:JMP M
0
Модератор
Эксперт по электронике
8329 / 6181 / 829
Регистрация: 14.02.2011
Сообщений: 21,477
12.05.2015, 21:09 12
Цитата Сообщение от lariso4ka Посмотреть сообщение
пытался вкурить это предложение,посмотрел в учебнике, но так и не понял
счетчик таймера считает вперед
было 0 стало 1 потом 2 и тд
когда происходит переполнение т.е из максимального значение превращается в минимальное было 255 стало 0
для 8 битных или было 65535 стало 0 для 16 битных, происходит прерывание, если оно разрешено конечно
вот у тебя значение в счетчике TL0 254 один такт стало 255 второй такт стало 0 вызов прерывания
в счетчик TL0 записалось значение 254 из TH0 и опять тоже самое
Цитата Сообщение от lariso4ka Посмотреть сообщение
посмотрел в учебнике
поищи в интернете, много толковых статей, мне в свое время помогли методички к лабам УПИ, правда это было лет 16 назад, а к самому камню я не притрагивался уже лет 7, конечно что то забываю
1
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 51
12.05.2015, 21:26  [ТС] 13
ValeryS, ну попытаюсь объяснить как я понимаю.
вот у нас в счетчике TL0(254), проходит 2 такта,происходит вызов прерывания, и содержимое из TH0(122) переходит в TL0 и так далее

а тогда я не пойму почему не работает программа я что еще не сделал?
0
Модератор
Эксперт по электронике
8329 / 6181 / 829
Регистрация: 14.02.2011
Сообщений: 21,477
12.05.2015, 21:31 14
Цитата Сообщение от lariso4ka Посмотреть сообщение
MOV TH0,0FEh
Цитата Сообщение от lariso4ka Посмотреть сообщение
TH0(122)
FE это по твоему 122? нет, это 254
Цитата Сообщение от lariso4ka Посмотреть сообщение
почему не работает программа
не понял
Цитата Сообщение от lariso4ka Посмотреть сообщение
все заработало,
это что? плюрализм мнений в отдельно взятой голове?
1
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 51
12.05.2015, 21:50  [ТС] 15
Цитата Сообщение от ValeryS Посмотреть сообщение
FE это по твоему 122? нет, это 254
MOV TH0,0FEh
MOV TL0,07Ah
так я запутался, TL0 254 доходит до максимального, идет прерывание, и из TH0 в TL0 опять приходит 254
Цитата Сообщение от ValeryS Посмотреть сообщение
это что? плюрализм мнений в отдельно взятой голове?
ну программа заработала при первом режиме таймера счетчика, я просто хочу понять принцип работы если использовать 2 режим.
Цитата Сообщение от ValeryS Посмотреть сообщение
не понял
ну что не правильно я имею ввиду, режим изменили, 16ричный сделали
0
Модератор
Эксперт по электронике
8329 / 6181 / 829
Регистрация: 14.02.2011
Сообщений: 21,477
12.05.2015, 22:10 16
Цитата Сообщение от lariso4ka Посмотреть сообщение
ак я запутался, TL0 254 доходит до максимального, идет прерывание, и из TH0 в TL0 опять приходит 254
да
Цитата Сообщение от lariso4ka Посмотреть сообщение
я просто хочу понять принцип работы если использовать 2 режим.
запиши в TH0 в TL0 0 и заработает
но частоту в 0.1 секунды не получишь, это будет минимальная частота при 8битном режиме
потом можешь поиграться с числами в TH0 и TL0 будет увеличиваться частота

Добавлено через 3 минуты
Цитата Сообщение от lariso4ka Посмотреть сообщение
TL0 254
изначально там 07Ah то бишь 122 но при первом же прерывании придет 254(FE)
1
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 51
12.05.2015, 22:17  [ТС] 17
Цитата Сообщение от ValeryS Посмотреть сообщение
изначально там 07Ah то бишь 122 но при первом же прерывании придет 254(FE)
ну я так и понял что сначала будет 122

я разобрался и много, что понял, спасибо вам
0
ValeryS
12.05.2015, 22:17
  #18

Не по теме:

Цитата Сообщение от lariso4ka Посмотреть сообщение
так я запутался,
Цитата Сообщение от lariso4ka Посмотреть сообщение
я его к примеру прочитала,
отсюда
Очистка экрана в консоли
у меня начинается раздвоение личности
как к Вам обращатся?

0
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 51
12.05.2015, 22:31  [ТС] 19
Цитата Сообщение от ValeryS Посмотреть сообщение
у меня начинается раздвоение личности
как к Вам обращатся?
да смешная ситуация
живу с одногрупницей, мой компьютер сломался, через нее сижу.
надо сменить, а мне лень)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2015, 22:31

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

Обслуживание дисплея с использованием прерывания BIOS 10Н
Выводить прямоугольник 5*10 точек в случайную позицию на экране. Каждый раз окрашивать...

Обслуживание клавиатуры с использованием прерывания BIOS 16Н
Помогите пожалуйста! Вводимые с клавиатуры символы выводить на экран монитора в следующем...

Изменение цвета символа с использованием системного прерывания BIOS
Всем доброго времени суток помогите пожалуйста дописать программу! Мое задание звучит так вывести...

Вывод на экран графического изображения с использованием прерывания пользователя
помогите пожалуйста найти ошибки text segment assume cs:text org 100h begin: mov ax,3 int...

Изменение цвета символа с использованием системного прерывания BIOS!
Всем доброго времени суток помогите пожалуйста дописать программу! Мое задание звучит так вывести...

Работа с функциями BIOS драйвера клавиатуры с использованием прерывания 16H - С++
Доброго времени суток. Помогите пожалуйста написать программу на языке С++ с использованием...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.