СВЕТОДИОД мигает в сборке с выходом timer1 сравнение прерывание не работает
Я пытался немного повеселиться с avr-сборкой на ардуино и попробовал следующие коды, чтобы мигнуть моим светодиодом
сначала я попробовал подход ISR, а когда Он не сработал, я попробовал первый режим CTC, оба кода перечислены соответственно. на первом светодиод загорается и остается таким (не мигает), на втором он просто остается выключенным
еще одна вещь,которую следует отметить, заключается в том, что при попытке загрузить OCR1AL сначала светодиод будет красиво мигать, если моя рука по какой-то причине окажется рядом с выводами PORTD,
Я догадался, что это какая-то проблема с заземлением, и она была исправлена, когда я вытащил высоко все контакты PORTD, и она полностью исчезла, когда я понял, что мне нужно сначала загрузить (высокий байт) OCR1AH
.nolist
.include "m328Pdef.inc"
.list
.org 0x0000
jmp Init
.org 0x0016
jmp TIMER1_COMPA
.EQU LED_PIN = PB1
Init:
;ldi r16, 255
;out DDRD, r16
;out PORTD, r16
;First configure The led pin as output and initilize it to high
sbi DDRB, LED_PIN
sbi PORTB, LED_PIN
;Second Enable Global Interrupts
sei
;Enable the Output compare Interrupt in the TIMSK1 Register
ldi r16, 0b00000010
sts TIMSK1, r16
; Reset the TCCR1A
ldi r16, 0b00000000
sts TCCR1A, r16
; Set the prescalar to 256 in the Timer Control 1B register
ldi r16, 0b00000111
sts TCCR1B, r16
;Now load the value for Output compare register 31250 or 01111011 00100000 or 15625 = 00111101 00001001
ldi r16, 0b00111101
ldi r17, 0b00001001
sts OCR1AH, r16
sts OCR1AL, r17
LOOP:
rjmp LOOP
TIMER1_COMPA:
;First Reset the coutner
ldi r16, 0
sts TCNT1H, r16
sts TCNT1L, r16
;Second Toggle the Pin (LED) state
sbi PINB, LED_PIN
reti
КТК:
.nolist
.include "m328Pdef.inc"
.list
.org 0x0000
jmp Init
.org 0x0016
jmp TIMER1_COMPA
.EQU LED_PIN = PB1
Init:
;ldi r16, 255
;out DDRD, r16
;out PORTD, r16
;First configure The led pin as output and initilize it to high
sbi DDRB, LED_PIN
sbi PORTB, LED_PIN
;Second Enable Global Interrupts
sei
;Enable the Output compare Interrupt in the TIMSK1 Register
ldi r16, 0b00000010
sts TIMSK1, r16
; Reset the TCCR1A
ldi r16, 0b01000000
sts TCCR1A, r16
; Set the prescalar to 256 in the Timer Control 1 registers
ldi r16, 0b00001111
sts TCCR1B, r16
;Now load the value for Output compare register 31250 or 01111011 00100000 or 15625 = 00111101 00001001
ldi r16, 0b00111101
ldi r17, 0b00001001
sts OCR1AH, r16
sts OCR1AL, r17
LOOP:
rjmp LOOP
TIMER1_COMPA:
;First Reset the coutner
;ldi r16, 0
;sts TCNT1H, r16
;sts TCNT1L, r16
;;Second Toggle the Pin (LED) state
;sbi PINB, LED_PIN
reti
@Mahmoud Salah, 👍0
1 ответ
Лучший ответ:
Я не настроен тестировать ваш код прямо сейчас, возможно, позже. Но:
; Set the prescalar to 256 in the Timer Control 1B register
ldi r16, 0b00000111
sts TCCR1B, r16
Когда установлено значение единицы, младшие три бита TCR1B, выберите внешний источник синхронизации на выводе T1 для синхронизации на восходящем крае. Вероятно, то, что происходит, заключается в том, что, когда ваш палец находится достаточно близко к контакту T1, вы емкостно соединяете частоту сети с ним, заставляя его тикать.
/256 прескалер будет иметь 100
в нижних трех битах.
Если мне удастся получить надлежащую среду для тестирования вашего кода, я изучу его немного более тщательно.
- Нужна помощь в программировании ардуино на ассемблере
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
- Не удается снова загрузиться после смены платы
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Генерация стабильной частоты
- В чем разница между ATMEGA32 и ATMEGA328?
- Arduino UNO для получения подписи чипа ATmega328P-PU
- Последовательная связь ESP8266 с ATMega328P
OPS, Да, это было так, хотя я прочитал таблицу данных и увидел, что она была 100, не знаю, как она оказалась 111. в любом случае, в качестве предложения для среды я использую avrdude и ассемблер avra на терминале linux mint с arduino uno, @Mahmoud Salah
и основная частота в моей стране составляет около 60 Гц, и светодиод явно не мигал на этой частоте, это было быстро, но совсем не так быстро. Как это так? есть ли объяснение изменению частоты?, @Mahmoud Salah
Ну, частота того, что появляется на T1, эффективно делится на то, что вы делаете со своим ISR/
TCNT1
/OCRA1A
; один цикл на T1-это не одно выполнение "sbi PINB, LED_PIN", и каждое переключение соответствует только высокому или только низкому периоду цикла светодиода. Тогда у вас также могут быть высокочастотные компоненты, видимые в точке T1. Если бы вы хотели поэкспериментировать с этим, то нужно было бы ввести в T1 твердую частоту 60 Гц, чтобы устранить там неизвестные компоненты. Кстати, ваш ISR, вероятно, должен сохранять " r16`., @timemage