Например TDA7294

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

Текущее время: Сб сен 27, 2025 05:01:49

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


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



Начать новую тему Ответить на тему  [ Сообщений: 8324 ]     ... , , , 416,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Ср сен 24, 2025 23:37:15 
Друг Кота

Карма: -2
Рейтинг сообщений: 53
Зарегистрирован: Вт мар 13, 2012 12:16:13
Сообщений: 8543
Откуда: .ru
Рейтинг сообщения: 0
-CodeVisionAVR C Compiler такие команды принимает.
-AVRStudio такие команды принимает.
-Ардуино тоже должна такие команды принимать.
:tea:

Запись я делают так:
-записываю в буфер.
-считаю CRC32 для буфера.
-после записи делаю верификацию.
-если в процессе записи произошла ошибка то устанавливается флаг "ошибка" и загорается светодиод "ошибка".

Спойлер
Код:
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////TX_EEPROM:   
void TX_EEPROM(void)
{
  /////////////////////////////////////////////// TX: Interrupts:
  //#asm("sei")  // вкл Global Interrupts
  #asm("cli")    // выкл Global Interrupts
  /////////////////////////////////////////////// сброс  флаг error_EEPROM
  error_EEPROM = 0;                                         
  /////////////////////////////////////////////// флаг > TX_int
  TX_int[0] = blok_sys;       // blok_sys //-начальное 0.
  TX_int[1] = Lampa;          // Lampa 
  TX_int[2] = 0;              //           
  TX_int[3] = slider_5;       // Ползунок 5 Температура MAX 
  TX_int[4] = slider_4;       // Ползунок 4 Температура MIN
  TX_int[5] = hour_ON;        // часы ON       
  TX_int[6] = min_ON;         // минуты ON       
  TX_int[7] = hour_OFF;       // часы OFF       
  TX_int[8] = min_OFF;        // минуты OFF     
  TX_int[9] = 0;     
  TX_int[10] = 0;     
  TX_int[11] = 0;     
  /////////////////////////////////////////////// crc:
  //TX_int[12] = 0;     
  //TX_int[13] = 0;     
  //TX_int[14] = 0;     
  //TX_int[15] = 0;     
  /////////////////////////////////////////////// crc буфер EEPROM:     
  TX_len = 16;
  fcrcTX();
  /////////////////////////////////////////////// запись буфер > EEPROM:
   for (xTX=0; xTX<TX_len; xTX++) {                                 
     EEAR = xTX;                     
     EEDR = TX_int[xTX];             
     EECR |= 0b00000100;           
     EECR |= 0b00000010;           
     while(EECR & 0b00000010);     
   };
  /////////////////////////////////////////////// верификация: (EEPROM == буфер)                     
   for (xTX=0; xTX<TX_len; xTX++) {                                 
     EEAR = xTX;             
     EECR |= 0b00000001;     
     x1TX = EEDR;
     if ( TX_int[xTX] != x1TX ) {error_EEPROM = 1;}; // флаг error_EEPROM
   };
  /////////////////////////////////////////////// LCD                     
  if (error_EEPROM) {PORTD.6=1; PORTD.7=1;}  // флаг error_EEPROM
  else              {PORTD.6=0; PORTD.7=0;}; // сброс флаг error_EEPROM
  /////////////////////////////////////////////// TX: Interrupts:
  #asm("sei")    // вкл Global Interrupts
  //#asm("cli")  // выкл Global Interrupts
};
////////////////////////////////////////////////////////////////////////////////


Чтение я делают так:
-читаю в буфер.
-считаю CRC32 для буфера.
-если в процессе чтения произошла ошибка то устанавливается флаг "ошибка" и загорается светодиод "ошибка".

