Программирование ATtiny13
Нашел тока как через *.cof работать. Но про отладку под Протеус тогда можно забыть.
- Реклама
пробую в протеусе отладить код 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;
но для Протеуса нужен файлик *.bin и с помощью утилиты hex2bin я его получаю
но при отладке в протеусе в окне EEPRom переменных изменен ли один несчастный байт.
Может кто подскаже что я делаю не так.
нигогда и низачем не создавал еепэ
все в прошивке
Добавлено after 4 minutes 1 second:
эстэмщики, кстати, этот рудимент удалили
все в прошивке
Добавлено after 4 minutes 1 second:
эстэмщики, кстати, этот рудимент удалили
ohmycode!
primuss3.com
primuss3.com
не забывайте, что EEPROM записывается 4 мс - вы по часам протеуса ждете не меньше этого, прежде чем посмотреть дамп памяти?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
зачем записывать туда где нет
ohmycode!
primuss3.com
primuss3.com
- Реклама
http://kazus.ru/forums/showthread.php?t=14223
Нашел ответ, пока не разбирался но уже сработало
Debug - Reset Persistent Model Data
Добавлено after 3 minutes 36 seconds:

Нашел ответ, пока не разбирался но уже сработало
Debug - Reset Persistent Model Data
Добавлено after 3 minutes 36 seconds:
поверьте наслово, не дебаджил ни разу
Добавлено after 4 minutes 56 seconds:
дебаг для трусов
Добавлено after 4 minutes 56 seconds:
дебаг для трусов
ohmycode!
primuss3.com
primuss3.com
[uquote="ARV",url="/forum/viewtopic.php?p=4042417#p4042417"]не забывайте, что EEPROM записывается 4 мс - вы по часам протеуса ждете не меньше этого, прежде чем посмотреть дамп памяти?[/uquote]
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;
я объявляю и инициализирую ЕЕпром в секции объявления переменных.
Может здесь что-то не так.
Проблема сейчас в том что в отладке массив пустой, хотя в ЕЕпром памяти переменные уже в порядке
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;
я объявляю и инициализирую ЕЕпром в секции объявления переменных.
Может здесь что-то не так.
Проблема сейчас в том что в отладке массив пустой, хотя в ЕЕпром памяти переменные уже в порядке
ты же сам понимаешь что что-то не так
ohmycode!
primuss3.com
primuss3.com
вы имеете ввиду окно просмотра переменных при отладке? так этот массив там и будет пустым, потому как протеус не умеет понимать массивы в FLASH или EEPROM. среди отладочной информации, как я понимаю, нет признака того, что массив не в ОЗУ, вот протеус и не находит егоolegue писал(а):Проблема сейчас в том что в отладке массив пустой
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Решил и эту проблему. Как меня кажется - банальная невнимательность!
Добавлено 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]
правильно я понимаю?
Добавлено 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]
правильно я понимаю?
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Можно так. Можно просто в коде при старте прочитать ячейки, и если они вдруг равны 0xffff.... то значит инициализируем их этими значениями.
а ячейки все читать? Это я к тому что память ведь распределяется в соответсвии с объявленными типами и по попрядку. Так ведь?
Добавлено after 9 minutes 10 seconds:

хотел еще воткнуть сюда 7seg индикатор через hc595, и освободить еще одну ножку (RESET DISABLE) что бы были кнопки ВПЕРЕД-НАЗАД. но памяти не хватает
Добавлено after 16 minutes 14 seconds:
А это код для считалки на семисегметной индикаторе
там есть спорные моменты, но в 300 байт врядли можно вложиться
Добавлено 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;};
}
}тут такая тема. Пока не нажата кнопка идет перебор частот, а как тока нажата остановка пока не отпустят
написал вот такое , но мне оно совершенно не нравиться. Что я упускаю?
Добавлено after 1 minute 18 seconds:
нажатие кнопки будет транзисторным ключом. т.е как бы дребезг обрабатывать не нужно (?)
написал вот такое , но мне оно совершенно не нравиться. Что я упускаю?
Код: Выделить всё
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 {//а тут слушаем эфир. Так что ли? }
}
нажатие кнопки будет транзисторным ключом. т.е как бы дребезг обрабатывать не нужно (?)
else ... лишнее. И без того цикл вращается.
При нажатии кнопки над определенного времени рискуете изменить больше каналов, чем один.
Нужна либо задержка, либо подтверждение того, что напр. зар. частоты в LM7001 завершена.
С кнопки лучше управлять флаг, напр. есть_изменение.
А затем проверьте изменение в другом проверке и делаете действие.
На всякий случай я бы добавил код и для button debounce (может быть самый простой, с двойным чтением с паузой).
Tакже для стабильности я бы перевернул логику кнопок с "активным нулем", к GND.
При нажатии кнопки над определенного времени рискуете изменить больше каналов, чем один.
Нужна либо задержка, либо подтверждение того, что напр. зар. частоты в 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();
}
}veso74, по Вашему коду получается, что если не нажата, то перебираем частоты с замедлением в 20мс, а если нажата то просто все останавливается и слушаем частоту.
Правильно я понял?
Правильно я понял?
Нет, наоборот: если нажата: перебираем частоты, а если ненажата: слушаем частоту.
Kнопкa: к GND, нужен подтягивающий резистор к +, внутренний или внешний. 20 ms - время для button debounce.
Kнопкa: к GND, нужен подтягивающий резистор к +, внутренний или внешний. 20 ms - время для button debounce.
- Вложения
-
- switch_bounce.jpg
- (62.74 КБ) 104 скачивания
veso74, или я немного запутался или Вы меня неправильно поняли.
"кнопка" - это сигнала ШП, который управляем транзистором, который соответствующий пин МК садит на массу

ну вот наподобии как здесь сделан mute для lm386
Добавлено after 2 minutes 59 seconds:
Сигнал ШП появился - Транзистор притянул 4 пин МК к массе - остановился цикл - слушаем канал
"кнопка" - это сигнала ШП, который управляем транзистором, который соответствующий пин МК садит на массу
ну вот наподобии как здесь сделан mute для lm386
Добавлено after 2 minutes 59 seconds:
Сигнал ШП появился - Транзистор притянул 4 пин МК к массе - остановился цикл - слушаем канал
Реакция кода видно и может быть проверен с помощью светодиодов даже без участия радио. Это не меняет способ управления (код с флагами и с denounce). Измените уровни срабатывания логики, как необходимо на Вашем схемме (коррекция строку программы или добавление другую, если это необходимо).


