CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: CodeVision AVR в вопросах и ответах

Сообщение roman.com »

-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)
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: CodeVision AVR в вопросах и ответах

Сообщение OKF »

Роман, не пудрите человеку мозг. В CVAVR вся работа с ЕЕПРОМ уже встроена.
eeprom char hello = 1; //создаём переменную в ЕЕПРОМ, инициализируем 1-цей.
hello = 5; //записали новое значение, и т.п.
И ни о чём не думаем.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: CodeVision AVR в вопросах и ответах

Сообщение roman.com »

а по какому адресу ?
а если надо записать в другой адрес ?
а если надо записать резервную копию ?
а.... ?

и т.д.
:tea:

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

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

а не проще один раз сделать согласно даташиту ?
:tea:
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: CodeVision AVR в вопросах и ответах

Сообщение HardWareMan »

"А если острым? А если в глаз?" (С)
Извините, не удержался.
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: CodeVision AVR в вопросах и ответах

Сообщение OKF »

[uquote="roman.com",url="/forum/viewtopic.php?p=4748353#p4748353"]а не проще один раз сделать согласно даташиту ?[/uquote]
Зачем делать, если есть готовое! Другое дело, что это нестандартно. Зато просто. Почему он и нравится начинающим.
Для массива есть eeprom_write_block/eeprom_read_block. И не нужно изобретать, а то может получиться "в глаз".
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: CodeVision AVR в вопросах и ответах

Сообщение roman.com »

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

Изображение

Изображение

:tea:
А начинающим я бы порекомендовал читать даташиты и делать как в даташитах.
Так любой кто разбирается в МК быстро и просто прочитает ваш код.
:tea:
Если делать не так как в даташите то никто не будет часами сидеть разбираться в вашем коде... что вы там накарябали))
Надо всё делать по стандарту... от производителя.
:tea:
Вложения
Screenshot_2.jpg
(50.73 КБ) 297 скачиваний
Screenshot_1.jpg
(57.09 КБ) 670 скачиваний
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

Re: CodeVision AVR в вопросах и ответах

Сообщение Alex_ka »

[uquote="OKF",url="/forum/viewtopic.php?p=4748349#p4748349"]eeprom char hello = 1; //создаём переменную в ЕЕПРОМ, инициализируем 1-цей.
hello = 5; //записали новое значение, и т.п.
И ни о чём не думаем.[/uquote]Но ведь я так и пишу. Но в железе работать не хочет, хотя компилируется без ошибок.
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: CodeVision AVR в вопросах и ответах

Сообщение OKF »

Потому что каша в программе и, очевидно, в голове! c и d сразу сохраняешь нулевыми и что ты тогда хочешь получить!
Код форматируй и вставляй с тегом. Иначе ковыряйся сам.
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

Re: CodeVision AVR в вопросах и ответах

Сообщение Alex_ka »

Какая разница, что первоначально, при включении питания у меня c и d нули. Мне нужно такое состояние на портах D0 и D1 из памяти и при необходимости его менять с записью в еепром. Предложи свой вариант, проверю в железе.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: CodeVision AVR в вопросах и ответах

Сообщение roman.com »

странные люди... им предлагают готовое рабочее решение от самого производителя... а они продолжают изобретать велосипед))
всё это странно.
:tea:
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

Re: CodeVision AVR в вопросах и ответах

Сообщение Alex_ka »

[uquote="roman.com",url="/forum/viewtopic.php?p=4748516#p4748516"]странные люди... им предлагают готовое рабочее решение от самого производителя...
:tea:[/uquote]ну так на предыщей странице набросок программы, помоги, подкорретируй её, у меня не получается, программа бросает ошибку при компиляции.
codenamehawk
Вымогатель припоя
Сообщения: 527
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: CodeVision AVR в вопросах и ответах

Сообщение codenamehawk »

Alex_ka писал(а):При формировании файла прошивок, флешь нормальная, а еепром какой то кастрированный получается
Так у вас только два байта в еепром.
Alex_ka писал(а): и программатор подвисает при записи еепром. и это на разных версиях 2.05,3.12, 3.14.
А это уже проблемма, попробуйте стереть еепром.
Проверьте ее записав в нее все 0xFF потом все 0х00, потом считайте и проверьте содержимое.
Обычно бывает опция стирать еепром при записи.
Alex_ka писал(а):c_eep=c;
d_eep=d;
Вам уже написали, что вы в начале программы перезаписываете значение, это безсмысленно.
Логичней считать в переменную значение из еепром с=с_eep;
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: CodeVision AVR в вопросах и ответах

Сообщение roman.com »

и что там корректировать...
: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:
codenamehawk
Вымогатель припоя
Сообщения: 527
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: CodeVision AVR в вопросах и ответах

Сообщение codenamehawk »

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 ?
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

Re: CodeVision AVR в вопросах и ответах

Сообщение Alex_ka »

Да первонально нулям. А потом надо, чтобы от состояния на портах "В", это значения менялось в еепром, в зависимости от портов "В" и потом считывалось из памяти новое значение. Мне нужно первоначально при включении нули.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: CodeVision AVR в вопросах и ответах

Сообщение roman.com »

По порядку...

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

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

Зничит надо инициализировать..
eeprom char c_epp = 0;
Вот так уже лучше))
:tea:
codenamehawk
Вымогатель припоя
Сообщения: 527
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: CodeVision AVR в вопросах и ответах

Сообщение codenamehawk »

[uquote="Alex_ka",url="/forum/viewtopic.php?p=4748603#p4748603"]Да первонально нулям. А потом надо, чтобы от состояния на портах "В", это значения менялось в еепром, в зависимости от портов "В" и потом считывалось из памяти новое значение. Мне нужно первоначально при включении нули.[/uquote]
Записывать ноль в еепром, при старте программы, самое глупое решение.
Если в любом случаее затираете значение в еепром, то он вам вообще не нужен, просто храните значение в переменной.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: CodeVision AVR в вопросах и ответах

Сообщение roman.com »

Это кусочек БОЛЬШОЙ программы.
А сама программа делает очень странные вещи)) Так сразу не поймешь.
:tea:
Но вопрос был не в этом. А в том что епром не работает.
Оно и понятно. Потому что не по даташиту.
:tea:
Ljubitel
Открыл глаза
Сообщения: 47
Зарегистрирован: Сб июн 18, 2011 02:15:28

Re: CodeVision AVR в вопросах и ответах

Сообщение Ljubitel »

Ничего, что таймер не инициализирован и прерывание никогда не срабатывает?
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: CodeVision AVR в вопросах и ответах

Сообщение roman.com »

это ничего))
: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:
Ответить

Вернуться в «AVR»