Курс: программирование AVR, учимся "с нуля"

 
1 2 3 4 5 6 7 12
например, сейчас ~400 строк текста. и в каждом случае применения маски или имени регистра надо лезть по всему тексту и все менять. некузяво. с именами регистров все хорошо получается--#define ignit_11 PINB — , а с этими масками что делать?
 


А в чем проблема?
Дефайном даешь значение символьной константе, потом в программе пользуешь.
 
?? Tosha_443 #09.06.2004 15:39
+
-
edit
 

Tosha_443

втянувшийся
next, 09.06.2004 14:39:28 :
А в чем проблема?
Дефайном даешь значение символьной константе, потом в программе пользуешь.
 


если #define .. ... писать, то он ее как константу и пользует и хранит ее при этом в ОЗУ(может я и ошибаюсь). рассмотрелся получше - он их подставляет каждый раз при использовании. в ОЗУ не хранит. прошу прощения, недоглядел.
Не ошибается тот, кто ничего не делает  
?? Tosha_443 #09.06.2004 16:54
+
-
edit
 

Tosha_443

втянувшийся
Отказался от структур - код уменьшился (был 815 слов - стал 698)... вот уж где "век живи - век учись"!(не надо писать роман в трех томах "что бы я сделал за один недостающий байт кодового сегмента")
подскажите, если в EEPROM живет байт. его я считываю в переменную, живущую в регистре и имеется 8 битовых переменных. как разложить этот байт по битам?
так было, и проблем с битами не было:

eeprom struct status_ctruct_eeprom
{
unsigned char normal:1;
unsigned char engine:1;
unsigned char light:1;
unsigned char siren:1;
unsigned char prepare_defend:1;
unsigned char defend:1;
unsigned char setup:1;
unsigned char prepare_setup:1;
} ee_status={0,0,0,0,0,0,0,0};
struct status_ctruct
{
unsigned char normal:1;
unsigned char engine:1;
unsigned char light:1;
unsigned char siren:1;
unsigned char prepare_defend:1;
unsigned char defend:1;
unsigned char setup:1;
unsigned char prepare_setup:1;
}status;
... ee_status=status и status=ee_status

работали.
а вот так стало:

bit status_normal;
bit status_engine;
bit status_light;
bit status_siren;
bit status_prepare_defend;
bit status_defend;
bit status_setup;
bit status_prepare_setup;

unsigned char status;

и как этот статус разложить по статусикам и потом, по мере надобности собрать?

status_setup=status[0]; не работает, а вроде должно.
лезть в map - файл и смотреть, что биты все в регистре R2 и писать
#asm("mov R2,_status");
как-то не очень хочется. может есть другой путь?
Не ошибается тот, кто ничего не делает  
Это сообщение редактировалось 09.06.2004 в 17:04
+
-
edit
 

karlos

втянувшийся
termostat, 08.06.2004 08:22:53 :
Деление памяти на страницы физически НЕ СУЩЕСТВУЕТ. Просто встроенный автомат записи предлагает пользователю возможность записать 64 байта почти за то время сколько занимает запись одного байта. Для этого нужно указать абсолютный адрес ячейки в которую нужно записать 1й байт и затем передать в память 64 байта, они будут записаны друг за другом.
 


Ну по крайней мере у 24С64 существуют страницы размером 32 байта. В описании говорится, что если запись 32 байтов начать с адреса не на границе страниц, то последние n байты запишутся уже в начале текущей страницы, а не следующей. Т.е. смены страниц не происходит.
 

AlexG

новичок
Неного поэкспериментировал в eZ80.
Компилятор ZDS II заработал после удаления WinAVR.
Примеры работы с ethernet'ом не заработали, буду еще разбираться.
Пока что получилось помигать светодиодом и отправить в компорт "Hello World!"
Внутрисхемный отладчик это круто! Хочу такой для AVR, попробую убедить начальника, что им это надо, хотя-бы самопальный собрать.
 
?? Tosha_443 #11.06.2004 10:29
+
-
edit
 

Tosha_443

втянувшийся
Столкнулся с проблемой var1=!var1 не работает.
т.е. если var1 - char or int все в порядке, инвертирует, а если bit - то все, не инверсия получается, а флаги взводит и не меняет var1. в codevision manual смотрел специально - есть пример с битами и именно такой! (beta=!beta)
может кто подскажет? не писать же везде, где надо инверсию сделать

SBRC Rn,m ; пропустиь, если сброшен (if (бит=0) бит=1)
SBI Rn,m ;установить бит в 1
SBRS Rn,m ;пропуск, если установлен (if (бит=1)бит=0)
CBI Rn,m ;сбросить бит

ведь хотелось модуль написать и юзать его где понадобится.


По поводу Flash-памяти - (могу и ошибаться, поправьте где неправ) у нее не существует механизма записи одного байта, если это не оговорено в даташите, а деление на страницы присутствует. т.е считать по одному байту - пожалуйста, а вот записать - только страницами. и проверять нередко надо пустая ли страница а то механизм записи у нее - только с 1 в 0. и стирает блоками(2-4 раза большими, чем страница).
а запись страничная наверное потому, что сигнал этой записи на ячейки всей страницы параллельно заведены.

Не ошибается тот, кто ничего не делает  

Yuran

опытный

Пишется страницами, но еффективный способ записать один байт есть.
Читаешь нужную страницу в буфер, пишешь в буфер один байт свой и пишешь страницу обратно. Вот и всё
:lol:
 

pokos

аксакал

Tosha_443, 11.06.2004 10:29:21 :
Столкнулся с проблемой var1=!var1 не работает.
 


А ассемблерный код смотрел? Там что пишет?
Кстати, можно попробовать var^=1. Мне такой глюк пока не попадался, сегодня опробую у себя....
 

pokos

аксакал

Tosha_443, 09.06.2004 15:39:26 :
если #define .. ... писать, то он ее как константу и пользует и хранит ее при этом в ОЗУ
 


#define - это директива ПРЕПРОЦЕССОРУ, который вместо одного слова подставляет в текст программы другое ПЕРЕД компиляцией, поэтому, константы, определённые #define никаких дополнительных ресурсов кристалла не требует. Конечно, в ОЗУ она не хранится.
 
?? Tosha_443 #11.06.2004 18:38
+
-
edit
 

Tosha_443

втянувшийся
pokos, 11.06.2004 17:51:16 :
Tosha_443, 11.06.2004 10:29:21 :
Столкнулся с проблемой var1=!var1 не работает.
 


А ассемблерный код смотрел? Там что пишет?
Кстати, можно попробовать var^=1. Мне такой глюк пока не попадался, сегодня опробую у себя....
 


в асме он сносит бит в Т и делает ему тест, т.е флаги взводит, а потом этот бит назад из Т переносит.
пробовал var^=var, но может неправ в правой части...
но он не хотел и PORTD.2=!var исполнять, опять флаги взведет и все!
в аврСтудио смотрю - опять бит в Т, потестит, из порта в R30 байт снимет и назад положит...
раньше писал if (var){var=0} else {var=1} но это же не выход, насколько я понимаю, ну сказали бы сразу, что не работает- а то и в мануале пример есть.

И вообще я понял, что использовать навороты С не имеет смысла- слишком пухлый код получается.
стуктуры - у меня 100 слов ушло при замене структуры на битовые переменные.
char var
var=!var
больше, нежели
if (var){var=0} else {var=1}
подумываю об освоении WinAVR.
не пользует ли его кто? как им вообще оперировать? (ну где у него та необходимая большая красная кнопка--для "чайников" ? )
Не ошибается тот, кто ничего не делает  
?? Tosha_443 #11.06.2004 18:47
+
-
edit
 

Tosha_443

втянувшийся
Yuran, 11.06.2004 12:42:52 :
Пишется страницами, но еффективный способ записать один байт есть.
Читаешь нужную страницу в буфер, пишешь в буфер один байт свой и пишешь страницу обратно. Вот и всё
:lol:
 


ага, не забыв при этом проверить не попадут ли записываемые единицы на уже имеющиеся во флэше нули. :)
Не ошибается тот, кто ничего не делает  

AlexG

новичок
Никто случайно не использовал совместно IAR в режме С++ с VMLAB (с отладкой по исходным текстам)?
Я попробовал - получилась фигня, кажется это невозможно. Хотя в AVRstudio все без проблем.
 

Yuran

опытный

Tosha_443, 11.06.2004 18:47:27 :
ага, не забыв при этом проверить не попадут ли записываемые единицы на уже имеющиеся во флэше нули. :)
 


В АT45DB161B, это не требуется так как там есть фича стирание при записи на 4 мс дольше процесс записи 528 байтовой страницы, но это мелочи ведь. И вообще рулезная флеша, мне очень понравилась после праздников поеду куплю ещё пяток про запас! :rolleyes:
 
RU termostat #12.06.2004 02:51
+
-
edit
 

termostat

аксакал

Блин! кто тут дезу гонит? Еще раз повторяю что флэш at24с256 мной проверена "в железе" и полностью соотв ДатаШиту, в частности:

можно записывать 1 байт по произвольному адресу

можно записывать 64 байта одновременно начиная с ЛЮБОГО адреса и далее.

деление на страницы условно!!! нет его!

Исхоники на стр. 20 прошлой части топика!
RU termostat #12.06.2004 03:07
+
-
edit
 

termostat

аксакал

Resurrector, 08.06.2004 17:37:21 :
24LC515 подключена к меги16 по TWI (он же I2C) все на Си написано и все работает. :) Могу выложить скомпилированый и дезассемблированный код
 


Выложи если не трудно. пригодится в хозяйстве.


А Zilog тоже может прошитым в начало флэши бутлодером програмироваться, и внутрисхемно тоже. Схему для програмирования не смотрел подробно, так прислали мне адаптер в наборе.

AlexG

новичок
termotat
Открой адаптер для eZ80 и удивись его содержимому - там внутри ПЛИС и такой же eZ80F91
 
RU termostat #13.06.2004 02:15
+
-
edit
 

termostat

аксакал

Дак значит и адаптер можно использовать как маленькую макетку?

так же как и в адаптере для АВР напаяно 2 АВРа, хотя для программирования достаточно 5ти проводов на ЛПТ порт.
BG Реконструктор #14.06.2004 11:02
+
-
edit
 
termostat, 12.06.2004 01:07:00 :
Выложи если не трудно. пригодится в хозяйстве.
 


Вчера сделал тестовой проект, в котором находятся примеры решения основных проблемм для МК - коммуникация с PC по rs232 и буфферизация UART-a, а также чтение-запись в 24LCxxx. :) К сожелению мне отрубили связь и не успел проект зааплодить.
 
RU termostat #14.06.2004 11:43
+
-
edit
 

termostat

аксакал

Если будешь выкладывать, сделай пожалуйста коментарии в исходнике поподробней.

Под какой компилятор? Какая частота на i2c получается?

В моем коде на 20й странице предыдущ части темы, все тоже только без буфера UART.


BG Реконструктор #14.06.2004 12:10
+
-
edit
 
Ссылочку прямо можно? А то лень искать.

Компилятор - родной ИАР, частота - 100 КГц. На практике можно и 400, но не пробовал. У меня SDA и SCL подтянуты через 10К а в даташите написано, что для 400КХц и 1 МГц надо только 2К. Но ничего не мешает попробовать. :)
Исходники я, разумеется, брал готовыми, только они были для GCC, и для 24Cxx (у него адресация производится только одим байтом), так что надо было подгонать все под ИАР.
 
+
-
edit
 

trainer

втянувшийся

termostat, 12.06.2004 01:51:19 :
Блин! кто тут дезу гонит? Еще раз повторяю что флэш at24с256 мной проверена "в железе" и полностью соотв ДатаШиту
 


24-я серия всегда EEPROM-ом числилась. :)
Во имя Ctrl, Alt и святаго Del. Enter!
 
+
-
edit
 

karlos

втянувшийся
trainer, 14.06.2004 12:51:42 :
24-я серия всегда EEPROM-ом числилась. :)
 


Вот я и про Serial EEPROM АТ24C64 и говорил, а тут сразу деза, деза
:)
 
RU termostat #14.06.2004 16:53
+
-
edit
 

termostat

аксакал

Resurrector, 14.06.2004 11:10:54 :
Ссылочку прямо можно? А то лень искать.

Компилятор - родной ИАР, частота - 100 КГц. На практике можно и 400, но не пробовал.
 


Ссылочка вот:

i2c 24с256 и передача по rs232 на ПК здесь: Форумы Авиабазы
в "прицепе" к предпоследнему сообщению.


А как ты частоту определил? я мерил по эмуляции прошивки .hex в VMLAB.
Как частота в IAR ставится?

в ImageCraft все прцедуры i2c на Си прписаны в .h файле - там все ясно. А вот в КодВижен сам код генерит, это не прозрачно и изменить не возможно, т.е. ручками надо полученый АСМ править и затем перекомпилировать уже АСМ в HEX.
BG Реконструктор #14.06.2004 19:38
+
-
edit
 
А что мне с этим файлом делать?!

Частота аппаратного TWI определяется регистром TWBR. Читай про Bit Rate Generator Unit на странице 176 даташита меги-16.

Установка частоты - нечто вроде этого:

TWBR = (частота_проца / частота_TWI - 16) / 2;
 
AD Реклама Google — средство выживания форумов :)
BG Реконструктор #14.06.2004 22:27
+
-
edit
 
Так. Формула вычисления значения TWBR оказалась неправильной. :) Правильная:

code text
  1.  
  2. TWBR = (частота_проц / частота_twi - 16) / 2;


В даташите написано следующее:

Note: TWBR should be 10 or higher if the TWI operates in Master mode. If TWBR is lower than 10, the Master may produce an incorrect output on SDA and SCL for the reminder of the byte. The problem occurs when operating the TWI in Master mode, sending Start + SLA + R/W to a Slave (a Slave does not need to be connected to the bus for the condition to
happen).
 


Так что при частоте процессора 14.7456 MHz (как у меня), максимальная частота TWI может быть 400 КХц.



А вот и сами исходники:
Прикреплённые файлы:
 
 
1 2 3 4 5 6 7 12

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru