Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79

Работа с прерыванием TIMER0. Atmega328p. Arduino nano

16.10.2024, 21:29. Показов 2002. Ответов 23

Студворк — интернет-сервис помощи студентам
Хочу по прерыванию TIM0_OFV зажигать светодиод PB5.

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
.equ    DDRB, 0x04                                                              
.equ    PORTB, 0x05                                                             
                                                                                
.equ    TCCR0B, 0x25            ; 14.9.2 of datasheet.                          
.equ    TIMSK0, 0x6E            ; 14.9.6 of datasheet. Timer Interrupt Mask     
.equ    TCNT0, 0x26             ; 14.9.3 of datasheet. Timer Register.          
                                ; Register.                                     
.equ    SPH, 0x3E               ; 6.5.1 of datasheet.                           
.equ    SPL, 0x3D                                                               
                                                                                
.equ    RAMEND, 0x8FF           ; Не  до конца уверен, что правильно 
; определил эту константу, но если верить 7.3  datasheet 
; и заголовочникам, всё ок.                                           
                                                                                
.section .text   ; Эта куча nop'ов взята из той же методички Донова. 
; В datasheet вместо nop'ов прыжки на метки прерываний.                                                               
                                                                                
jmp RESET    ; Reset Handler                                                    
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
jmp TIM0_OVF ; Если сделать  avr-objdump -d main.elf, будет показано 
; что данная команда находится по адресу 0x20, по которому и должно быть
; указано по п. 11.1 datasheet                                        
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
nop                                                                             
                                                                                
main: rjmp main                                                               
                                                                                
RESET:                         
       ; инициализация стека                                          
        ldi r16, hi8(RAMEND)                                                    
        out SPH, r16                                                            
        ldi r16, lo8(RAMEND)                                                    
        out SPL, r16                                                            
                                                                                
        ldi r16, 0b00100000                                                     
        out DDRB, r16                                                                                                                    
         
        ; Настраиваем прерывания, это сделано по методичке Донова Г.И.
        ; с предварительно проверкой адресов в datasheet                                                               
        ldi r16, 0x00                                                           
        out TCNT0, r16          ; Set Timer0 zero time.                         
        ldi r16, 0x01                                                           
        sts TIMSK0, r16         ; Set interrupt for Timer0 overflow TCNT0.          
        ldi r16, 0b00000101                                                     
        out TCCR0B, r16         ; Set 1/1024 tick.                              
        sei                     ; Global Interrupt Enable                       
                                                                                
        rjmp main                                                               
                                                                                
                                                                                
TIM0_OVF:                                                                       
        sbi PORTB, 5                                                            
        reti

Собирается и прошивается так:
Code
1
2
3
avr-gcc -Wall -mmcu=atmega328p -nostdlib main.S -o main.elf
avrdude -b 57600 -c usbasp -p atmega328p -P usb \
    -U flash:w:main.elf
В результате, светодиодик не загорается. Что я делаю не так?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.10.2024, 21:29
Ответы с готовыми решениями:

