Обсуждаем контроллеры компании Atmel.
Ответить

Re: Программирование ATtiny13

Вт июн 01, 2021 21:57:17

Нашел тока как через *.cof работать. Но про отладку под Протеус тогда можно забыть.

Re: Программирование ATtiny13

Пт июн 04, 2021 12:12:55

Изображение Изображение

пробую в протеусе отладить код c eeprom (CodeVisiionAVR - разобрался с отладкой!)

Код:
#include <tiny13a.h>
#include <bcd.h>
#include <delay.h>
//#include <sleep.h>

#define CE   PORTB.2   //   
#define CL   PORTB.1   //   
#define DA   PORTB.0   //     

byte
  set0, set, sw_key ;// номер запомненной позиции настройки
unreal     
   f_tun;

[b] unreal eeprom  set_frq[4]={145450, 145575, 145500, 157100};[/b]
//unreal set_frq[4]={145450, 145575, 145500, 157100};
// byte eeprom    chan0=0; 
  byte    chan0=0; 
 


файлик *.eep компилятором создается, его объм 73 байта
но для Протеуса нужен файлик *.bin и с помощью утилиты hex2bin я его получаю

но при отладке в протеусе в окне EEPRom переменных изменен ли один несчастный байт.
Может кто подскаже что я делаю не так.

Re: Программирование ATtiny13

Пт июн 04, 2021 12:31:17

нигогда и низачем не создавал еепэ
все в прошивке

Добавлено after 4 minutes 1 second:
эстэмщики, кстати, этот рудимент удалили

Re: Программирование ATtiny13

Пт июн 04, 2021 12:32:06

не забывайте, что EEPROM записывается 4 мс - вы по часам протеуса ждете не меньше этого, прежде чем посмотреть дамп памяти?

Re: Программирование ATtiny13

Пт июн 04, 2021 12:39:08

зачем записывать туда где нет

Re: Программирование ATtiny13

Пт июн 04, 2021 12:53:13

http://kazus.ru/forums/showthread.php?t=14223

Нашел ответ, пока не разбирался но уже сработало

Debug - Reset Persistent Model Data

Добавлено after 3 minutes 36 seconds:
Изображение

Re: Программирование ATtiny13

Пт июн 04, 2021 13:06:09

поверьте наслово, не дебаджил ни разу

Добавлено after 4 minutes 56 seconds:
дебаг для трусов

Re: Программирование ATtiny13

Пт июн 04, 2021 13:09:02

не забывайте, что EEPROM записывается 4 мс - вы по часам протеуса ждете не меньше этого, прежде чем посмотреть дамп памяти?



typedef unsigned char byte ;
typedef unsigned int real ;
typedef unsigned long unreal ;

#include <tiny13a.h>
#include <bcd.h>
#include <delay.h>
//#include <sleep.h>

#include <eeprom.h>


#define CE PORTB.2 //
#define CL PORTB.1 //
#define DA PORTB.0 //

byte
set0, set, sw_key ;// номер запомненной позиции настройки
unreal
f_tun, frq;

unreal eeprom set_frq[4]={145450, 145575, 145500, 157100};

//unreal set_frq[4]={145450, 145575, 145500, 157100};
// byte eeprom chan0=0;
byte chan0=0;

я объявляю и инициализирую ЕЕпром в секции объявления переменных.

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

Re: Программирование ATtiny13

Пт июн 04, 2021 13:13:06

ты же сам понимаешь что что-то не так

Re: Программирование ATtiny13

Пт июн 04, 2021 13:53:09

slav0n, невероятно, но факт

Re: Программирование ATtiny13

Пт июн 04, 2021 14:13:04

olegue писал(а):Проблема сейчас в том что в отладке массив пустой
вы имеете ввиду окно просмотра переменных при отладке? так этот массив там и будет пустым, потому как протеус не умеет понимать массивы в FLASH или EEPROM. среди отладочной информации, как я понимаю, нет признака того, что массив не в ОЗУ, вот протеус и не находит его

Re: Программирование ATtiny13

Пт июн 04, 2021 17:22:19

Решил и эту проблему. Как меня кажется - банальная невнимательность!

Добавлено after 24 minutes 56 seconds:
Изображение

ARV,

все верно Вы писали, в отладке нет переменных и массива с ЕЕпром данными, ни просто переменной канала с номером хранящимся в ЕЕпром.

Кстати что бы не было вот этого сообщения
chan R-252 Item (1 bytes at 0xFFFFFF04) not within memory block (0x000000A0 bytes).