Спойлер
Код:
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////RX_EEPROM:
void RX_EEPROM(void)
{
  /////////////////////////////////////////////// TX: Interrupts:
  //#asm("sei")  // вкл Global Interrupts
  #asm("cli")    // выкл Global Interrupts
  /////////////////////////////////////////////// сброс флаг error_EEPROM
  error_EEPROM = 0;                                         
  /////////////////////////////////////////////// чтение EEPROM > буфер:
  for (xTX=0; xTX<16; xTX++) {                                 
    EEAR = xTX;             
    EECR |= 0b00000001;     
    TX_int[xTX] = EEDR;         
  };
  /////////////////////////////////////////////// crc буфер EEPROM:                       
  RX_len = 16;
  fcrcRX();
  /////////////////////////////////////////////// проверка crc:                     
  if (crcRX==0) {
    ////////////////////////////////////////////// TX_int > флаги
    blok_sys = TX_int[0];  // blok_sys //-начальное 0.
    Lampa    = TX_int[1];  // Lampa       
    //       = TX_int[2];  //   
    slider_5 = TX_int[3];  // Ползунок 5 Температура MAX
    slider_4 = TX_int[4];  // Ползунок 4 Температура MIN 
    hour_ON  = TX_int[5];  // часы ON       
    min_ON   = TX_int[6];  // минуты ON       
    hour_OFF = TX_int[7];  // часы OFF       
    min_OFF  = TX_int[8];  // минуты OFF     
   }
   /////////////////////////////////////////////// error_crc:
   else  {   
     error_EEPROM = 1;     // флаг error_EEPROM
   };
  /////////////////////////////////////////////// LCD                     
  if (error_EEPROM) {PORTD.6=1; PORTD.7=1;}  // флаг error_EEPROM
  else              {PORTD.6=0; PORTD.7=0;}; // сброс флаг error_EEPROM
  /////////////////////////////////////////////// TX: Interrupts:
  #asm("sei")    // вкл Global Interrupts
  //#asm("cli")  // выкл Global Interrupts
};
////////////////////////////////////////////////////////////////////////////////


Отключать прерывания не обязательно. При записи МК сам отключает прерывания.
Но я отключаю. Чтобы мне ничего не мешало))
:tea:

Ещё можно добавить шифрование.
Чтобы враг не догадался))
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт сен 25, 2025 09:39:09 
Сверлит текстолит когтями

Карма: 12
Рейтинг сообщений: 130
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1264
Рейтинг сообщения: 0
Роман, не пудрите человеку мозг. В CVAVR вся работа с ЕЕПРОМ уже встроена.
eeprom char hello = 1; //создаём переменную в ЕЕПРОМ, инициализируем 1-цей.
hello = 5; //записали новое значение, и т.п.
И ни о чём не думаем.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт сен 25, 2025 09:51:29 
Друг Кота

Карма: -2
Рейтинг сообщений: 53
Зарегистрирован: Вт мар 13, 2012 12:16:13
Сообщений: 8543
Откуда: .ru
Рейтинг сообщения: 0
а по какому адресу ?
а если надо записать в другой адрес ?
а если надо записать резервную копию ?
а.... ?

и т.д.
:tea:

сегодня надо записать две переменные...
завтра надо будет записать целый массив...
:roll:

мы что каждый раз будем переписывать всю программу ?
:facepalm:

а не проще один раз сделать согласно даташиту ?
:tea:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт сен 25, 2025 10:07:49 
Потрогал лапой паяльник
Аватар пользователя

Карма: 8
Рейтинг сообщений: 95
Зарегистрирован: Ср сен 02, 2015 07:47:20
Сообщений: 385
Рейтинг сообщения: 2
"А если острым? А если в глаз?" (С)
Извините, не удержался.

_________________
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 1 сентября 2025 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт сен 25, 2025 12:15:44 
Сверлит текстолит когтями

Карма: 12
Рейтинг сообщений: 130
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1264
Рейтинг сообщения: 0
а не проще один раз сделать согласно даташиту ?

Зачем делать, если есть готовое! Другое дело, что это нестандартно. Зато просто. Почему он и нравится начинающим.
Для массива есть eeprom_write_block/eeprom_read_block. И не нужно изобретать, а то может получиться "в глаз".


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт сен 25, 2025 12:32:30 
Друг Кота

