Например TDA7294

Форум РадиоКот • Просмотр темы - Нескольно простых вопросов о программировании AVR на Си.
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср дек 31, 2025 21:56:21

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 1499 ]     ... , , , 17, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вт дек 01, 2015 19:15:24 
Мучитель микросхем

Карма: 3
Рейтинг сообщений: 44
Зарегистрирован: Вс авг 30, 2015 03:52:59
Сообщений: 469
Рейтинг сообщения: 0
В двух предыдущих постах, рассуждения об атомарности - оторваны от рассматриваемой ситуации. То есть - мимо кассы. :dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вт дек 01, 2015 19:52:19 
Встал на лапы
Аватар пользователя

Зарегистрирован: Чт сен 03, 2015 15:52:10
Сообщений: 109
Откуда: Сибирский федеральный округ
Рейтинг сообщения: 0
Почему? я говорил о том что если писать в регистры как обычно и так придется использовать несколько инструкций (записать значение бита в один регистр и во второй это минимум 2 инструкции) для одной настройки. А битовые поля сами по себе не атомарны запись: [перейти по указателю-> считать исходное значение-> применить логическое или с новым значением -> записать обратно] (само значение бита(ов) двигать еще придется) чтение [перейти по указателю-> считать значение -> применить маску] (возможно ее тоже считать во время исполнения придется).

_________________
я повелитель электронов! Но иногда появляются электроны бунтари и делают, что им вздумается, например, прокладывают новые пути движения...

"Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного." Альберт Эйнштейн.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вт дек 01, 2015 19:56:46 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
DronVolk писал(а):
не бред! Любые манипуляции с регистрами желательно защищать если нет уверенности в атоморности и тут нужно смотреть высер компилятора

Обычно эти настройки выполняются в начале программы, когда прерывания запрещены. То есть просто обернуть их парой cli/sei нельзя (а то прерывания будут разрешены слишком рано). Можно, конечно, сохранить весь SREG, но это все равно минимум 2 лишние команды.
Pnjom-Penb писал(а):
В двух предыдущих постах, рассуждения об атомарности - оторваны от рассматриваемой ситуации. То есть - мимо кассы. :dont_know:
А какую ситуацию вы рассматриваете? Лично я - общую, для нее пример и дал.
Кстати, я не в курсе, гарантируется ли постоянство адресов. То есть если в ATmega8 регистры TCCR1A и TCCR1B расположены по адресам 0x2F и 0x2E, будут ли они во всех контроллерах идти последовательно и в том же порядке? Это представляется логичным, но гарантируется ли где-нибудь?
Ну и запись значений напрямую в регистры выглядит компактнее и проще, чем нагромождение настроек отдельных битов. Даже не повторяя про умение avr-gcc работать с битовыми полями.
Может, проще через макросы? Что-то вроде
Код:
TIMER_SET_MODE(1,TIMER_PWM);
TIMER_SET_PRESCALER(0, TIMER_128);
Причем, поскольку менять режим работы таймера "на лету" вряд ли понадобится, можно обойтись без атомарности, при необходимости реализовав ее снаружи.
Цитата:
А битовые поля сами по себе не атомарны
Если использовать именно указатель - да, по скорости, объему и, частично, надежности все будет печально. А вот изменение 1-2 битов в регистре это 1-2 команды sbr/cbr. Положить битовую структуру на константный адрес может быть непросто (скорее по внешнему виду).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вт дек 01, 2015 19:59:54 
Мучитель микросхем

Карма: 3
Рейтинг сообщений: 44
Зарегистрирован: Вс авг 30, 2015 03:52:59
Сообщений: 469
Рейтинг сообщения: 0
DronVolk писал(а):
Почему?
Честно говоря, мне сейчас не по-джентльменски отвлекаться на всякие мелочи и оставлять даму без внимания. 8)
Выше уже достаточно сказано, чтобы все отловить. Кстати - в статье, по второй ссылке, предоставленной Вами же, все уже сказано. Вы только ищете статьи, но не читаете их? :))) :))) 8)


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Ср дек 02, 2015 12:37:33 
Встал на лапы
Аватар пользователя

Зарегистрирован: Чт сен 03, 2015 15:52:10
Сообщений: 109
Откуда: Сибирский федеральный округ
Рейтинг сообщения: 0
COKPOWEHEU писал(а):
Может, проще через макросы? Что-то вроде
Код:
TIMER_SET_MODE(1,TIMER_PWM);
TIMER_SET_PRESCALER(0, TIMER_128);

