Форум программистов, компьютерный форум CyberForum.ru

Микроконтроллеры AVR

Войти
Регистрация
Восстановить пароль
 
vasiaFPV
1 / 1 / 0
Регистрация: 05.10.2016
Сообщений: 46
#1

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

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

Смутно помню, что на 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 ее нет.
В общем как туда че то записать где посмотреть пример и почитать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2017, 17:54     Обращение к 16 -ричным регистрам ATmega 328
Посмотрите здесь:

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

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

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

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

ATmega 128. Кодовый замок - AVR
Доброго времени суток! У меня есть задание на курсовой проект : Устройство контроля доступом на базе микроконтроллера ATmega128,...

Подсчет оборотов двигателя на ATmega 48 - AVR
Требуется сосчитать обороты ДВС и вывести на экран. Для этого я решил присобачить схему простейшего стробоскопа (pdf вложение) к...

Логика выставления RTS (Atmega 48) - AVR
Здравствуйте, хотелось бы поделиться с Вами своей проблемой..ибо решения её найти не в силах..может кто знает.. Ситуация такая..при...

Работа по шине CAN Atmega 64M1 - AVR
Здравствуйте. Помогите пожалуйста разобраться с работой по шине CAN (V2.0A интересует) на микроконтроллере Atmega64M1 Никак не могу...

Переключение в таймере (Atmega 8515) - AVR
Привет ребят. Использую таймер 0, чтобы выполнять прерывания на совпадение. Вот даташит на мк: http://lib.chipdip.ru/059/DOC000059786.pdf ...

Не хочет работать таймер ATMega 2560 - AVR
Здравствуйте! Занимаюсь разработкой девайса обменивающегося с периферией по RS485. Работает в режиме Slave. Из-за особенностей протокола...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
paskal
434 / 283 / 25
Регистрация: 15.08.2011
Сообщений: 839
19.05.2017, 20:57     Обращение к 16 -ричным регистрам ATmega 328 #2
Цитата Сообщение от vasiaFPV Посмотреть сообщение
#define OCR1AW (*(unsigned int *) 0x88) // 16 bit access
а не работает
Делайте так:
#define OCR1AW _SFR_MEM16(0x88)
vasiaFPV
1 / 1 / 0
Регистрация: 05.10.2016
Сообщений: 46
20.05.2017, 06:19  [ТС]     Обращение к 16 -ричным регистрам ATmega 328 #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 как то некрасиво....но как шмогла.....
paskal
434 / 283 / 25
Регистрация: 15.08.2011
Сообщений: 839
20.05.2017, 10:59     Обращение к 16 -ричным регистрам ATmega 328 #4
Цитата Сообщение от vasiaFPV Посмотреть сообщение
на такое определение компилятор сразу ругается, типа не определен символ
А, ну тогда так:
C
1
#define OCR1AW (*(volatile uint16_t *)(0x88))
Добавлено через 33 минуты
ps
vasiaFPV, тот способ которым вы победили, сложный и громоздкий. Но главная проблема не в этом. Без квалификатора volatile вас ждут сюрпризы в будущем. Хотя может сейчас это и работает. Но в обработчике прерывания уже может не сработать.
Сперва вы правильным путем пошли, только про волатайл забыли.
vasiaFPV
1 / 1 / 0
Регистрация: 05.10.2016
Сообщений: 46
20.05.2017, 14:44  [ТС]     Обращение к 16 -ричным регистрам ATmega 328 #5
Цитата Сообщение от paskal Посмотреть сообщение
А, ну тогда так:
CВыделить код

#define OCR1AW (*(volatile uint16_t *)(0x88))
результат тот же CodeVision не нравятся такие переменные....
paskal
434 / 283 / 25
Регистрация: 15.08.2011
Сообщений: 839
20.05.2017, 15:16     Обращение к 16 -ричным регистрам ATmega 328 #6
Ааа, так у вас CodeVision оказывается! Ну так он вообще стандарта С++ не придерживается. Это с-подобный язык фактически, и без плюсов кроме того. WinAVR поддерживает оба - C и C++. Если хотите свое что то творчески создавать лучше переходить на нормальный C/C++ компилятор.
Yandex
Объявления
20.05.2017, 15:16     Обращение к 16 -ричным регистрам ATmega 328
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru