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

Примеры кода для AVR


Duhas

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

Аббревиатура АЦП вам о чем-нибудь говорит? В ATtiny13 он есть, в ATtiny2313 нет. Для индикации заряда может хватить самодельного полупрограммного интегрирующего АЦП, это только звучит страшно а на деле резистор, конденсатор и кусок кода. Точность невелика зато можете продолжать использовать ATtiny2313.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

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

гугл просветил насчет АЦП :blink: . если надо могу и на тини 13 перейти. Но хто бы обьяснил как програмным путем все организовать. Я только Си знаю, да и то чучуть. где бы подчитать хоть скажите. а то перелопачиваю все что на глаза попадается, а время то не казенное. скоро пенсия :rtfm:

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

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

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

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

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

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

Откройте даташит на мк на соответствующей странице посвященной АЦП, прочитайте о регистрах задействованных в работе АЦП. Вот эти все регистры в главной программе настраиваете так как вам надо (опорное напряжение, разрядность, выравнивание, время преобразования, источник). А дальше когда нужно запускаете ацп на измерение и потом считываете и обрабатываете значение.

http://dfe.petrsu.ru.../mega16adc.html

http://chipenable.ru...du-chast-1.html

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

  • 1 месяц спустя...

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

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

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

гугл просветил насчет АЦП :blink: . если надо могу и на тини 13 перейти. Но хто бы обьяснил как програмным путем все организовать. Я только Си знаю, да и то чучуть. где бы подчитать хоть скажите. а то перелопачиваю все что на глаза попадается, а время то не казенное. скоро пенсия :rtfm:

Можно и на тини 2313 соорудить АЦП и достаточно точный с разрешением 16 бит. Нужно всего лишь использовать встроенный компаратор и один вывод ШИМ. Ну и внешняя обвязка в пару резисторов/конденсаторов.
Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...
vremy.zipНужна очень сильно ваша помошь не как не могу сделать чтоб время и дата были на разных строчках Изменено пользователем Смит
Ссылка на комментарий
Поделиться на другие сайты

  • 5 недель спустя...

Придумал вот-такую моргалку с условием: если один светодиод горит, то второй обязательно должен погаснуть и наоборот, и всё по циклу. Можно ли так?

Вот код в Bascom AVR:

$regfile = "2313def.dat"

$crystal = 4000000

$hwstack = 40

$swstack = 16

$framesize = 32

Config Portb.0 = Output

Config Portb.1 = Output

Do

Portb.1 = 1

If Portb.1 = 1 Then ' условие мигания

Portb.0 = 0

Waitms 50

Portb.1 = 0

If Portb.1 = 0 Then ' условие мигания

Portb.0 = 1

Waitms 50

End If

End If

Loop

End

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

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

Всем доброго времени суток! Подскажите пожалуйста можно ли с помощью delay_ms организовать паузу на несколько часов? Если нет то как поступить мне нужна задержка на 13 часов. заранее спасибо.

Не знаеш как? Спроси у Google'а !!!

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

Конечно. Сделай процедуру которая в цикле вызывает delay_ms(1000) 3600 раз, а потом эту процедуру вызови 13 раз...

Учение - изучение правил. Опыт - изучение исключений.

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

я начинающий в авр купил книгу учусь по ней и наткнулся на запись в ней что функция delay грузит весь проц и никакие другие функции не работают когда работает она а мне во время этой задержки нужно читать ацп что посоветуете?

Не знаеш как? Спроси у Google'а !!!

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

ааааа чучуть по русски если? наверное надоел уже вам. и спасибо что отвечаете хоть а то бывает пишеш пишеш а на тебя просто забивают))

Не знаеш как? Спроси у Google'а !!!

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

По окончании аналого-циврового преобразования модуль АЦП может сгенерировать прерывание. Если оно разрешено (как в настройках модуля так и битом I регистра SREG) то будет вызвано, независимо от того что процессор делал до этого, рассчитывал что-то важное или крутился в цикле задержки.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

В прерывании пиши так

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
time[0]++;
if (time[0]>=244) {time[0]=0;sec[0]++;}
if (sec[0]>=60) {sec[0]=0;min[0]++;}
if (min[0]>=60) {min[0]=0;hour[0]++;}
if (hour[0]>=24) {hour[0]=0;}
}

