реклама на сайте
подробности

 
 
> Работа с отдельными битами под AVR Studio под С, Нужна консультация по чтению/записи отдельных бит в регистры AtMega
Master_MW
сообщение Mar 5 2009, 11:24
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 18-12-08
Из: Беларусь, Минск
Пользователь №: 42 590



Доброго времени суток , коллеги. Проблема в следующем. Пересмотрев достаточное количество материалов по программированию AVR на С, я так и не нашел ответа на сл. вопрос: как прочитать/изменить отдельный бит информации регистра? Для установления одного бита в лог. 1 есть библиотечная директива _BV(и та не везде работает). А как быть с чтением отдельных бит и установкой в ноль? На ассемблере ни для AVR, ни для PIC таких проблем не возникает.


--------------------
Отсуствие единых стандартов всегда будет мучать человечество.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Master_MW
сообщение Mar 5 2009, 20:08
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 18-12-08
Из: Беларусь, Минск
Пользователь №: 42 590



Сергей Борщ, Так, например, не хочет работать

PORTB=_BV(PORTB1);

mdmitry, Сергей Борщ,
Насчёт _BV mdmitry оказался прав, хотя в книге Ю.А. Шпака указано что _BV() библиотечный макрос (Ю.А. Шпак. Программирование на языке С для AVR и PIC микроконтроллеров, стр. 165). Проблема решилась с подключением файла avr/sfr_defs.h В тамошнем примере код до функции отработки прерывания следующий:
CODE
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#if defined(__AVR_AT90S2313__)
# define OC1 PB3
# define OCR OCR1
# define DDROC DDRB
#elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__)
# define OC1 PB1
# define DDROC DDRB
# define OCR OCR1
#elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || \
defined(__AVR_AT90S4434__) || defined(__AVR_AT90S8535__) || \
defined(__AVR_ATmega163__)
# define OC1 PD5
# define DDROC DDRD
# define OCR OCR1A
#endif

#if defined(COM11)
# define XCOM11 COM11
#elif defined(COM1A1)
# define XCOM11 COM1A1
#endif

enum { UP, DOWN };

unsigned int pwm;
unsigned char direction;
;


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

INTERRUPT(SIG_OWERFLOW1)

для корректной работы нужно использовать

ISR(TIMER0_OVF_vect){
OCR0++; if(OCR0==255) OCR0=0;}

Это простенький, реально заработавший в железе пример.
Тем не менее, ситуация достаточно прояснилась , - спасибо всем за помощь. Дело в том , что раньше я писал все свои проекты управления на VHDL, а теперь необходимы некоторые вычисл. мощности, которые проще сделать на МК, нежели на ПЛИС...


--------------------
Отсуствие единых стандартов всегда будет мучать человечество.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 5 2009, 21:01
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Master_MW @ Mar 5 2009, 22:08) *
Так, например, не хочет работать
PORTB=_BV(PORTB1);
Ммм... поясните пожалуйста термин "не хочет работать". Это выражение должно записать число 0x02 в PORTB. Затерев при этом предыдущее значение всех 8 битов.

Цитата(Master_MW @ Mar 5 2009, 22:08) *
в книге Ю.А. Шпака указано что _BV() библиотечный макрос
В этом со Шпаком можно согласиться. Это действительно макрос (он объявлен через #define), а не директива, как вы написали в первом сообщении, и он действительно часть библиотеки (avr-libc).
Цитата(Master_MW @ Mar 5 2009, 22:08) *
Проблема решилась с подключением файла avr/sfr_defs.h
Это несколько странно - этот файл включен в avr/io.h, поэтому должен подключаться автоматически при подключении avr/io.h. А без подключения avr/io.h компилятор не знает что такое PORTB и PORTB1. Становится совсем непонятно, как же у вас _BV() не работало.
Цитата(Master_MW @ Mar 5 2009, 22:08) *
для корректной работы нужно использовать

ISR(TIMER0_OVF_vect)
Помню из детства: "однако, за время пути собака могла подрасти". Время идет, компилятор развивается. Книга была написана давно, примеры в ней относятся к компилятору версии 2005-2006 года (если память не изменяет).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 22:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016