Причем, поскольку менять режим работы таймера "на лету" вряд ли понадобится, можно обойтись без атомарности, при необходимости реализовав ее снаружи.


вопрос изначально полез не в ту сторону :) он был в само-документировании кода. До этого я решал эту проблему макросами примерный вид:

Код:
Timer_setup(0)
  Com_A_Disable()
  Com_B_Set()
  Prescale_x8()
  ...
End_Timer_Setup()


это разворачивалось уже в запись в регистры, но проблемы были в том, что макросы иногда уезжали и на выходе получалось не то. (сами макросы получались больше чем если бы битовые поля использовать вот и задумался)

Каждый сам решит через призму своего опыта и заблуждений что лучше для него самого.

_________________
я повелитель электронов! Но иногда появляются электроны бунтари и делают, что им вздумается, например, прокладывают новые пути движения...

"Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного." Альберт Эйнштейн.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн фев 01, 2016 07:22:32 
Сверлит текстолит когтями
Аватар пользователя

Карма: 10
Рейтинг сообщений: 111
Зарегистрирован: Ср июл 25, 2012 21:40:09
Сообщений: 1193
Откуда: Самара
Рейтинг сообщения: 0
Комрады! наткнулся на грабли. АВР студия 5 и выше. Микроконтроллер 8535 и атмега16.

При попытке выполнить следующий код:

unsigned long uValue = 0;

uValue |= (1<<15);

uValue принимает значение 0xFF FF 80 00

хотя я ожидаю 0x00 00 80 00

код: uValue |= (0b1000000000000000); такое безобразие не делает.

подскажите - WTF ???


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн фев 01, 2016 07:55:09 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4900
Откуда: Минск
Рейтинг сообщения: 1
Всё верно.
1) Числа 1 и 15 - это signed int,
2) (1<<15) даёт 0x8000 - отрицательное 16-битное число (signed int), оно же равно -32768.
3) Приведение его к 32-битному даёт 0xFFFF8000, оно же -32768


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн фев 01, 2016 11:09:06 
Сверлит текстолит когтями
Аватар пользователя

Карма: 10
Рейтинг сообщений: 111
Зарегистрирован: Ср июл 25, 2012 21:40:09
Сообщений: 1193
Откуда: Самара
Рейтинг сообщения: 0
Да. Разобрался. Спасибо!

По умолчанию компилятор студии воспринимает все не явно объявленные значения как signed int.

Для борьбы с подобного рода неясностями необходимо числа объявлять явно.

Конструкция
uValue |= (1UL<<15);
дает ожидаемый результат :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн фев 01, 2016 13:40:44 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2135
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18450
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
c2n писал(а):
По умолчанию компилятор студии воспринимает все не явно объявленные значения как signed int.
вообще-то любой вменяемый компилятор Си так поступает. причем не как signed int, а как просто int (signed int это масло масляное)

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вт фев 09, 2016 03:04:08 
Потрогал лапой паяльник
Аватар пользователя

