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

Нужна помощь в прошивании AVR

AVR Studio 4.18 build 716 при компиляции выдает ошибку. Я помню что всамом начале тоже пытался задействовать это прерывание и у меня была такая же ошибка.

.device ATtiny13A
.nolist
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13Adef.inc"
.list

.def temp = r16
.def Delay1 = r17
.def Delay2 = r18
.def Delay3 = r19

rjmp RESET; Reset Handler
rjmp EXT_INT0; IRQ0 Handler
rjmp PCINT0; PCINT0 Handler
reti;rjmp TIM0_OVF; Timer0 Overflow Handler
reti;rjmp EE_RDY; EEPROM Ready Handler
reti;rjmp ANA_COMP; Analog Comparator Handler
reti;rjmp TIM0_COMPA; Timer0 CompareA Handler
reti;rjmp TIM0_COMPB; Timer0 CompareB Handler
reti;rjmp WATCHDOG; Watchdog Interrupt Handler
reti;rjmp ADC; ADC Conversion Handler

 

вот такая ощибка:

D:\AVR Project\fonar\fonar.asm(131): error: Illegal attempt to re-use 'PCINT0' as label

 

Пишет что PCINT0 где-то уже ипользовалось! Что за чушь, мы же его впервые в программе написали.

 

Да... а разве нет резници между EXT_INT0 и INT0?

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

Поделиться сообщением


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

вот такая ощибка:

D:\AVR Project\fonar\fonar.asm(131): error: Illegal attempt to re-use 'PCINT0' as label

 

Пишет что PCINT0 где-то уже ипользовалось! Что за чушь, мы же его впервые в программе написали.

 

Да... а разве нет резници между EXT_INT0 и INT0?

замените PCINT0 на любое др. имя к примеру PCINT0_vect , т.к. имя PCINT0 описывается в tn13Adef.inc который вы включили в свой проект

Поделиться сообщением


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

замените PCINT0 на любое др. имя к примеру PCINT0_vect , т.к. имя PCINT0 описывается в tn13Adef.inc который вы включили в свой проект

Как микроконтроллер поймет что нужно перейти в это место при совершении прерывания?

А я думал что метка в программе должна называться как прерывание, и когда совершается прерывание то программа переходит в это место.

Поделиться сообщением


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

Таблица векторов прерываний на адреса памяти программ 0h,2h,4h,6h и так далее, аппаратно прошита в МК, и уже с этих адресов командой rjmp, осуществляется переход на любую пользовательскую подпрограмму обработки прерывания, и без разницы как она называется, только выход из нее происходит по reti, а не по ret.

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

Поделиться сообщением


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

Пишет что PCINT0 где-то уже ипользовалось! Что за чушь, мы же его впервые в программе написали.

 

Да... а разве нет резници между EXT_INT0 и INT0?

Valek, а чему Вы удивляетесь? Пока Вы будете делать по две ошибки в слове, программы Ваши и работать будут соответственно.

Вы же и на ассемблере пишете с той же внимательностью.

Поделиться сообщением


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

Valek, а чему Вы удивляетесь? Пока Вы будете делать по две ошибки в слове, программы Ваши и работать будут соответственно.

Вы же и на ассемблере пишете с той же внимательностью.

:blush: прям как диктант пишем, будем повнимательней.

А на ассемблере где ошибся?

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

Поделиться сообщением


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

А я думал что метка в программе должна называться как прерывание, и когда совершается прерывание то программа переходит в это место.

коду программы всеравно как обзывается метка

Последний кусок , где :

; Пробуждение из спящего режима
  INT0:

нужно убрать

Поделиться сообщением


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

Ну вот, совсем по-простому. Эта программа работает как часы. Но я хочу установить спящий режим. Какие регистры мне необходимо настроить? MCUCR и GIMSK? Без прерываний не обойтись?

; Программа для фонаря с магнитным управлением
; частота 1 МГц от внутреннего генератора

.device ATtiny13A
.nolist
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13Adef.inc"
.list

.def temp = r16
.def delay1= r17
.def delay2= r18
.def delay3= r19

rjmp Init

Init:
;Назначаем входы и выходы портов (0-вход, 1-выход)
    ldi temp,0b111101
    out DDRB ,temp
;Включаем подтяжку на входах (1-есть рез., 0- нет рез.) 
;и задаем начальное состояние выходов
    ldi temp,0b000010
    out PORTB ,temp

Start:
    rcall knopka

on:
        sbi portB, 4;включаем светодиод          

    ;задержка 7 милисекунд
        ldi Delay1, 0x78
        ldi Delay2, 0x05
        ldi Delay3, 0x00
        rcall Delay

        cbi PortB, 4   ;тушим светодиод
    
    ;задержка 1 милисекунда
        ldi Delay1, 0xC8
        ldi Delay2, 0x00
        ldi Delay3, 0x00
        rcall Delay    

        sbis PinB, 1      ;проверяем нажатие кнопки
    
        rjmp knopka

    rjmp on


//Подпрограмма "кнопка"
    knopka:
        sbic PinB, 1;ждем нажатия кнопки
        rjmp knopka

;задержка от дребезга контактов 5mc
        ldi Delay1, 0x78
        ldi Delay2, 0x05
        ldi Delay3, 0x00
        rcall Delay
    
    puch:
        sbis PinB, 1;ждем отпускания кнопки
        rjmp puch
    
        ret

Delay:
    subi Delay1,1
    sbci Delay2,0
    sbci Delay3,0
    brcc Delay
    ret

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...