Не работает серво на ARDUINO NANO ATMEGA328P
Здравствуйте! Есть проблема не работает серво на ардуино nano, не ну то-есть как не работает....... она работала но в один прекрасный(ваще...

Проблемы с прошивкой Arduino Nano, ATmega328P
#define LED_R 11 // Pin D11 --> красный #define LED_G 10 // Pin D10 --> зеленый #define LED_B 9 // Pin D9 --> синий int red(); ...

Самопроизвольная перезагрузка Arduino Atmega328P
Добрый день. Заметил достаточно странное поведение, контроллер периодически самопроизвольно перезагружается. В данное время...

23
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
20.10.2024, 21:15  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Кстати, если хотите показать, что метка очень-очень локальная (цикл или условие в пределах пары десятков строчек), куда с другого конца кода не попадают, можно вообще обойтись цифрами:
Нет, всё же так делать, не стоит:

"avra refers to the current program counter address as PC, avr-as uses .. But there is a more subtle and much more important difference:
avra counts words, but avr-as counts the bytes. But it is more complex than just multiplying everything by two.
relative jump with avra: PC refers to the address of the current command and counts the distance in words:

Assembler
1
2
3
4
breq    PC+3
    nop
    inc r0
    ret     ; the branch lands here
relative jump with avr-as: . refers already to the address of the following command and counts the distance in bytes:
Assembler
1
2
3
4
    breq    .+4
    nop
    inc r0
    ret     ; the branch lands here
Conclusion
Stop counting. Use labels."


Источник

Добавлено через 2 часа 32 минуты
Цитата Сообщение от sharpey Посмотреть сообщение
QEMU вполне неплох.
Благодарю! Попробую его. simulavr я забраковал, т.к. он не поддерживает 328p: список поддерживаемых устройств . А по simavr как-то никакой норм документации не нашёл.
0
 Аватар для COKPOWEHEU
4078 / 2676 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
20.10.2024, 22:06
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
Нет, всё же так делать, не стоит:
Вы, сдается мне, невнимательно ознакомились с примером. Я не предлагал считать смещения вручную, я предлагал использовать "полуанонимные" метки. Посмотрите пример еще раз и поэкспериментируйте с ним самостоятельно.
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
simulavr я забраковал, т.к. он не поддерживает 328p
Да неужели? ATmega328 там есть. Без 'P', правда, но это ни на что не влияет.
0
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
21.10.2024, 09:06  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вы, сдается мне, невнимательно ознакомились с примером.
Да, пример ваш совсем другой. Наверное, глаз замылился.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
ATmega328 там есть.
Для 328 и 328p разные заголовочники. И в списке avrdude они отдельно:
Bash
1
2
3
4
5
avrdude -p ? 2>&1 | grep 328
  m328       = ATmega328 (SPM, ISP, HVPP, debugWIRE)
  m328p      = ATmega328P (SPM, ISP, HVPP, debugWIRE)
  m328pb     = ATmega328PB (SPM, ISP, HVPP, debugWIRE)
  lgt8f328p  = LGT8F328P (SPM, ISP, HVPP, debugWIRE)
Но вот заглянул в заголовочник... В iom328.h только одна строка:
C
1
#include "iom328p.h"
0
5 / 5 / 0
Регистрация: 03.09.2013
Сообщений: 79
22.10.2024, 17:54  [ТС]
Цитата Сообщение от Medusa Kaiser Посмотреть сообщение
(дополнительные локальные метки добавил для читаемости)
Нифига это не локальные метки. Для nasm'а они пишут через точку. В AVR локальные метки делаются так:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Кстати, если хотите показать, что метка очень-очень локальная (цикл или условие в пределах пары десятков строчек), куда с другого конца кода не попадают, можно вообще обойтись цифрами:
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.10.2024, 17:54
Помогаю со студенческими работами здесь

Arduino uno на atmega328P-PU ошибка
Всем доброго времени суток, уважаемые! Купил сыну на день рождения на али робота, собрал, а обновить прошивку не дает. Выдает ошибку...

Arduino Nano
Всем привет, прикупил себе китайскую ардуино нано и возникли проблемы с установкой драйверов, хотя годом ранее такой проблемы не было все...

Тестировщик на Arduino Nano
Доброго времени, нужен элементарный скетч на тестировщик, однако по алгоритму и уточнить ряд неясностей: 1) Замеряем тестируемое...

Arduino Nano, I2C
Привет бойцы невидимого фронта. Проблема такова, у меня есть часы реального времени DS1307, и OLED I2C дисплей 0.91 (128x32) а так же...

Программирование Arduino nano
Через каждые 20 мс производить опрос кнопки с помощью таймера, и если кнопка нажата, то импульсы выключить, а если кнопка не нажатой...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru