Member 14611851 Ответов: 3

Как можно написать эту программу сборки?


Write a program that makes all LEDs blink with a 0.5 second period(in assembly). Use the 16-bit timer 1uit (a) to determine the interval. Generate an interrupt every 0.5 seconds by counting the counter until an "output compare match" is reached. Indicate in your answer how you calculated the value of OCR1A.


Что я уже пробовал:

я пробовал с некоторыми перерывами, но это все еще не работает

Richard MacCutchan

Пожалуйста, покажите свой код и объясните, что означает "не работает".

3 Ответов

Рейтинг:
26

OriginalGriff

Начните с чтения по таймеру - и мы понятия не имеем, что это такое, мы даже не знаем, какой процессор семья вы используете, а тем более фактическую модель или остальную часть вашего оборудования - и разрабатываете, как запрограммировать его на интервал 0,5 секунды.
Этот расчет завершит последнюю часть вопроса: "укажите в своем ответе..."

Когда у вас есть это значение, запрограммируйте таймер и заставьте его генерировать прерывание.
Напишите обработчик прерываний и добавьте его к векторам прерываний (или как бы ни обрабатывались прерывания в вашем процессоре: они не все одинаковы, но заметки курса yoru должны охватывать его)
Тогда это простое дело, чтобы включить светодиоды на один тик, а затем выключить на второй. Время мигания (отсчитайте десять "ВКЛ" миганий и посмотрите, насколько близко к десяти секундам вы находитесь), чтобы проверить значения счетчика, которые вы рассчитали для начала.

Извините, но мы не можем сделать ничего из этого для вас: ассемблерный код для моих процессоров, вероятно, вообще не будет работать в вашем! (На самом деле, он, вероятно, даже не будет компилироваться :смех: )


Рейтинг:
2

Mike Hankey

Похоже, вы используете чип Atmel, возможно, ATmega328P?

Посмотрите в справочнике, он станет вашим лучшим другом, в разделе о 16-битных таймерах (TIMER1) под режимами работы/Clear Timer на странице 125 раздела сравнения 13.9.2 и вы найдете формулу для значений, которые вам понадобятся для OCR1A и prescale. Даже если это не ATmega328P, формула будет аналогична для других чипов.


Member 14611851

спасибо!

Рейтинг:
2

Member 14611851

<pre>
	.include "m328Pdef.inc"
	.def saveSR=r17
	.def temp=r18
	.org 0x0000
	rjmp init

	.org OC1Aaddr
	rjmp TIMER


init:
	ldi R16,high(RAMEND)
	out SPH, R16
	ldi r16, low(RAMEND)
	out SPL, R16

	ldi temp, high(31250)
	sts OCR1AH, temp
	ldi temp, low(31250)
	sts OCR1AL, temp
	ldi temp, (1 << CS12) | (1 << WGM12)
	sts TCCR1B, temp
	ldi temp, (1 << OCIE1A)
	sts TIMSK1, temp
	ser temp
	out DDRB, temp
	out PORTB, temp

	sei

loop:
	rjmp loop

TIMER:
	in saveSR, SREG
	in r16, PORTB
	com r16
	out PORTB, r16
	out SREG, saveSR
	reti


теперь у меня есть этот код, и он работает! у кого-нибудь есть несколько советов по улучшению кода?