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

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


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

Протеус точно версии 7.х? В версии 8.х библиотека дисплея работает неправильно. Кстати, админам стоило бы добавить это предупреждение в первый пост.

Протеус 7. Пытался вставить изображение в сообщении на сайте, не получилось. Экран с белыми точками, даже видна немного надпись демо версии. Через Алиэкспресс заказал 10 шт. дисплеев для эксперимента и поделок. Возможно получится на практике, когда известно, что не правильно работает в протеусе..

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

https://fotki.yandex.ru/next/users/an-s-1/album/527281/view/1475033

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

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

Судя по скриншоту, модель экрана работает. Когда не работает, он весь белый вроде, а у вас мусор виден.

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

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

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

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

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

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

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

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

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

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

Судя по скриншоту, модель экрана работает. Когда не работает, он весь белый вроде, а у вас мусор виден.

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

https://fotki.yandex...81/view/1475207

Вот получилось. В протеусе нажав на экран убрал лишние галочки и заново проверил как правильно вложил файлы в папки программы протеуса. Продолжаю дальнейшее изучение. Спасибо за ваше мнение.

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

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

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

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

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

Если присмотритесь, в протеусе эта надпись не привязана к пиксельной сетке дисплея. То есть в реальном устройстве она будет только если ее специально рисовать на дисплее краской.

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

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

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

Кто сделал домашние задание к уроку №6, можете выложить код в атмел студии? Для начинающего этого не сделать, зато можно проанализировать ход, что лучше будит понять....

За ранее спасибо.

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

Добрый вечер!

По проекту:

В библиотеке 5110.h прописана таблица символов.

Я бы хотел добавить символ градуса ° , но не знаю как?

Что значит (к примеру)- { 0x48, 0x54, 0x34, 0x14, 0x7C } // я 0xFF 255?

Кто силен подскажите, будьте добры.

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

_X__X___ | 0x48
_X_X_X__ | 0x54
__XX_X__ | 0x34
___X_X__ | 0x14
_XXXXX__ | 0x7C

подчеркивание - 0, крест - 1

как видно, это изображение буквы "Я", повернутой по часовой стрелке.

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

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

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

Добрый день! Подскажите, где здесь ошибка в этой программе? Вроде по уроку всё правильно повторил, но не могу скомпилировать .

//Atmega8a
//Укажем частоту
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
//Инициализируем библиотеку для работы с дисплеем
#include "n5110.h"
#include <stdlib.h>
//Предварительная настройка
void presets(){
//Инициализируем дисплей
Lcd_init();
//Настройка АЦП
//ADCSRA
ADCSRA |= (1<<ADEN) //Задействовать АЦП
| (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); //Делитель 128 = 64 кГц

//ADMUX
ADMUX |= (1<<REFS1)|(1<<REFS0); // Опорное напряжение внутрение 2.56 В внутрение

int readADC (unsigned int ch) {
unsigned char set_admux = ADMUX;
set_admux &= ~((0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0));
switch (ch)
{
 case 1: set_admux | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0);break;
 default:break;
}
ADMUX = set_admux;
_delay_us(10);
int tmp =0;
for (int i=0;i<<40;i++)
{
 ADCSRA |= (1<<ADSC); //Запуск преобразователя
while ((ADCSRA &(1<<ADSC))); //Ожидание окончания преобразования
tmp += ADC; //tmp = tap + ADC;
}
return tmp/40;
}
int main(void)
{
presets();
while(1)
{
 Lcd_clear();
 Lcd_printf(0,0, FONT_1X,((readADC(0)*2.56*(30/2.56))/1023), 1);
 Lcd_printf(0,1, FONT_1X,(readADC(1)*0.02935), 1);
 Lcd_update();
 _delay_ms(200);

}
}

Warning 2 'main' is normally a non-static function [-Wmain] Lessons7.c 41 5 Lessons7
Error 3 expected declaration or statement at end of input Lessons7.c 53 1 Lessons7
Warning 1 left shift count >= width of type [enabled by default] Lessons7.c 33 2 Lessons7

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

Форматирование ужасно.

Функция presets() не закрыта

case 1: set_admux | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0);break;

Что это должно делать? Чему присвоить результат этой логической операции?

for (int i=0;i<<40;i++)

Для чего здесь сдвиг аж на 40 бит?

В остальном (без подключения библиотеки, мне ее скачивать лень) все компилируется. Кстати, какую версию библиотеки используете?

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

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

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

Как понял, своими словами:

case 1: set_admux | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0);break;

Значение функции .... выбор лапки микроконтроллера

for (int i=0;i<<40;i++)

Цикл шагов..... Опрос, среднее арифметическое, после выводится значение на экран.

