СВЕТОДИОД мигает в сборке с выходом 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

, 👍0


1 ответ


Лучший ответ:

3

Я не настроен тестировать ваш код прямо сейчас, возможно, позже. Но:

    ; Set the prescalar to 256 in the Timer Control 1B register
    ldi     r16, 0b00000111 
    sts     TCCR1B, r16

Когда установлено значение единицы, младшие три бита TCR1B, выберите внешний источник синхронизации на выводе T1 для синхронизации на восходящем крае. Вероятно, то, что происходит, заключается в том, что, когда ваш палец находится достаточно близко к контакту T1, вы емкостно соединяете частоту сети с ним, заставляя его тикать.

/256 прескалер будет иметь 100 в нижних трех битах.

Если мне удастся получить надлежащую среду для тестирования вашего кода, я изучу его немного более тщательно.

,

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