Карма: -2
Рейтинг сообщений: 53
Зарегистрирован: Вт мар 13, 2012 12:16:13
Сообщений: 8543
Откуда: .ru
Рейтинг сообщения: 0
OKF писал(а):
не нужно изобретать

вот тут я согласен.
не нужно изобретать... если есть даташит... где производитель МК уже всё написал.

Изображение

Изображение

:tea:
А начинающим я бы порекомендовал читать даташиты и делать как в даташитах.
Так любой кто разбирается в МК быстро и просто прочитает ваш код.
:tea:
Если делать не так как в даташите то никто не будет часами сидеть разбираться в вашем коде... что вы там накарябали))
Надо всё делать по стандарту... от производителя.
:tea:


Вложения:
Screenshot_2.jpg [50.73 KiB]
Скачиваний: 181
Screenshot_1.jpg [57.09 KiB]
Скачиваний: 181
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт сен 25, 2025 14:08:07 
Нашел транзистор. Понюхал.

Зарегистрирован: Ср сен 04, 2019 17:59:23
Сообщений: 172
Откуда: Гомель
Рейтинг сообщения: 0
eeprom char hello = 1; //создаём переменную в ЕЕПРОМ, инициализируем 1-цей.
hello = 5; //записали новое значение, и т.п.
И ни о чём не думаем.
Но ведь я так и пишу. Но в железе работать не хочет, хотя компилируется без ошибок.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт сен 25, 2025 15:51:41 
Сверлит текстолит когтями

Карма: 12
Рейтинг сообщений: 130
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1264
Рейтинг сообщения: 0
Потому что каша в программе и, очевидно, в голове! c и d сразу сохраняешь нулевыми и что ты тогда хочешь получить!
Код форматируй и вставляй с тегом. Иначе ковыряйся сам.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт сен 25, 2025 16:27:18 
Нашел транзистор. Понюхал.

Зарегистрирован: Ср сен 04, 2019 17:59:23
Сообщений: 172
Откуда: Гомель
Рейтинг сообщения: 0
Какая разница, что первоначально, при включении питания у меня c и d нули. Мне нужно такое состояние на портах D0 и D1 из памяти и при необходимости его менять с записью в еепром. Предложи свой вариант, проверю в железе.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Чт сен 25, 2025 21:00:32 
Друг Кота

Карма: -2
Рейтинг сообщений: 53
Зарегистрирован: Вт мар 13, 2012 12:16:13
Сообщений: 8543
Откуда: .ru
Рейтинг сообщения: 0
странные люди... им предлагают готовое рабочее решение от самого производителя... а они продолжают изобретать велосипед))
всё это странно.
:tea:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пт сен 26, 2025 08:18:47 
Нашел транзистор. Понюхал.

Зарегистрирован: Ср сен 04, 2019 17:59:23
Сообщений: 172
Откуда: Гомель
Рейтинг сообщения: 0
странные люди... им предлагают готовое рабочее решение от самого производителя...
:tea:
ну так на предыщей странице набросок программы, помоги, подкорретируй её, у меня не получается, программа бросает ошибку при компиляции.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пт сен 26, 2025 09:43:58 
Мучитель микросхем

Карма: 4
Рейтинг сообщений: 37
Зарегистрирован: Вт фев 09, 2010 17:52:26
Сообщений: 467
Рейтинг сообщения: 0
Alex_ka писал(а):
При формировании файла прошивок, флешь нормальная, а еепром какой то кастрированный получается

Так у вас только два байта в еепром.
Alex_ka писал(а):
и программатор подвисает при записи еепром. и это на разных версиях 2.05,3.12, 3.14.

А это уже проблемма, попробуйте стереть еепром.
Проверьте ее записав в нее все 0xFF потом все 0х00, потом считайте и проверьте содержимое.
Обычно бывает опция стирать еепром при записи.

Alex_ka писал(а):
c_eep=c;
d_eep=d;

Вам уже написали, что вы в начале программы перезаписываете значение, это безсмысленно.
Логичней считать в переменную значение из еепром с=с_eep;


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пт сен 26, 2025 09:45:30 
Друг Кота