напротив переменной в отладке, нужно временно объявить ее Volatile. ( об этом здесь https://electronix.ru/forum/index.php?a ... &id=131765)

кстати, как я понял о работе с ЕЕпром то сначала объявляем переменные и инициализируем их
unreal eeprom set_frq[4]={145450, 145575, 145500, 157100};

после чего можно зделать built all, создав *ееp файл

после чего в коде можно оставить лишь объявление переменной ЕЕпром
unreal eeprom set_frq[4]


правильно я понимаю?

Re: Программирование ATtiny13

Пт июн 04, 2021 17:32:17

Можно так. Можно просто в коде при старте прочитать ячейки, и если они вдруг равны 0xffff.... то значит инициализируем их этими значениями.

Re: Программирование ATtiny13

Пт июн 04, 2021 18:05:00

а ячейки все читать? Это я к тому что память ведь распределяется в соответсвии с объявленными типами и по попрядку. Так ведь?

Добавлено after 9 minutes 10 seconds:
Изображение

хотел еще воткнуть сюда 7seg индикатор через hc595, и освободить еще одну ножку (RESET DISABLE) что бы были кнопки ВПЕРЕД-НАЗАД. но памяти не хватает

Добавлено after 16 minutes 14 seconds:
А это код для считалки на семисегметной индикаторе
там есть спорные моменты, но в 300 байт врядли можно вложиться

Спойлер
Код:
/*******************************************************
Chip type               : ATtiny13
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 16
*******************************************************/

#include <tiny13.h>
 #include <delay.h>
 
 #define CE PORTB.2
 #define CL PORTB.1
 #define DI PORTB.0
 #define RS PORTB.3
 #define pause delay_ms(10)
 
//макрос инвертировани бита (там делльше это понадобится в побидной отправке в регистр сдвига, така отправка идет не с того боку.
#define INVERT_BYTE(a)   ((a&1)<<7) | ((a&2)<<5) | ((a&4)<<3) | ((a&8)<<1) | ((a&16)>>1) | ((a&32)>>3) | ((a&64)>>5) | ((a&128)>>7)

 //char data[8]=  {0,1,1,0,1,1,0,1};
      //  char c=0b01101101;
   

 char i,j ;
// Declare your global variables here


void showData(char c)
{
char a;
a=INVERT_BYTE (c); // нужно инвертировать байт
 i=0;
 CE=0;   //Отопрем защелку  , (если заперта -повторный запуск)
 while(i<8)
 {
 //DI=dt[i];
 DI=(a >> i) & 1  ;      // инвертированный байт посылаем в регистр сдвига побитно
 CL = 1;
 RS=1;
 pause;
 DI=0;
 CL = 0;
 RS=0;
 pause;
 i++;
 };
 
 CE=1;
 }



void main(void)
{
 PORTB=0x00;
 DDRB=0xFF;
   //showData(0b01101101) ;
 j=0;
while (1)
 
      {
     
   
 
     
      switch (j) {
    case 0:showData(0b00111111);  break;
    case 1:showData(0b00000110);     break;
     case 2:showData(0b01011011);   break;
    case 3:showData(0b01001111);    break;
     case 4:showData(0b01100110);    break;
    case 5:showData(0b01101101);     break;
    case 6:showData(0b01111101);      break;
    case 7:showData(0b00000111);      break;
     
    default:
    };
 

    j++;
   
    if (j>7) {j=0;};
}
}

Re: Программирование ATtiny13

Сб фев 19, 2022 21:59:34

тут такая тема. Пока не нажата кнопка идет перебор частот, а как тока нажата остановка пока не отпустят
написал вот такое , но мне оно совершенно не нравиться. Что я упускаю?

Код:
while (1)
{
 
  if(PINB.4 == 1)
   {    // если не нажата кнопка (нет несущей) перебираем каналы
          chan++; set=chan;             //переключим канал
          if (chan>3)   {chan=0;set=0;}  // каналы от 0 до 3 (4канала)
          f_tun = set_frq [chan];
          write_lm7001  ();
         
   }
         else  {//а тут слушаем эфир. Так что ли? }
 
   
     
 
}


Добавлено after 1 minute 18 seconds:
нажатие кнопки будет транзисторным ключом. т.е как бы дребезг обрабатывать не нужно (?)

Re: Программирование ATtiny13

Сб фев 19, 2022 22:33:49

else ... лишнее. И без того цикл вращается.
При нажатии кнопки над определенного времени рискуете изменить больше каналов, чем один.
Нужна либо задержка, либо подтверждение того, что напр. зар. частоты в LM7001 завершена.

С кнопки лучше управлять флаг, напр. есть_изменение.
А затем проверьте изменение в другом проверке и делаете действие.
На всякий случай я бы добавил код и для button debounce (может быть самый простой, с двойным чтением с паузой).
Tакже для стабильности я бы перевернул логику кнопок с "активным нулем", к GND.

Код:
while (1) {
  if (!PINB.4) {
    delay_ms(20);
    if (!PINB.4)
      b = TRUE;
  }

  if (b) {
    b = FALSE;
    chan++;
    set = chan;         // переключим канал
    if (chan > 3)  {
      chan = 0;         // каналы от 0 до 3 (4 канала)
      set = 0;
    }
    f_tun = set_frq[chan];
    write_lm7001();
  }
}

Re: Программирование ATtiny13

Сб фев 19, 2022 23:10:59

veso74, по Вашему коду получается, что если не нажата, то перебираем частоты с замедлением в 20мс, а если нажата то просто все останавливается и слушаем частоту.

Правильно я понял?

Re: Программирование ATtiny13

Вс фев 20, 2022 00:12:13

Нет, наоборот: если нажата: перебираем частоты, а если ненажата: слушаем частоту.
Kнопкa: к GND, нужен подтягивающий резистор к +, внутренний или внешний. 20 ms - время для button debounce.
Вложения
switch_bounce.jpg
(62.74 KiB) Скачиваний: 69

Re: Программирование ATtiny13

Вс фев 20, 2022 09:56:15

veso74, или я немного запутался или Вы меня неправильно поняли.

"кнопка" - это сигнала ШП, который управляем транзистором, который соответствующий пин МК садит на массу

Изображение

ну вот наподобии как здесь сделан mute для lm386

Добавлено after 2 minutes 59 seconds:
Сигнал ШП появился - Транзистор притянул 4 пин МК к массе - остановился цикл - слушаем канал

Re: Программирование ATtiny13

Вс фев 20, 2022 10:25:46

Реакция кода видно и может быть проверен с помощью светодиодов даже без участия радио. Это не меняет способ управления (код с флагами и с denounce). Измените уровни срабатывания логики, как необходимо на Вашем схемме (коррекция строку программы или добавление другую, если это необходимо).
Ответить