число 224, у Вас может быть другим, зависит от такта контроллера...(частота деленная на 256)

Конечно нужно объявить переменные по типу:

// объявление глобальных переменных в обычной памяти

unsigned char time[1]={0}; //время по циклу

unsigned char sec[1]={0}; //время в секундах

unsigned char hour[1]={0}; //время в часах

unsigned char min[1]={0}; //время в минутах

Всем доброго времени суток! Подскажите пожалуйста можно ли с помощью delay_ms

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

прерывание, как уже говорили

Читать в прерывании по окончанию преобразования.

твое все)

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

]

число 224, у Вас может быть другим, зависит от такта контроллера...(частота деленная на 256)

Если у меня частота камня 1МГц я же не могу записать 3906 или могу? не понял этого момента.

Не знаеш как? Спроси у Google'а !!!

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

В 16-битный таймер можно было бы записать, но в 8-битный не получится.

Если у тебя свободен только 8-битный, остается задействовать предделитель перед ним, который сможет поделить тактовую частоту на степень двойки(см.даташит) а потом еще и на значение таймера. подобрав коэфициенты можно в итоге получить нужный множитель... или не получить, если не повезет и необходимое тебе количество тактов не имеет НОД со степенью двойки. Тогда остается либо подбирать кварц, либо добивать "такты" программно различными ухищрениями.

3906 можно получить предварительным делением на 16 и затем счетчиком до 244 с ошибкой в 2 единицы.

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

Учение - изучение правил. Опыт - изучение исключений.

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

Блин походу не напишу сам эту программу чот сложновато для начинающих)) потренируюсь пока с таймерами. ВСЕМ спасибо за помощь.

Не знаеш как? Спроси у Google'а !!!

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

там задача огромная ну огромная это на мой взгляд. все впринципе сам смогу кроме ацп и таймера а алгоритм следующий устройство для автоматической зарядки батарей с двумя режимами в первом режиме устройство просто заряжает батареи пока не выполнится одно из условий или по истечению 13 часов или по достижению 4.7 вольта и отключается во втором режиме все тоже самое только не отключается а переключается в режим разряда батареи до 3.5 вольта и потом опять на заряд и так по кругу тоесть тренировка батареи вроде блин не сложно когда алгоритм читаеш а как за дело взялся столько блин камней подводных вот думаю как режимы переключать с помощью одной кнопки или две лучше поставить? камень аттини13

Не знаеш как? Спроси у Google'а !!!

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

лови для Код Вижион Авр - камень Тинька 2313

Программа для включения выключения диода на заданный промежуток времени с комментариями. Уствка по времени записывается в Епром...короче, если разберешься, то дальше сможешь написать свою прогу..(специально бросаю неизмененную под твои условия, дабы немного разобрался, будут вопросы - пиши)

#include 
/*
задача:
1. По 2ум входам PORTB.0 и PORTB.1 получить возможность задавать время включенного состояния МК1 и время выключенного состояния МК2
2.По 2ум выходам PORTB.2 и PORTB.3 показывать начало и окончание программирования с помощью диодов
3. По 1му выходу PORTB.4 включать и выключать диод с задаными промежутками МК1 и МК2
*/

// объявление глобальных переменных в обычной памяти
unsigned char INPUT_STAT[5]={0,0,0,0,0}; //опрос входов побитный
unsigned char INV_STAT[5]={0,0,0,0,0}; //опрос входов побитный инверсионный
unsigned char STAT[5]={0,0,0,0,0}; //статус входов побитный
unsigned char time[1]={0}; //время по циклу
unsigned char sec[1]={0}; //время в секундах
unsigned char hour[1]={0}; //время в часах
unsigned char min[1]={0}; //время в минутах
unsigned char MB1[2]={0,0}; //используем как метки условий
unsigned char Cycle3=0; //статус временного отрезка в проход программы
unsigned char Temp[2]={0,0};
// объявление глобальных переменных в EEPROM памяти
__eeprom unsigned char MK1; //программирование времени включенного состояния МК1
__eeprom unsigned char MK2; //программирование времени выключенного состояния МК1

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
time[0]++;
if (time[0]>=244) {time[0]=0;sec[0]++;}
if (sec[0]>=60) {sec[0]=0;min[0]++;}
if (min[0]>=60) {min[0]=0;hour[0]++;}
if (hour[0]>=24) {hour[0]=0;}
}

void Stt (void)
{
unsigned char Temp1=0;
while (Temp1<=4) {
if (INPUT_STAT[Temp1]==1 && INV_STAT[Temp1]==1) {STAT[Temp1]=1;} else {STAT[Temp1]=0;}
Temp1++;
};
}

void change (void)
{
if (Cycle3==0) {Cycle3=1;}
else {Cycle3=0;};
}

void PIN (void)
{
if (Cycle3!=0)
{
// проверка состояния вводов - PINB.0
if (PINB.0!=0) {INPUT_STAT[0]=1;} else {INPUT_STAT[0]=0;}
// проверка состояния вводов - PINB.1
if (PINB.1!=0) {INPUT_STAT[1]=1;} else {INPUT_STAT[1]=0;}
// проверка состояния вводов - PINB.2
if (PINB.2!=0) {INPUT_STAT[2]=1;} else {INPUT_STAT[2]=0;}
// проверка состояния вводов - PINB.3
if (PINB.3!=0) {INPUT_STAT[3]=1;} else {INPUT_STAT[3]=0;}
// проверка состояния вводов - PINB.4
if (PINB.4!=0) {INPUT_STAT[4]=1;} else {INPUT_STAT[4]=0;}
}
if (Cycle3!=1)
{
// проверка состояния вводов - PINB.0
if (PINB.0!=0) {INV_STAT[0]=1;} else {INV_STAT[0]=0;}
// проверка состояния вводов - PINB.1
if (PINB.1!=0) {INV_STAT[1]=1;} else {INV_STAT[1]=0;}
// проверка состояния вводов - PINB.2
if (PINB.2!=0) {INV_STAT[2]=1;} else {INV_STAT[2]=0;}
// проверка состояния вводов - PINB.3
if (PINB.3!=0) {INV_STAT[3]=1;} else {INV_STAT[3]=0;}
// проверка состояния вводов - PINB.4
if (PINB.4!=0) {INV_STAT[4]=1;} else {INV_STAT[4]=0;}
}
}

void refreshing (void)
{PIN();Stt();change();}


void Logic (void)
{time[0]=0;sec[0]=0;}


void STAT_sbros (unsigned char Temp)
{
Temp=0;
while (Temp<=4) {
STAT[Temp]=0;
Temp++;
};
}

void Lamp (void)
{
Temp[0]=MK1;Temp[1]=MK2;
if (Temp[0]<=sec[0] && ( MB1[1]==0 || MB1[1]==1) ) {PORTB.4=1; MB1[1]=2;Logic();}
if (Temp[1]<=sec[0] && MB1[1]==2) {PORTB.4=0; MB1[1]=1;Logic();}
}


void Select (void)
{
// если мы не программируем время, то стоим здесь
if (MB1[0]==0)
{
if ((STAT[0]!=1 && STAT[1]!=1))
{ STAT_sbros(2);
do {
refreshing();
Lamp();
}
while ((STAT[0]!=1 && STAT[1]!=1));
}
if (STAT[0]!=0) {MB1[0]=1;PORTB.4=0;Logic();
do {PORTB.2=1;} //включил 1й светодиод
while (sec[0]<=1);//на 1 секунду - вход в программирование
Logic(); //обнулил время
do {PORTB.3=1;} //включил 2й светодиод
while (sec[0]<=1); //на 1 секунду - подтверждение входа в программирование
PORTB.2=0; //выключил 1й светодиод для возможности подсчета колличества заданых секунд
MB1[1]=0;Temp[0]=0;};
if (STAT[1]!=0) {MB1[0]=2;PORTB.4=0;Logic();
do {PORTB.2=1;} //включил 1й светодиод
while (sec[0]<=1);//на 1 секунду - вход в программирование
Logic(); //обнулил время
do {PORTB.3=1;} //включил 2й светодиод
while (sec[0]<=1); //на 1 секунду - подтверждение входа в программирование
PORTB.2=0; //выключил 1й светодиод для возможности подсчета колличества заданых секунд
MB1[1]=0;Temp[1]=0;};
};

// если задание на отключение всех энергопотребителей - красеая кнопка
if (MB1[0]==1)
{

if (STAT[0]!=0 && MB1[1]==0){PORTB.2=1;refreshing();}; //жду пока отпустят кнопку задания времени и засвечиваю светодиод
if (STAT[0]!=1 && MB1[1]==0){PORTB.2=0;Temp[0]++;Logic();MB1[1]=5;}; //если отпустили, то перевожу на другоой шаг MB1[1]=5 со сбросом времени Logic();
if (STAT[0]!=1 && MB1[1]==5 && sec[0]<=5){refreshing();}//жду повторного нажатия, если нет, то на выход
if (STAT[0]!=1 && MB1[1]==5 && sec[0]>5){if (Temp[0]>50) {Temp[0]=50;};#asm("cli")MK1=Temp[0];#asm("sei")MB1[0]=0;MB1[1]=0;PORTB.2=0;PORTB.3=0;}
//записываю значение Темп в память МК1=Temp[0]; выход по времени более 5 ти секунд
if (STAT[0]!=0 && MB1[1]==5 && sec[0]<=5){MB1[1]=0;}; //если нажали возврашаю в начало MB1[1]=0;
}

// если задание на отключение только освещения
if (MB1[0]==2)
{

if (STAT[1]!=0 && MB1[1]==0){PORTB.2=1;refreshing();}; //жду пока отпустят кнопку задания времени и засвечиваю светодиод
if (STAT[1]!=1 && MB1[1]==0){PORTB.2=0;Temp[1]++;Logic();MB1[1]=5;}; //если отпустили, то перевожу на другоой шаг MB1[1]=5 со сбросом времени Logic();
if (STAT[1]!=1 && MB1[1]==5 && sec[0]<=5){refreshing();}//жду повторного нажатия, если нет, то на выход
if (STAT[1]!=1 && MB1[1]==5 && sec[0]>5){if (Temp[1]>50) {Temp[1]=50;};#asm("cli")MK2=Temp[1];#asm("sei")MB1[0]=0;MB1[1]=0;PORTB.2=0;PORTB.3=0;}
//записываю значение Темп в память МК2=Temp[1]; выход по времени более 5 ти секунд
if (STAT[1]!=0 && MB1[1]==5 && sec[0]<=5){MB1[1]=0;}; //если нажали возврашаю в начало MB1[1]=0;
}
};





// тело основной программы
void main(void)
{

// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func2=Out Func1=Out Func0=Out
// State2=0 State1=0 State0=0
PORTA=0x00;
DDRA=0x07;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x1C;

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;


// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Phase correct PWM top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x01;
TCCR0B=0x03;
TCNT0=0xFF;
OCR0A=0x00;
OCR0B=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;


// Global enable interrupts
#asm("sei")
while (1)
{
Select();
};

}

тут архив с исходниками и хеком в папке ехе

файл протеуса так же внутри папки

On_Off_Timer с часами.rar

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

лови для Код Вижион Авр - камень Тинька 2313

Программа для включения выключения диода на заданный промежуток времени с комментариями. Уствка по времени записывается в Епром...короче, если разберешься, то дальше сможешь написать свою прогу..(специально бросаю неизмененную под твои условия, дабы немного разобрался, будут вопросы - пиши)

Спасибо огромное вам за помощь.

Не знаеш как? Спроси у Google'а !!!

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

unsigned char Cycle3=0; //статус временного отрезка в проход программы

вместо атидребезга, если два цикла прошли и Статус равен 1це, значит кнопка нажата

многие ставят задержку....но там тогда проц ничего не делает во время задержки..

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

)))) эт я понял что от функции delay нужно отказатся раз и навсегда)) вот и осваиваю таймеры купил книжку умную а там примеры все на 2313 и ацп примеров нету немножко огорчило конечно ))) на примерах из инета пробую все вроде понятно сам начинаю мудрить не получается)) но как говорится врагу не здается наш гордый варяг) освою потихоничку)

Не знаеш как? Спроси у Google'а !!!

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...