Карма: -2
Рейтинг сообщений: 53
Зарегистрирован: Вт мар 13, 2012 12:16:13
Сообщений: 8543
Откуда: .ru
Рейтинг сообщения: 0
и что там корректировать...
:roll:

берём код...

Код:
#include <tiny2313.h>
#include <delay.h>


int p;
int c=0;
int d=0;
eeprom char c_eep;
eeprom char d_eep;


interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1H=0;
TCNT1L=0;
p++;
if(p>59) {p=0;}
}


void main(void)
{


c_eep=c;
d_eep=d;
#asm("sei")


m1:
PORTD.0=0;
PORTD.1=0;
delay_ms(1000);
while (1) {
if(PIND.5==0){delay_ms(1000);break; };
if(PIND.3==0){delay_ms(300);break; };
}
p=0;
delay_ms(100);
c=c_eep;
delay_ms(100);
d=d_eep;
delay_ms(100);
PORTD.0=c;
PORTD.1=d;
while(1) {
if(PINB.0 && !PINB.1 && !PINB.2 && !PINB.3) {c=0; d=0;c_eep=c; d_eep=d;delay_ms(2000);break;}
if(!PINB.0 && PINB.1 && !PINB.2 && !PINB.3){c=0; d=1;c_eep=c; d_eep=d;delay_ms(2000);break;}
if(PINB.0 && PINB.1 && !PINB.2 && !PINB.3) {c=1; d=0;c_eep=c; d_eep=d;delay_ms(2000);break;}
if(!PINB.0 && !PINB.1 && PINB.2 && !PINB.3) {c=1; d=1;c_eep=c; d_eep=d;delay_ms(2000);break;}
if(p==30){delay_ms(300);break;};
}
delay_ms(1000);
goto m1;


}

и начинаем корректировать...))
:tea:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пт сен 26, 2025 09:59:43 
Мучитель микросхем

Карма: 4
Рейтинг сообщений: 37
Зарегистрирован: Вт фев 09, 2010 17:52:26
Сообщений: 467
Рейтинг сообщения: 0
roman.com писал(а):

int c=0;
int d=0;
----------
c_eep=c;
d_eep=d;
#asm("sei")

m1:
PORTD.0=0;
PORTD.1=0;
delay_ms(1000);
while (1) {
if(PIND.5==0){delay_ms(1000);break; };
if(PIND.3==0){delay_ms(300);break; };
}
p=0;
delay_ms(100);
c=c_eep;
delay_ms(100);
d=d_eep;


Туда же? Чему будут равны с и d ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пт сен 26, 2025 10:36:39 
Нашел транзистор. Понюхал.

Зарегистрирован: Ср сен 04, 2019 17:59:23
Сообщений: 172
Откуда: Гомель
Рейтинг сообщения: 0
Да первонально нулям. А потом надо, чтобы от состояния на портах "В", это значения менялось в еепром, в зависимости от портов "В" и потом считывалось из памяти новое значение. Мне нужно первоначально при включении нули.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пт сен 26, 2025 10:59:38 
Друг Кота

Карма: -2
Рейтинг сообщений: 53
Зарегистрирован: Вт мар 13, 2012 12:16:13
Сообщений: 8543
Откуда: .ru
Рейтинг сообщения: 0
По порядку...

При каждом новом запуске программы в епром будут нули.
Ну надо так надо. Нам какое дело))

Далее...
Компилятор пишет ошибка...
eeprom char c_epp;
не инециализирован...
Значит ничего работать не будет))
:tea:

Зничит надо инициализировать..
eeprom char c_epp = 0;
Вот так уже лучше))
:tea:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пт сен 26, 2025 11:31:18 
Мучитель микросхем

Карма: 4
Рейтинг сообщений: 37
Зарегистрирован: Вт фев 09, 2010 17:52:26
Сообщений: 467
Рейтинг сообщения: 0
Да первонально нулям. А потом надо, чтобы от состояния на портах "В", это значения менялось в еепром, в зависимости от портов "В" и потом считывалось из памяти новое значение. Мне нужно первоначально при включении нули.