Карма: 1
Рейтинг сообщений: 14
Зарегистрирован: Вт дек 31, 2013 17:36:43
Сообщений: 311
Рейтинг сообщения: 0
Добрый Вечер Коты!!!
У меня есть один вопрос точнее прошение обьясните что конкретно делает конткретный фрагмент кода!!!Я программирую в баском с Си практически не знаком :(
Спойлерvoid write_byte(unsigned char c,unsigned char com)//0-command 1-data
{
CB(PORT_LCD,CS);
if(com==0)
CB(PORT_LCD,RS);
else
SB(PORT_LCD,RS);
SB(PORT_LCD,SCK);
for(unsigned char i=0;i<8;i++)
{
if(((c>>(7-i))&1) == 1)
SB(PORT_LCD,MOSI);
else
CB(PORT_LCD,MOSI);
CB(PORT_LCD,SCK);
SB(PORT_LCD,SCK);
}
SB(PORT_LCD,CS);
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вт фев 09, 2016 06:04:39 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4900
Откуда: Минск
Рейтинг сообщения: 0
Реализация SPI. Достаточно кривая, но вроде как рабочая.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вт фев 09, 2016 16:53:56 
Потрогал лапой паяльник
Аватар пользователя

Карма: 1
Рейтинг сообщений: 14
Зарегистрирован: Вт дек 31, 2013 17:36:43
Сообщений: 311
Рейтинг сообщения: 0
WiseLord писал(а):
Реализация SPI. Достаточно кривая, но вроде как рабочая.

Я попросил обьяснить что он делает а не что это такое я не могу понять сами циклы и условия обьясните пожайлуста если не трудно :(


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вт фев 09, 2016 17:15:44 
Мудрый кот
Аватар пользователя

Карма: 24
Рейтинг сообщений: 286
Зарегистрирован: Чт июн 10, 2010 08:55:35
Сообщений: 1810
Откуда: Сибирские Афины
Рейтинг сообщения: 1
Телепатирую... :)) IMHO, т.е.
CB и SB скорее всего макросы принимающие два параметра - порт и номер бита.
CB - clear bit, очистить, сбросить бит в "0"
SB - set bit, установить в "1"
PORT_LCD, RS, MOSI, MISO и т.д. определённые с помощью #define метки указывающие на реальные порт и биты.
Если ты представляешь что такое SPI, то дальше вопросов быть не должно.

Выбор устройства, устанавливается бит команда или данные и строб.
Код:
CB(PORT_LCD,CS);
  if(com==0)
    CB(PORT_LCD,RS);
  else
    SB(PORT_LCD,RS);
  SB(PORT_LCD,SCK);


Далее цикл отправки 8 бит.
В if-е проверка i-того бита...
Строб.
После цикла "отпустить" устройство.
Код:
  for(unsigned char i=0;i<8;i++)
  {
    if(((c>>(7-i))&1) == 1)
      SB(PORT_LCD,MOSI);
    else
      CB(PORT_LCD,MOSI);

    CB(PORT_LCD,SCK);
    SB(PORT_LCD,SCK);
  }
  SB(PORT_LCD,CS);


Если надо более детально, то сужай область непонятного.
Если не видел ещё, полезно бывает.

_________________
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн фев 15, 2016 03:36:03 
Потрогал лапой паяльник
Аватар пользователя

Карма: 1
Рейтинг сообщений: 14
Зарегистрирован: Вт дек 31, 2013 17:36:43
Сообщений: 311
Рейтинг сообщения: 0
Kavka писал(а):
Телепатирую...

Спойлерvoid WriteTwoByte(unsigned char LCD_DataH,unsigned char LCD_DataL)
{
write_byte(LCD_DataH,1);
write_byte(LCD_DataL,1);
}

void OutColor(unsigned int color)
{
WriteTwoByte((color>>8),((color<<8)>>8));
}

Обьясни пожалуйста операции со сдвигом битов первое я понял что они здвигаютса в право на 8 а вот второй кусок для меня непонятен :idea:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн фев 15, 2016 07:51:01 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
Kavka писал(а):
Код:
    if(((c>>(7-i))&1) == 1)


Вот так делать не стоит - слишком медленно. Лучше скопировать в локальную переменную, а ее сдвигать не боясь
char temp - c;
Код:
for(i=0;i<8;i++){
  if( temp & (1<<7))
    SB(PORT_LCD,MOSI);
  else
    CB(PORT_LCD,MOSI);

  temp <<=1;
  CB(PORT_LCD,SCK);
  SB(PORT_LCD,SCK);
}
SB(PORT_LCD,CS);
Или, если уж хотите проверки по маске,
Код:
char temp=(1<<7);
for(i=0;i<8;i++){
  if( c & temp)
    SB(PORT_LCD,MOSI);
  else
    CB(PORT_LCD,MOSI);

  temp >>=1;
...
Или даже так
Код:
const char mask[8]={(1<<7), (1<<6), (1<<5), (1<<4), (1<<4), (1<<3), (1<<2), (1<<1), (1<<0)};
for(i=0;i<8;i++){
  if( c & mask[i])
...
Два первых варианта одинаковы по скорости и объему, третий чуть-чуть быстрее, но занимает на 7 байт ОЗУ больше. Как по мне, первый вариант наиболее прост.
Цитата:
Обьясни пожалуйста операции со сдвигом битов первое я понял что они здвигаютса в право на 8 а вот второй кусок для меня непонятен :idea:

Первое - да, сдвиг вправо на 8 бит, то есть старший байт числа, второе - шаманство, не очень понятно что и зачем делается, если можно обойтись простым приведением типа.
WriteTwoByte((unsigned char)(color>>8),(unsigned char)color);
Цитата:
причем не как signed int, а как просто int (signed int это масло масляное)
Если я правильно помню, стандартом не оговариваются ни размер, ни наличие знака у стандартных типов, это сделано для упрощения разработки компиляторов. То есть int может быть эквивалентен int32_t, uint16_t и другим, и это нормально.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн фев 15, 2016 08:50:39 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2135
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18450
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
COKPOWEHEU писал(а):
Если я правильно помню, стандартом не оговариваются ни размер, ни наличие знака у стандартных типов, это сделано для упрощения разработки компиляторов. То есть int может быть эквивалентен int32_t, uint16_t и другим, и это нормально.
нет, int всегда знаковый.

COKPOWEHEU писал(а):
Или даже так
Код:
char temp=(1<<7);
for(; temp; temp >>= 1){
  if( c & temp)
    SB(PORT_LCD,MOSI);
  else
    CB(PORT_LCD,MOSI);
...

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн фев 15, 2016 16:22:26 
Мудрый кот
Аватар пользователя

Карма: 24
Рейтинг сообщений: 286
Зарегистрирован: Чт июн 10, 2010 08:55:35
Сообщений: 1810
Откуда: Сибирские Афины
Рейтинг сообщения: 0
Balzercvua писал(а):
Код:
void OutColor(unsigned int color)
{
WriteTwoByte((color>>8),((color<<8)>>8));
}


unsigned int тут это 16-битное целое (например тынц).
Соответственно задвинув его влево на 8 бит теряются старшие 8 бит. И сдвинув обратно получаем нули в старших битах.
Проще или сделать приведение типов (как уже упоминалось) или побитовое "И" с маской из 8-ми бит.

_________________
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Чт фев 25, 2016 20:41:05 
Родился

Зарегистрирован: Пн июн 17, 2013 14:22:37
Сообщений: 4
Рейтинг сообщения: 0
Здравствуйте всем.
Только начал изучать программирование AVR. Решил начать с Си. Поставил AVRStudio 5.0. И AtTiny13. Написал программку включения диода:
#include <avr/io.h>
#include <avr/interrupt.h> // Подключение системного файла для работы с прерываниями

//SIGNAL(INT0_vect)
SIGNAL(SIG_INTERRUPT0) // Обработчик прерываний
{
PORTB ^= 0x01;
}

int main(void)
{
PORTB = 0b11111111;
DDRB = 0b00000001;

GIMSK = 0b01000000; // Разрешение прерываний INT0 на входе PB1
MCUCR = 0b00000010; // при перепаде из 1 в 0

sei(); // Общее разрешение прерываний
while (1) {}
}
Получил .hex фаил 1кБайт. Предел, но можно
Добавляю задержку
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

//SIGNAL(INT0_vect)
SIGNAL(SIG_INTERRUPT0)
{
_delay_ms(200); // Задержка 200 миллисекунд
if (bit_is_clear(PINB,PB1)) // Опрос PB1
PORTB ^= 0x01;
}
int main(void)
{
PORTB = 0b11111111;
DDRB = 0b00000001;

GIMSK = 0b01000000; // Разрешение прерываний INT0 на входе PB1
MCUCR = 0b00000010; // при перепаде из 1 в 0

sei();
while (1) {}
}
И плучаю .hex объемом 6 кбайт.
Может я чего не понимаю?
У AtTiny13 flash 1 кБайт.
Помогите понять, пожалуйста, я с дуба рухнул вниз башкой, или 5-я AVRStudio ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Чт фев 25, 2016 21:03:50 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
.hex это текстовый файл, его размер не отражает объем занимаемого flash
https://ru.wikipedia.org/wiki/Intel_HEX


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Чт фев 25, 2016 21:20:47 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4900
Откуда: Минск
Рейтинг сообщения: 0
а) Первое компилируется в 94 байта (hex 279 байт), второе - в 120 байт (hex 357 байт). Это при уровне оптимизации -Os.

б) SIGNAL(SIG_INTERRUPT0) - устарело и новые компиляторы на это ругаются (poisoned interrupt). Лучше использовать ISR(INT0_vect).

в) Код странноват. Да, он рабочий - в рамках техзадания - и установка бита 0 в лог. 1 перед выходом из прерывания приведёт к новому прерыванию сразу после выхода. Но боюсь, на основной цикл, будь там что-то посерьёзнее while() {}, процессора уже не хватит.

г) Ну и классика - задержка (тем более такая большая) в прерывании - зло. Хотя в рамках изучения прерываний сойдёт.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 1499 ]     ... , , , 17, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y