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

Видеокурс по AVR-микроконтроллерам для начинающих


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

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

Я так понимаю, что третье нажатие кнопки приведет к исполнению этой строки, результатом которой будет отсутствие свечения светодиодов портов PB2, PB3 и загорится светодиод порта PB4. И будет гореть до 4 нажатия кнопки. В результате 4 нажатия выполнится по команде: if(v==4)v=0; переход на команду: if(v==0) PORTB.2 = 0; PORTB.3 = 0; PORTB.4 = 0; , которая должна погасить все светодиоды.

Благодарю за помощь. Только начал изучать.

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

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

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

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

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

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

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

Не могу избавиться от минусов для измерения температуры(по моему урок 8):

Вопрос снимаю нашел ошибку.

было for (int i=0;i<40;i++)
    {
        ADCSRA |=(1<<ADSC);
        while (ADCSRA &(1<<ADSC)){}
        tmp=tmp+ADC;
    }
    
    return tmp/40;

нужно for (int i=0;i<20;i++)
    {
        ADCSRA |=(1<<ADSC);
        while (ADCSRA &(1<<ADSC)){}
        tmp=tmp+ADC;
    }
    
    return tmp/20;

но не понимаю почему такая зависимость от числа измерений

 

 

 

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

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

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

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

6 часов назад, uuu000 сказал:

не понимаю почему такая зависимость от числа измерений

Ну, наверное потому, что tmp переполняется при 40 суммированиях, и не переполняется при 20.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

  • 5 месяцев спустя...

Всем  привет, в этом видеоуроке когда мы делаем подключение кнопки в работу бегущей строки светодиод который подключен к выводу PORTB0  в режиме "с низу в верх"   не издает свечение, ошибка в коде? или с чем это связано. На видео находиться с 9:09 до 9:25.

Спасибо за внимание

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

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

Доброго времени суток, по шестому уроку вопрос. При подключении LCD дисплея у меня компилятор показывает ошибку

// ATmega8A

#include <avr/io.h>
#define F_CPU 8000000
#include "n5110.h"

void preset(){
    
 Lcd_init();
 Lcd_clear();
    
    
}

int main(void)
{
    preset();
    
    while(1)
    {
     Lcd_prints(0, 3, FONT_1X,(unsigned char *)PSTR("Hellow"));
     Lcd_prints(0, 3, FONT_1X,(unsigned char *)PSTR("Привет"));
     Lcd_update();
    
    
    
    }
Ошибка компилятора:

Error    1    undefined reference to `Lcd_init()'    E:\proect\Lessons\Les6\GccApplication6\GccApplication1\Debug/.././GccApplication1.cpp    9    1    GccApplication1
Error    2    undefined reference to `Lcd_clear()'    E:\proect\Lessons\Les6\GccApplication6\GccApplication1\Debug/.././GccApplication1.cpp    10    1    GccApplication1
Error    3    undefined reference to `Lcd_prints(unsigned char, unsigned char, LcdFontSize, unsigned char const*)'    E:\proect\Lessons\Les6\GccApplication6\GccApplication1\Debug/.././GccApplication1.cpp    21    1    GccApplication1
Error    4    undefined reference to `Lcd_prints(unsigned char, unsigned char, LcdFontSize, unsigned char const*)'    E:\proect\Lessons\Les6\GccApplication6\GccApplication1\Debug/.././GccApplication1.cpp    22    1    GccApplication1
Error    5    undefined reference to `Lcd_update()'    E:\proect\Lessons\Les6\GccApplication6\GccApplication1\Debug/.././GccApplication1.cpp    23    1    GccApplication1
 

 

При изменении #include "n5110.h" на #include "n5110.с" компилятор работает но тогда показывает такую ошибку. Я так понимаю что память перегружена но чем?(Если надо скрин могу кинуть)

Error    1            Program Memory Usage     :    6866 bytes   83,8 % Full
                Data Memory Usage         :    1054 bytes   102,9 % Full    (Memory Overflow)    GccApplication1    0    0    GccApplication1

 

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

  • 2 недели спустя...
12.01.2021 в 00:22, M83 сказал:

Доброго времени суток, по шестому уроку вопрос.

Если файлы библиотеки дисплея на месте и подключены правильно, то все компилируется без ошибок.

Мир не без добрых людей!

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

  • 3 месяца спустя...

Делаю что-то похожее на ИК пульт. Использовал атмегу8 и 8МГц кварц. Настроил Таймер_2 в режим СТС. Настроил Таймер 2 на частоту 36кГц. И проверил осциллографом - все работает. 36кГц есть на порте.
Была у меня идея первый таймер использовать для генерации частоты а второй для того чтобы им первый включать и выключать с определенными задержками для создания "пакетов" данных. Но подумал немного и что-то мне стало жалко использовать аж целых два таймера только для одного этого задания. И решил попробовать сделать на одном таймере. Написал функцию которая посылает сначала стартовый длинный пакет импульсов, а потом берет массив в котором находятся 1 и 0 (код который нужно отправить), и в зависимости от того 1 или 0  отправляет пачки импульсов определенной длины добавляя задержки между ними. For и Loop не использовал чтобы процессор "не зависал" в прерывании на долго и успевал выполнять другие задачи.
Все сделано проверками IF и еще несколько статических переменных и там же в векторе ISR(TIMER0_OVF_vect) инвертирую порт.
Правильно ли я поступил?

На время разработки я запустил таймер_2 который генерирует несущую частоту 36кГц на постоянно. Но в дальнейшем когда программа будет закончена буду запускать его кнопкой только на время передачи импульсов и по он окончанию самостоятельно выключиться.


Таймер_2 работает на прямую от генератора 8МГц то есть - на частоте процессора.

void timer2_init () {
    TIMSK |= (1<<OCIE2); //Timer/Counter2 Output Compare Interrupt Enable
    //Разрешение прерывания по совпадению таймера/счетчика2
    TCCR2 |= (1<<CS20) | (1<< WGM21); // clkT2S/1024 (From prescaler) AND Clear Timer On Compare - CTC
    OCR2 = 110; // Output Compare Register – OCR2 continuously compared with the counter value (TCNT2)
}

 

А таймер 0 для других заданий так clkT2S/128 (From prescaler)

void timer0_init(){
	TIMSK |= (1<<TOIE0);
	TCCR0 |= (1<<CS00) | (1 << CS02) ;
	//TCNT0 = 60;
	//PORTD |= (1<<7);
}

 

Так вот код в OVF таймера _0 не выполняется когда запущен таймер_2

ISR(TIMER0_OVF_vect){
	//code
	//code
}

 

То есть если превысить некий лимит команд в прерывании таймера_2 то код в прерывании таймера_0 не выполняется.
Я все правильно понимаю?

Это потому что таймер_2 работает на частоте процессора и забирает все его время и производительность на себя?
И код в основном цикле тогда тоже не будет выполняться если таймер_0 будет все время прерываться с частотой тактирования процессора?

Если i < 11 таймер_0 не работает.  Если  i < 10 то еще работает.

ISR(TIMER2_COMP_vect){
	//fire_act();
	for(int i = 0; i < 11; i++){asm("nop");}
}//ISR

Я понимаю это так. Что время выполнения кода прерывания или равно или превышает время между вызовами этого же прерывания.
Правильно?

Screenshot_1.png

 

Только что заметил что ошибся с темой. А удалить сообщение уже нельзя ...

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

  • 4 месяца спустя...

Я правильно понимаю, что в шестом уроке, где показывается использование LCD дисплеев 5110 или 3310 используется библиотека только конкретно для этих дисплеев. А допустим использование других дисплеев требует других библиотек.
1. Это верно?
Ещё вопросы:
2. Кто разрабатывает эти библиотеки? Производители дисплеев или это конкретно "труд радиолюбителя/разработчика"?
3. Если эти библиотеки разрабатывает производитель, тогда где их брать?
4. Использование других библиотек как-то влияет на процесс программирования, конкретно на код. Я имею в виду сам текст программы, а не подключаемые библиотеки.

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

5 часов назад, Юрий_Нд сказал:

2. Кто разрабатывает эти библиотеки?

Кому надо, тот и разрабатывает.
Вот мне сейчас босс велел поставить в устройство дисплей на основе ILI9488. Взял pdf на него, настроил регистры, вывел на экран закрашеный прямоугольник. Всё, основная часть работы сделана.
А дальше - как уж тебе самому надо. Знакогенератор напишешь, шрифты нарисуешь (или сконвертируешь).

А можно как адруинщики поступить. Взять готовую библиотеку (которую кто-то уже написал и не факт, что ей удобно пользоваться лично тебе), немного подшаманить, запустить, а потом бегать и спрашивать всех, как заставить выводить UTF-8 и прочие unicode символы.

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

18 часов назад, LiVit сказал:

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

... случайно нашёл у себя дисплей LC1628.
Как думаете, реально найти для него библиотеку.
Или самому придётся "ваять"?
---
По поводу "ардуинщиков".
Я правильно понимаю, что "ардуинщики" отличаются от всей братии только тем, что им не нужно заниматься пайкой.
Всё железо они покупают, а уже дальше, что "ардуинщик", что другой радиолюбитель, сталкивается с теми же проблемами написания кода, прошивками и всё такое.
---
... насколько я понимаю, в этой теме железом не занимаются?
Подскажите пожалуйста, на этом форуме есть место/ раздел, где обучают "железу" по АВР.

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

17 минут назад, Юрий_Нд сказал:

раздел, где обучают

Вы не правильно понимаете, для чего существуют форумы. Никак не для обучения. Учиться вы должны сами. А форумы для советов, помощи в непонятных вопросах, консультациях. Поглумиться могут над очень уж тупыми вопросами. :)

 

21 минуту назад, Юрий_Нд сказал:

реально найти для него библиотеку

Ищите, никто за вас этим заниматься не будет.

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

28 минут назад, Юрий_Нд сказал:

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

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

Мудрость приходит вместе с импотенцией...

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

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

36 минут назад, andrusha152 сказал:

Вы не правильно понимаете, для чего существуют форумы.

Прошу прощения что неправильно выразился. 
Полностью могу подписаться под теми словами, в которых Вы говорите, для чего существуют форумы.

Постараюсь впредь более корректно выражаться.
-------------------------------------------------------------------------------------------------------------------------------------------------

33 минуты назад, Starichok сказал:

"ардуинщики" ... пользуются библиотеками.

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

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

в даташитах на дисплеи.

Мудрость приходит вместе с импотенцией...

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

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

2 часа назад, Starichok сказал:

в даташитах на дисплеи.

Это понятно, но я имел в виду исключительно наш форум.
 Есть ли здесь где-то место, где исключительно обсуждаются вопросы создание библиотек для дисплеев?

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

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

 Доброй ночи Всем.
 Подскажите пожалуйста, почему в примере урока всё работает только с одной библиотекой, а мне необходимо подключать две библиотеки?
 И почему так сильно "забита" память, в отличие от примера?
Часто нажимал клавишу "Сохранить всё".
Может, поэтому память "забита"?
Но это рекомендовал автор, я так понял.
Спасибо ____________ Юрий.

п.с. undefined reference to "Lcd_init()"

1 - Обменник - 96.png

1 - Обменник - 95.png

1 - Обменник - 94.png

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

Как было-бы круто, если бы руководители нанимающие специалистов по электронике, вот таким вот образом пытались сделать что-то сами, а потом поняв, как это непросто, решали - "А, к чёрту, пойду в проститутки найму нормального специалиста и буду платить ему нормальные деньги".
Но нет. Практика показывает, что эти граждане считают что там всё просто. Взял буратину, накачал скетчей и вуаля - всё работает!

P.S. если что - у меня нормальный работодатель, понимающий.

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

3 часа назад, Юрий_Нд сказал:

Интересно, а Вы лично себя к какой группе специалистов причисляете?

А вам зачем? Нанять хотите? Не хватит денег.

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • ИМХО, только с24, с25, с12 имеет смысл проверить/заменить.
    • Я сам найду, вы мне название напишите пожалуйста.
    • Добрый вечер..)) Нет в моем случае лучше найти готовый для моего Цифровой осциллограф Instrustar ISDS205A 2 канала х 20 МГц..
    • А как же вы квазар спаяли? Или ЛУТом не владеете? Можно даже маркером все прорисовать. А за осцил боятся не стоит, ему на вход будет приходить допустимое напряжение (указано в хар-ках осциллографа).
    • Релюхи не причём. При неисправности релюх симптомы были бы другие. И ИБП даже не клацает когда переходит в  "аварию".   Да. Аккум новый. Более того - 2 новых пробовал. И без АКБ тоже. Не влияет. Да мелкие особо не вздуваются ж. Хотя С21 под подозрением..   Спасибо. Буду иметь ввиду.
    • #include <Wire.h> #include <Oregon_TM.h> #include <BME280I2C.h> //////////////////////////////////////////////////////////////////////////////////////////////////////////// //Скетч для устройства, передающего данные датчика BME280 в формате Oregon Scientific THGN132N //Принципиальная схема прилагается. //Для работы необходима библиотека https://github.com/finitespace/BME280/ //Устройство работает от 3-ех пальчиковых батареек, для экономии электричества заливать скетч нужно через ISP //////////////////////////////////////////////////////////////////////////////////////////////////////////// //Также возможна передача данных в формате - THP (температура, влажность, давление, напряжение батареи) //Пример с приёмником поддерживает расшифоовку THP //////////////////////////////////////////////////////////////////////////////////////////////////////////// # define THGN_SEND 1 // Передавать ли данные в формате THGN132 # define THP_SEND 0 // Передавать ли данные в формате THP # define DEVICE_LOG 1 //Писать ли лог В Serial # define DONE_PIN 15 // вывод сигнала об окончании работы на таймер # define BME_WAIT 10 // Сколько мс ожидать датчик BME # define BATTERY_THR 3.5 // Порог напряжения для выставляения флага разряда батарейки (THGN) ///////////////////////////////////////////////////////////////////////////////////////////////// //Ниблы датчика THP //Во всех полях младшие ниблы идут вперёд!!! // 1-2 - тип (55) // 3 - канал (0-7) // 4-6 - (температура от -100С) * 10. Т.е. +25.1С = 1251 = 4E3h // 7-9 - Влажность *10 Т.е. 25.1% = 251 = 0FBh // 10-12 - (давление от 500ммртст) * 10. Т.е. 765мм = 2650 = A5Ah // 13-15 - данные с АЦП (A0) // 16-17 - CheckSUM // 18-19 - CRC8 (poly 0x07 start 0x00) ///////////////////////////////////////////////////////////////////////////////////////////////// Oregon_TM transmitter(4); BME280I2C bme; bool bme_present = false; float bme_temp(NAN), bme_hum(NAN), bme_pres(NAN); ///////////////////////////////////////////////////////////////////////////////////////////////// void setup() { digitalWrite(DONE_PIN, LOW); pinMode(DONE_PIN, OUTPUT); #ifdef DEVICE_LOG Serial.begin(115200); Serial.println("Waiting for BMEsensor..."); #endif //Обмен данными с BME////////////////////////////////// Wire.begin(); while(!bme.begin()) { if (millis() > BME_WAIT) break; } if (!bme.begin()) { #ifdef DEVICE_LOG Serial.println("No BME sensor found"); #endif bme_present = false; } else { switch(bme.chipModel()) { case BME280::ChipModel_BME280: bme_present = true; bme.read(bme_pres, bme_temp, bme_hum); #ifdef DEVICE_LOG Serial.println("Found BME280 sensor! Success."); Serial.print("Temperature = "); Serial.print(bme_temp, 1); Serial.println("C"); Serial.print("Humidity = "); Serial.print(bme_hum, 1); Serial.println("%"); Serial.print("Pressure = "); Serial.print(bme_pres * 0.75, 1); Serial.println("mmHg"); #endif break; default: #ifdef DEVICE_LOG Serial.println("Found UNKNOWN sensor! Error!"); #endif bme_present = false; } } //Напряжения батареи/////////////////////////////////////////// word battvotage = (word)(((float)(1.1 * 16368) / Vbg()) * 100); #ifdef DEVICE_LOG Serial.print("Battery voltage = "); Serial.println(battvotage,HEX); #endif //Подготовка и отправка данных THGN////////////////////////////////////// transmitter.protocol == 2; if (THGN_SEND) { transmitter.setType(THGN132); transmitter.setChannel(3); transmitter.setBatteryFlag(battvotage < BATTERY_THR); if (bme_present) { if (bme_hum > 98) bme_hum = 98; if (bme_hum < 2) bme_hum = 2; if (bme_temp > 70) bme_temp = 70; if (bme_temp < -50) bme_temp = -50; transmitter.setTemperature(bme_temp); transmitter.setHumidity(bme_hum); transmitter.setComfort(bme_temp, bme_hum); } else { transmitter.setTemperature(-49.9); transmitter.setHumidity(2); transmitter.setComfort(-49.9, 2); } transmitter.SendPacket(); } // Если отправляются оба формата пакетов, межу ними надо выдержать паузу if (THP_SEND && THGN_SEND) delay(100); //Подготовка и отправка данных THP////////////////////////////////////// if (THP_SEND) { transmitter.setType(THP); transmitter.setChannelTHP(1); transmitter.setBatteryTHP( battvotage); if (bme_present) { transmitter.setTemperatureTHP(bme_temp); transmitter.setHumidityTHP(bme_hum); transmitter.setPressureTHP(bme_pres * 0.75); // перевод Pa в mmHg } else { transmitter.setErrorTHP(); } transmitter.SendPacket(); } #ifdef DEVICE_LOG Serial.println(); Serial.print(millis()); Serial.println("ms"); Serial.println(); #endif //Команда на отключение питания digitalWrite(DONE_PIN, HIGH); } ///////////////////////////////////////////////////////////////////////////////////////////////// void loop(){} ///////////////////////////////////////////////////////////////////////////////////////////////// int Vbg() { ADMUX = (1<<REFS0)|(0<<REFS1)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0); long buffersamp=0; for (int n=0x0; n<=0xff; n++ ) { ADCSRA = 0xc7; while (bit_is_set(ADCSRA,ADSC)); buffersamp += ADC; } buffersamp >>=4; //16368 full scale 14bit ADCSRA &= ~(1 << ADEN); // отключаем АЦП return buffersamp; } Вот код программы. Пробовал по разному и от 5в запитывал и всю систему от 3,3 в. Причем голая ардуинка с таймером работает в нормальном режиме некоторое время, но потом все равно слетает и начинает питать мк постоянно( Причем это происходит всегда через разный промежуток времени.
  • Похожий контент

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