Записывать ноль в еепром, при старте программы, самое глупое решение.
Если в любом случаее затираете значение в еепром, то он вам вообще не нужен, просто храните значение в переменной.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пт сен 26, 2025 12:06:47 
Друг Кота

Карма: -2
Рейтинг сообщений: 53
Зарегистрирован: Вт мар 13, 2012 12:16:13
Сообщений: 8543
Откуда: .ru
Рейтинг сообщения: 0
Это кусочек БОЛЬШОЙ программы.
А сама программа делает очень странные вещи)) Так сразу не поймешь.
:tea:
Но вопрос был не в этом. А в том что епром не работает.
Оно и понятно. Потому что не по даташиту.
:tea:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пт сен 26, 2025 12:18:43 
Открыл глаза

Зарегистрирован: Сб июн 18, 2011 02:15:28
Сообщений: 49
Рейтинг сообщения: 0
Ничего, что таймер не инициализирован и прерывание никогда не срабатывает?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
СообщениеДобавлено: Пт сен 26, 2025 12:30:49 
Друг Кота

Карма: -2
Рейтинг сообщений: 53
Зарегистрирован: Вт мар 13, 2012 12:16:13
Сообщений: 8543
Откуда: .ru
Рейтинг сообщения: 0
это ничего))
:tea:

далее... делаем епром по даташиту.

у нас всего две переменные... поэтому проще сделать две отдельные функции из даташита...

Код:
#include <tiny2313.h>
#include <delay.h>


int p;
int c=0;
int d=0;

//eeprom char c_eep;
void TX_c_eep(void)
{
     EEAR = 0;                     
     EEDR = c;             
     EECR |= 0b00000100;           
     EECR |= 0b00000010;           
     while(EECR & 0b00000010);     
};
void RX_c_eep(void)
{
    EEAR = 0;             
    EECR |= 0b00000001;     
    c = EEDR;         
};


//eeprom char d_eep;
void TX_d_eep(void)
{
     EEAR = 1;                     
     EEDR = d;             
     EECR |= 0b00000100;           
     EECR |= 0b00000010;           
     while(EECR & 0b00000010);     
};
void RX_d_eep(void)
{
    EEAR = 1;             
    EECR |= 0b00000001;     
    d = EEDR;         
};


interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1H=0;
TCNT1L=0;
p++;
if(p>59) {p=0;};
}


void main(void)
{


TX_c_eep(); //c_eep=c;
TX_d_eep(); //d_eep=d;
#asm("sei")


m1:
PORTD.0=0;
PORTD.1=0;
delay_ms(1000);
while (1) {
if(PIND.5==0){delay_ms(1000);break; };
if(PIND.3==0){delay_ms(300);break; };
};
p=0;
delay_ms(100);
RX_c_eep(); //c=c_eep;
delay_ms(100);
RX_d_eep(); //d=d_eep;
delay_ms(100);
PORTD.0=c;
PORTD.1=d;
while(1) {
if(PINB.0 && !PINB.1 && !PINB.2 && !PINB.3) {c=0; d=0; TX_c_eep(); TX_d_eep(); delay_ms(2000);break;}; //c_eep=c; d_eep=d;
if(!PINB.0 && PINB.1 && !PINB.2 && !PINB.3) {c=0; d=1; TX_c_eep(); TX_d_eep(); delay_ms(2000);break;}; //c_eep=c; d_eep=d;
if(PINB.0 && PINB.1 && !PINB.2 && !PINB.3) {c=1; d=0; TX_c_eep(); TX_d_eep(); delay_ms(2000);break;}; //c_eep=c; d_eep=d;
if(!PINB.0 && !PINB.1 && PINB.2 && !PINB.3) {c=1; d=1; TX_c_eep(); TX_d_eep(); delay_ms(2000);break;}; //c_eep=c; d_eep=d;
if(p==30){delay_ms(300);break;};
};
delay_ms(1000);
goto m1;


}

Ну вот. Уже лучше))
:tea:


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

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


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

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


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

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


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