Перейти к содержанию

Описание Массива В Cvavr


Knazev33

Рекомендуемые сообщения

Сталкнулся с такой проблемой, при попытке присвоить отдельному элементу массива значение,

выдаёт ошибку что незнает элемент в массиве. попытка отдельно описать элемены не помогает,

при описание массива2 выдаёт ошибки в описании кнопок.

хотя в книжках написано что можно присвоить отдельному элементу массива новое значение

типа rabtab[1]=231; это тоже неработает.

#include <mega8.h>

//unsigned char  a1=0, a2=0, a3=0, a4=0, a5=0, a6=0, a7=0;     //x
//unsigned char  i=3;     //для счётчика
flash unsigned char cod[] = {a1, a2, a3, a4, a5, a6, a7};   //массив1
//flash unsigned int cod[7] = {1, 2, 3, 4, 5, 6, 7};  //  массив2
void main(void)
{
while (1)
     { 

if (!PIND.0) {cod[i]=7;}   // присвоить 3му эл-ту значение 7
if (!PIND.1) {cod[7]=2;}   //    присвоить 7му эл-ту значение 2


     };
}

как описано в книжке:

flash unsigned int rabtab[7] = {1, 2, 3, 4, 5, 6, 7};  
void main(void)
{
while (1)
     { 
rabtab[1] = 231;   // первому  элементу массива значение 231

     };
}

тоже ошибочно.

Электроника это целый океан творчества...

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

НУ всё правильно.. Вы пытаетесь изменить в памяти КОНСТАНТУ !!!!!

flash unsigned int rabtab[7] = {1, 2, 3, 4, 5, 6, 7};

Попробуте уложить без атрибута flash и без инициализации. И только потом в маин наполнить арей

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Да это помогло :) но только для массива числовыми значенями, а буквы ну никак не хочет

принимать :/

Электроника это целый океан творчества...

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Буквы это имеется ввиду массив с буквенными элементами типа unsigned char cod[] = {a, b, c, d, e, f, g}; и присвоить в программе отденьному элементу новое значение.

вообще я думаю создать что то типа кодового замка по такому принцыпу, друго пока непридумал.

#include <mega8.h>
#include <delay.h>
unsigned char  i=1;
int c;
int temp;

unsigned int cod[] = {1, 2, 3, 4, 5, 6, 7};  //  массив
void main(void)
{

PORTB=0xFF;
DDRB=0xFF;

PORTC=0x7F;
DDRC=0x7F;

PORTD=0xFF;
DDRD=0x00;
ACSR=0x80;


while (1)
     { 
m1: temp=PIND;
for(c=0; c<7; c++)//  run key
{
if ((temp&1)==0) delay_ms(150);  goto m2;
temp>>=1;
}   

m2: if(i==7){i=1;};  i++;  
cod[i]=c;

if((cod[1]=2)&(cod[2]=4)&(cod[3]=3)&(cod[4]=5)&(cod[5]=1)&(cod[6]=2)){PORTB.0=0;} //open
else
{goto m1;}      
// kod is 2 4 3 5 1 2


     };
}

Электроника это целый океан творчества...

Ссылка на комментарий
Поделиться на другие сайты

Глупости всё это:) И что это будет? При изменении кода надо будет скомпилировать снова програму и залить в мегу? А для чего тогда делали EEPROM ??? Код дожен быть уложен в EEPROM и точка.

P.S. Чтобы уложить в масив литерал нужно его как литерал и обозначть:

unsigned unsigned char cod[] = {"a", "b", "c", "d", "e", "f"};

P.S.S. Использование GOTO в програмах на С считается плохим тоном :)

Ссылка на комментарий
Поделиться на другие сайты

ещё один маленький вопросик,влияет ли на срок жизни еепрома количества его считований,

просто у меня в проге постоянно сравнивается значение еепрома с флеш буфером.

Электроника это целый океан творчества...

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Привет всем форумчанам!

Возник вопрос по написанию кода,

Есть цикл который включается по сработке, в нём начинают мигать диоды "лед1" , по идеии он должен

мигнуть 10раз и выйти из цикла, но почемуто этого непроисходит :huh:

немогу понять в чём дело почему условие иф неработает в цикле?

кто нубудь знает что нужно исправить :D

while(alarm==1)   //цикл мигания
{
led2=1; //свето диод
rele=0;   //реле
delay_ms(150);
led2=0;
i++; //+1к счётчику
delay_ms(150);
my_keys(); // кнопки
if(i==10){rele=1; alarm=0; led2=1;} //условие выхода из цикла
}

Электроника это целый океан творчества...

Ссылка на комментарий
Поделиться на другие сайты

Похоже что у вас не инициализирована переменная i. Вобщем из этого куска много не понятно.. И ещё правильней если проверяете после увеличения проверять на больше/равно... Мало ли что случиться... Перемнная пролетела на еденицу и всё.. Пока не переполнится...

И ещё непонятно зачем использовать while там где очень удачно бы вписался for...

Ссылка на комментарий
Поделиться на другие сайты

Очень хорошо работают вот такие вещи :

i=10;
while(i--)
{
........
........
........
}

А у вас возможно перед циклом переменной alarm присваиваеться 1-ца . Т.е. alarm=1;

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

А вобщем то как сказал Вова, for самое то, что вам надо.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо за помощь B) фишка типа if(i>=10){rele=1; led2=1; i=0; alarm=0; } помогла, вроде мелочь

== или >= а приводит к неапознанным глюкам :ph34r: ...

Электроника это целый океан творчества...

Ссылка на комментарий
Поделиться на другие сайты

Ничегор подобного.. Алгоритм надо представить в голове и переписать его в языке в котором пишете.. И использовать надо точто годится для алгоритма... Я наприрмер имел больше глюков именно когда было просто ==. Случалось что переменную меняю в разных местах и перескаивала значение и глюк был на свете... Вобщем не надо боятся разных операторов.. Для того они там и есть...

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Требуется совет спетцов в СИ B) , есть жк 16х2 есть две переменные i и i, переменная i меняется

от 0 до 2000, переменная ii должна пребовлятся на +1 когда переменная i будет кратна 20, типа когда

i=20 тогда ii=1, i=40 тогда ii=2, i=60 тогда ii=3 и т д, немогу понять как создать такой алгоритм :unsure:

Электроника это целый океан творчества...

Ссылка на комментарий
Поделиться на другие сайты

Вводится дополнительная переменная - счетчик. Инкрементируется одновременно с i.

В теле программы проводим проверку на равенство счетчика 20.

Если равно - обнуляем счетчик и увел. на 1-цу ii.

Если нет - пропускаем...

И так по кругу...

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

Возник вопрос про странное мерцание жк16х2, при выводе на него значение переменной,

здесь какимто образом влияет задержка,

char lcd_buffer[31]; //что за число в скобках

sprintf(lcd_buffer,"ADC=%4umV ",result);// записываем в буфер вторые 2

lcd_clear(); // очищаем жки

lcd_puts(lcd_buffer); // теперь выводим в него

delay_ms(100); //задержка

Как избавится от мерцания :huh:

Электроника это целый океан творчества...

Ссылка на комментарий
Поделиться на другие сайты

Ненадо очищать так дисплей... Лучше придать на конец строки пару пробелов при переводе и просто переписывать.. От этого может быть и мерцание... А кратность можно проверять и делением i на 20 и потом славнивать если больше предедущего ii . Можно и с дополнительным счётчиком - но могут возникнуть проблемы синхронизации....

Ссылка на комментарий
Поделиться на другие сайты

Выполнять ДЕЛЕНИЕ для такой простой задачи, и после этого все равно сравнивать? Смысл?

О какой рассинхронизации идет речь? Выводим все переменные в конце цикла и все...

Knazev33

Посмотрите как можно без sprintf вывод переменных сделать (код существенно экономичнее):

http://forum.cxem.net/index.php?s=&sho...st&p=326184

Изменено пользователем Goodefine

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

Ну например бует одна переменная увеличена а вторая нет.. Вот и нет синхронизации... Я то ведь не вижу целый код... А с делением не надо ничего хранить.. Данные высчитываются всегда актуально.... И деление можно сделать сдвигами...

Ссылка на комментарий
Поделиться на другие сайты

Стараюсь выполнять деление только когда оно действительно необходимо. Переменная не увеличится только если ошибка в программе будет, или сбой... ИМХО, для деления вероятность сбоя больше либо равна чем при суммировании. А насчет ошибки в программе даже трудно представить, где ее допустить можно: все переменные рядом находятся. Если только между ними прерывание возникнет и стека не хватит... Но деление ведь тоже в несколько этапов выполняется - вероятность даже больше будет - время выполнения на порядок-другой больше будет..

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Привет всем, нужен совет в написании кода :rolleyes: .

Есть программа таймер , при запуске таймер считает до 60 и останавливается,

if(sec>=60){m_buffer=k; #asm("cli"); a1=0;  beep=0; delay_ms(350); beep=1;} // AUTO STOP

дейсвие beep=0; включает пищалку beep=1; выключает,

проблема в том что пока sec>=60 пищалка пиликает постоянно! а нужно чтобы действие

{beep=0; delay_ms(350); beep=1;} выполнялось один раз, и сработало тоже один раз при следуещим

запуске таймера когда он досчитает до 60...

Электроника это целый океан творчества...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...