Вставил скобочку строка 10- 20, фигурную. Заработало, но всё равно показывает

 Warning 

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

Протеус у меня 7.10 , библиотека автора видеороликов. (скачал из сообщение №3,LCD_5110.zip)

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

set_admux | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0);

Это выражение возвращает результат логического ИЛИ всех аргументов. Проблема в том, что вы этот результат выбрасываете, а не присваиваете никакой переменной.

for (int i=0;i<<40;i++)

Среднее арифметическое по 1 точке?! Потому что 0 сдвинутый на 40 бит влево остается нулем и приводит к выходу из цикла. Возможно, стоит все-таки заменить сдвиг ( << ) на сравнение ( < ).

Вообще, пытаться с ходу написать рабочую программу большого объема - гиблое дело. Даже профессиональный программист может опечататься, а компилятор будет указывать куда угодно, но не туда куда надо. Предположим, у вас уже есть наработка (вывод текста на экран, например), которая 100% работает. По одному добавляйте к ней новый функционал, не забывая комментировать что и как он делает. Это нужно не столько для нас, сколько для вас самих. Особенно надо документировать описание функций, входные и выходные параметры, например:

/* Функция чтения аналогового сигнала с АЦП
  Входные параметры:
  channel - номер канала (0 - 6), правильность не проверяется
  align - выравнивание (0 - по младшему биту, 1 - по старшему), правильность проверяется
  aref_mask - опорное напряжение, задавать ТОЛЬКО через специальные константы, правильность не проверяется
  Выходное значение 
  результат преобразования (10 бит, либо 8 бит старшего разряда, в зависимости от align)
*/
unsigned int read_adc(char channel, char align, char aref_mask){
 if( align )ADMUX = aref_mask | channel | (1<<ADLAR);
   else ADMUX = aref_mask | channel;
 ADCSRA |= (1<<ADSC); //запуск преобразования
 while( !( ADSCRA & (1<<ADIF) ) ){} //ожидание завершения
 ADCSRA |= (1<<ADIF); //сброс флага прерывания перед следующим преобразованием
 return ADC;
}

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

Опорное напряжение задается битами 6 и 7, причем зависит от контроллера, так что стоит завести специальные константы

#define AREF_VCC (0<<REFS1 | 0<<REFS0) //напряжение AVCC
#define AREF_EXT (0<<REFS1 | 1<<REFS0) //внешний ИОН на выводе AREF
#define AREF_1_1 (1<<REFS1 | 0<<REFS0) //внутренний ИОН 1.1 В, не подключенный к AREF
#define AREF_1_1_EC (1<<REFS1 | 1<<REFS0) //внутренний ИОН 1.1 В, подключенный к внешнему конденсатору (external capacity) на выводе AREF

Наличие и отсутствие проверки говорит о том, проверяются ли данные на корректность. В данном случае, подача в качестве align любого значение будет обработана правильно, а во если подать в качестве channel значения 0xFF, результат может быть неправильным, так как залезет в области опорного напряжения и выравнивания. Это можно было бы исправить, добавив в начало процедуры channel &= 0b00001111. Но это немного замедлит процедуру. Именно в данном случае разница невелика, но для более сложных проверок может быть существенно.

Комментировать заполнение ADMUX в коде я не стал - добавить там комментарием нечего, а бесполезный комментарий хуже никакого. Окончание преобразования можно следить по ADSC, а можно, как я, по ADIF. В данном случае разницы особой нет, мне просто так привычнее. Еще рекомендую обратить внимание на форматирование - одинаковые отступы (в моем случае два пробела, но можно 2-4 пробела либо табуляцию, на любителя) внутри всего блока. Если бы внутри был еще блок - отступ внутри него увеличился бы. Ну и использование двух фигурных скобок вместо кустого оператора в дикле ожидания - такую конструкцию пропустить сложнее.

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

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

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

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

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

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

Ну что ж показывайте что сделали чтобы решить эту задачку. Не представляю где там можно застрять, но всякое бывает. Блок-схема или хотя бы псевдокод есть?

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

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

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

 for (int i=0;i<40;i++) 

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

Пытался что то изменить в коде

case 1:  set_admux | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0);break; 
default:break;

Чтоб работали две лапки, не получилось у меня.

На что нужно обратить внимание на исправления кода?

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

На то что делать с полученным значением. Например, можно

char any_var = set_admux | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0);

или

set_admux |= (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0);

смотря чего вы хотите добиться.

Попробуйте все-таки разобраться с основами языка Си, это не так сложно как кажется. Можете почитать Кернигана и Ричи, например.

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

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

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

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

Спасибо за книгу, давно искал типа такой книги. Начну читать постепенно.

