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

Обращение к 16 -ричным регистрам ATmega 328

19.05.2017, 17:54. Показов 1137. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Смутно помню, что на asm к I/O регистрам (с "большими адресами) можно было обращаться через хитрые команды типа sts и т.д. А вот где посмотреть как это делается на C++ че то не знаю.
Короче надо в OCR1(A-B) добавлять или вычитать единичку что то типа
C++
1
2
3
4
 if (OCR1BL==0xFF) {  OCR1BH= OCR1BH+1 ;OCR1BL= OCR1BL+1 ;} 
    
    else  {   OCR1BL= OCR1BL+1 ; 
    };
Тут в одном примере подсмотрел , тупо в дефайнсах в заголовочном файле обьявляют
#define ADCL (*(unsigned char *) 0x78)
#define ADCH (*(unsigned char *) 0x79)
#define ADCW (*(unsigned int *) 0x78) // 16 bit access
и с ADCW творят что хотят..... я туда же
#define OCR1AL (*(unsigned char *) 0x88)
#define OCR1AH (*(unsigned char *) 0x89)
#define OCR1AW (*(unsigned int *) 0x88) // 16 bit access
а не работает в OCR1AL все пишется, а в OCR1AH хрен.
Почитал букваря там (правда на младших моделях) вообще пишут OCR1A+1, у меня тоже не прокатило.
Вроде в 16 ричные все через двойную буферизаию , опять же для OCRxN ее нет.
В общем как туда че то записать где посмотреть пример и почитать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2017, 17:54
Ответы с готовыми решениями:

Atmega 328 + кварц NX3225SA-16.000000MHZ-T1
Помогите пожалуйста. Собираю частичный клон Arduino/ Все компоненты smd. Использую кварц...

WDT таймер срабатывает без задержки ATmega 328
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) |...

Раздельное питание цифровой и аналоговой части ATmega 328
Неожиданно осознал, что на МК есть два входа VCC и AVCC для раздельного питания аналоговой и...

Таймер в Atmega 328 не хочет считать до ICR1 (Toggle OC1A)
Всем привет. Столкнулся с непониманием почему таймер не хочет работать в следующем режиме....

Как правильно размещать таблицу прерываний (в ATmega 328 в частности)?
.cseg ; Выбор сегмента программного кода .org 0 ; Установка текущего адреса на ноль jmp ...

5
484 / 331 / 32
Регистрация: 15.08.2011
Сообщений: 1,071
19.05.2017, 20:57 2
Цитата Сообщение от vasiaFPV Посмотреть сообщение
#define OCR1AW (*(unsigned int *) 0x88) // 16 bit access
а не работает
Делайте так:
#define OCR1AW _SFR_MEM16(0x88)
0
1 / 1 / 0
Регистрация: 05.10.2016
Сообщений: 51
20.05.2017, 06:19  [ТС] 3
Цитата Сообщение от paskal Посмотреть сообщение
Делайте так:
#define OCR1AW _SFR_MEM16(0x88)
на такое определение компилятор сразу ругается, типа не определен символ
В С++ такие проблемы вроде должны решаться на раз два.... неужто придется делать ассемблерную вставку чтобы работать с РВВ.

Добавлено через 1 час 22 минуты
Кажется как то победил....типа если в даташите написано : "двойная буферизация" надо все понимать буквально - сначала читаем младший байт затем старший, а записываем наоборот. А фенечки типаOCR1AL = OCR1AL -1; OCR1AH = OCR1AH -1; не прокатывают так как какой байт стоит первым сразу и читается и записывается первым, а надо что бы кто читается первым записывался последним.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while (1)
      {
      if (~PIND&(1<<0)) {varOCRL=OCR1AL;  varOCRH= OCR1AH;
          if (varOCRL==0xFF) { OCR1AH =varOCRH+1; OCR1AL =varOCRL+1;
                            }
       else{  OCR1AL= OCR1AL+1 ;              };                       
                        } 
      if (~PIND&(1<<1)) {varOCRL=OCR1AL;  varOCRH= OCR1AH;
          if (varOCRL==0x00) { OCR1AH =varOCRH-1; OCR1AL =varOCRL-1;
                            }
       else{  OCR1AL= OCR1AL-1 ;              };                       
                        }     
       delay_ms(70);                                          
 
      
      }
пришлось правда две глобальных переменных вводить varOCRH и varOCRL как то некрасиво....но как шмогла.....
0
484 / 331 / 32
Регистрация: 15.08.2011
Сообщений: 1,071
20.05.2017, 10:59 4
Цитата Сообщение от vasiaFPV Посмотреть сообщение
на такое определение компилятор сразу ругается, типа не определен символ
А, ну тогда так:
C
1
#define OCR1AW (*(volatile uint16_t *)(0x88))
Добавлено через 33 минуты
ps
vasiaFPV, тот способ которым вы победили, сложный и громоздкий. Но главная проблема не в этом. Без квалификатора volatile вас ждут сюрпризы в будущем. Хотя может сейчас это и работает. Но в обработчике прерывания уже может не сработать.
Сперва вы правильным путем пошли, только про волатайл забыли.
0
1 / 1 / 0
Регистрация: 05.10.2016
Сообщений: 51
20.05.2017, 14:44  [ТС] 5
Цитата Сообщение от paskal Посмотреть сообщение
А, ну тогда так:
CВыделить код

#define OCR1AW (*(volatile uint16_t *)(0x88))
результат тот же CodeVision не нравятся такие переменные....
0
484 / 331 / 32
Регистрация: 15.08.2011
Сообщений: 1,071
20.05.2017, 15:16 6
Ааа, так у вас CodeVision оказывается! Ну так он вообще стандарта С++ не придерживается. Это с-подобный язык фактически, и без плюсов кроме того. WinAVR поддерживает оба - C и C++. Если хотите свое что то творчески создавать лучше переходить на нормальный C/C++ компилятор.
1
20.05.2017, 15:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2017, 15:16
Помогаю со студенческими работами здесь

Обращение к регистрам через адреса (ASM, AVR Studio)
Здравствуйте, есть такой вопрос: к примеру у меня в SRAM хранятся реальные адреса регистров общего...

Логическая операция над 16-ричным числом.
Здравствуйте. Есть код, который выполняет какие то логические приеобразования над значениями...

Вывод в Memo строки char 16-ричным кодом
как вывести в Memo в одну строку массив типа char в hex? Добавлено через 15 минут всё...

Макетная плата для Atmega 32?atmega 8
Здравствуйте !Уважаемые мастера нужна помощь (а именно нужна схема макетной платы для меги 32 и...

Проверить, является ли число 16-ричным, и вывести сумму введенных цифр
.386 .model flat, stdcall option casemap :none include \masm32\include\kernel32.inc include...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru