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

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

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

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

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

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 16 - AVR
Ребят, только начинаю работать в ассемблере, очень тяжело дается(( время поджимает, поэтому обращаюсь к вам. Задача звучит следующим...

Присвоение адресов регистрам - Assembler
Всем привет! Являюсь новичком в программировании на ассемблере, так что, надеюсь на вашу помощь) Вот есть у меня такая программа: ...

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

#define OCR1AW (*(volatile uint16_t *)(0x88))
результат тот же CodeVision не нравятся такие переменные....
0
paskal
444 / 293 / 26
Регистрация: 15.08.2011
Сообщений: 875
20.05.2017, 15:16 #6
Ааа, так у вас CodeVision оказывается! Ну так он вообще стандарта С++ не придерживается. Это с-подобный язык фактически, и без плюсов кроме того. WinAVR поддерживает оба - C и C++. Если хотите свое что то творчески создавать лучше переходить на нормальный C/C++ компилятор.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2017, 15:16
Привет! Вот еще темы с ответами:

помогите с проведением по 2 регистрам - 1С
помогите с проведением по 2 регистрам

1C 8.x (тонкий) Докумен проводится не по всем регистрам - 1С
Ситуация такая. Надо было из обычного перевести в управляемое приложение форму документа Списание Товаров. Перерисовал форму, обработчики...

1C 8.x СКД запрос к двум регистрам - 1С
Добрый день, прошу помочь разобраться с запросом в СКД к нескольким регистрам. Из регистра ТоварыНаСкладах необходима получить остаток по...

Доступ к регистрам через функции и структуры - C++
Помогите построчно описать программу: #include&lt;stdio.h&gt; #include&lt;dos.h&gt; #include&lt;conio.h&gt; void main(){ union REGS rr; ...


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

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
20.05.2017, 15:16
Ответ Создать тему
Опции темы

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