//Atmega8a
//Укажем частоту
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
//Инициализируем библиотеку для работы с дисплеем
#include "n5110.h"
#include <stdlib.h>
//Предварительная настройка
void presets()
{
//Инициализируем дисплей
Lcd_init();
//Настройка АЦП
//ADCSRA
ADCSRA |= (1<<ADEN) //Задействовать АЦП
| (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); //Делитель 128 = 64 кГц
//ADMUX
ADMUX |= (1<<REFS1)|(1<<REFS0); // Опорное напряжение внутрение 2.56 В внутрение
}
int readADC (unsigned int ch) {
 unsigned char set_admux = ADMUX;
 set_admux &= ~((1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0));
 switch (ch)
 {
 case 1:  set_admux | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0);break;
 case 2:  set_admux | (0<<MUX3) | (0<<MUX2) | (1<<MUX1) | (0<<MUX0);break;
 default:break;
 }
 ADMUX = set_admux;
 _delay_us(10);
 int tmp = 0;
 for (int i=0;i<40;i++)
 {
  ADCSRA |= (1<<ADSC); //Запуск преобразователя
  while ((ADCSRA &(1<<ADSC))); //Ожидание окончания преобразования
  tmp += ADC; //tmp = tap + ADC;
 }
 return tmp/40;
}
int main(void)
{
 presets();
 while(1)
 {
  Lcd_clear();
  Lcd_printf(0,0, FONT_1X,((readADC(0)*2.56*(30/2.56))/1023), 1);
  Lcd_printf(0,1, FONT_1X,(readADC(1)*0.02935), 1);
  Lcd_update();
  _delay_ms(200);

 }
}

Всё равно второй вольтметр не работает. Не знаю в чём дело.

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

Попробуйте все-таки воспользоваться моим советом по поводу присвоения результата логической операции переменной set_admux:

set_admux |= (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0);

либо, что тоже самое,

set_admux = set_admux | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0);

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

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

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

Попробуйте все-таки воспользоваться моим советом по поводу присвоения результата логической операции переменной set_admux:

set_admux |= (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0);

либо, что тоже самое,

set_admux = set_admux | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0);

Спасибо, заработало! Знаю как ножки добавлять. Можно приступить к восьмому уроку.

Подскажите, какие ещё можно почитать книги понятные?

А про дисплеи почитать?

За ранее спасибо!

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

:lol2: опять началось..... из разряда чукча писатель, не читатель. в трех постах обьяснения, а он их даже не читает)))

книжки читайте любые, но если их просто читать они вам врятли помогут. это тоже самое что и set_admux

а про дисплеи читайте даташиты на эти дисплеи

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

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

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

Причём тут помогут или нет, когда на практике не применять? Моё хобби и работа пересекается с контроллерами, приходится вникать и понимать.

Viktor26, интересно, когда вы начали изучать ...., вы были из разряда чукча? а сейчас кем себя считаете?

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

Всем привет!

Возник вопрос: а можно ли перенести данные из SRAM во FLASH память , чтобы программа влезла в mega8535.

Просто у меня их 2 штуки хотел бы использовать. В инете читал про PROGMEM. Так же смотрел библиотечный файл n5110.h, где собственно массив символов и упакован во FLASH. Но дальше ступор.

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

post-201655-0-05231000-1467561534_thumb.jpg

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

Библиотека построена так чтобы хранить весь видеобуфер. Все 84х48 точек, то есть 504 байта. Поскольку эти данные должны меняться часто, выносить их в EEPROM или flash нельзя.

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

Ну либо использовать костыль - уменьшить рабочую область и тем самым объем буфера.

Удачи.

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

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

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

Уважаемый COKPOWEHEU Спасибо Вам за участие.

Вот, так я ввел символ в библиотеку n5110.h , как на рисунке, сохранил.

В таблице символов Windows - код 0xB0.

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

Буду рад Вашей помощи.

Спасибо

post-201655-0-71709400-1467576800_thumb.png

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

COKPOWEHEU

[Ну либо использовать костыль - уменьшить рабочую область и тем самым объем буфера.]

________

Правильно ли я понял? - нашел строку

// Размер кэша ( 84 * 48 ) / 8 = 504 байта

#define LCD_CACHE_SIZE ( ( LCD_X_RES * LCD_Y_RES ) / 8 )[code]

Если уменьшить шрифт FONT_1X,то можно срезать поля, которые не используются.

Но как это выполнить в коде, к сожалению не знаю. Посмотрел функции где используется этот макрос. Был бы рад объяснению.

Спасибо.

____

Вот нашел код

// Разрешение дисплея в пикселях#define LCD_X_RES 84 // разрешение по горизонтали#define LCD_Y_RES 48 // разрешение по вертикалиДумаю что здесь

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

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

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

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

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

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

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

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

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

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

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

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