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

Бегущая Строка На Avr - Помогите С Программой На Си


cucumber

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

спасибо, сейчас изучу.

поменял матрицу - глюк верхней строки исчез!

сделал вывод каждой новой строчки в каждом новом прерывании,

при паузе в программе (delay_ms(300)) - протеус показвает корректно, медленно, но корректно.

Паузу убрать - ничего не видно))

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

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

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

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

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

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

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

это все надо вкурить

а внесение пауз delay разве это хорошо? слышал, типа это неправильно, или здесь только так?

а void ISR(){ -- это запись не для CVAVR?

а static unsigned char str=0; - это чтобы переменная записалась во флэш память ?

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

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

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

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

Ну да, гнать 8 байт через все регистры, чтобы погасить столбцы - мазохизм :)

Подскажу идейку (на будущее) которой сам пользуюсь. Гнать ничего не надо. Достаточно сформировать импульс сброса и импульс записи в параллельные регистры. Вся линейка будет обнулена.

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

и здесь кажется 0x70:

PORTD &= ~0x07;

PORTD |= str&0x07;

и вот эту строчку нужно вынести из прерывания:

static unsigned char str=0;

я прав?

еще не очень понимаю что значит static

еще так и не попробовал этот вариант, но мне очень понравилось каким образом это описано, спасибо

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

и здесь кажется 0x70:

PORTD &= ~0x07;

PORTD |= str&0x07;

Нет, не правильно :)
и вот эту строчку нужно вынести из прерывания:

static unsigned char str=0;

я прав?

Не обязательно. Она статическая, а значит, её значение сохраняется до следующего входа в функцию. Т.е., область её видимости - локальная, а время жизни - глобальное.

а void ISR(){ -- это запись не для CVAVR?

а staticunsignedchar str=0; - это чтобы переменная записалась во флэш память ?

Не видел эти вопросы, Вы пост изменили после того, как я его прочитал.

ISR - это я условно обозначил обработчик прерывания от таймера. Он у Вас уже есть, просто нужно туда закинуть этот код (без ISR{} естественно) и всё.

Static - квалификатор для статической переменной. Он сохраняет жизнь переменной при выходе из функции.

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

привет всем, добрался до компа наконец. Попробовал ваш вариант,

если написать так

if(++str>=8) str=0;

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

В результате я str++ вынес в конец подпрограммы.

И результат могу увидеть только в пошаговой работе Протеуса, или если поставить

в программе delay_ms (200) то процесс отображения верен,

а если убрать все паузы то ничего не показывает - мигает что-то.

пришел пока к тому же.

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

Эта пауза нужна чтоб дать светодиодам набрать яркость. Но, чем больше пауза тем медленнее будут перебираться строки. В той теме что я давал ссылку это обсуждалось. И Геннадий ( пользователь форума ) посоветовал сделать все это дело с помощью таймера, и сделать так чтоб всё табло обновлялась с частотой 60 кадров в секунду. Геннадий мне скидывал пример как это будет работать, но он на ассемблере. Я повторил это на Си, но к сожалению этого проекта нет, жесткий диск накрылся. Ну и как мне советовали ребята, чтоб дать погореть светодиодам и при этом использовать минимальную задержку, нужно в регистры пропихивать данные не гася строку, потом гасим строку, защелкиваем данные для следующей строки и зажигаем эту самую строку. И того получается, пока данные пропихиваются, у вас светится строка, и на делеи требуется меньше времени. Ну лучше с помощью таймера.

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

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

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

вот что сейчас получается:

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
unsigned char digit; //для разрядов переменных
static unsigned char str = 0; // переменная для строк массива
// вывод информации в порты
if(str>=8) str=0;
for (digit = 0; digit < 8; digit++) //просматриваем разряды
{	
 if ((buffer[0][str] &(1 << digit )) !=0) //если разряд в переменной массива равен 1
 {
	 PORTC.0 = 1; // вывод значения 1 в DATA
	 delay_us(1); // топчемся на месте				
 }
 else
 {
	 PORTC.0 = 0; // вывод значения 0 в DATA
	 delay_us(1); // топчемся на месте
 }		
	 PORTC.1 = 1; // такт
	 delay_us(1); // топчемся на месте
	 PORTC.1 = 0; // такт
} //конец цикла digit "просмотра" битов
PORTD.3=0; // "E" дешифратора.
// передаем сигнал "защелкивания" регистра в STROB
PORTC.2 = 1; // такт
delay_us(1); // топчемся на месте
PORTC.2 = 0;
//--- включаем нужную строку ---							
PORTD &= ~0x07;
PORTD |= str&0x07;
//------------------------------
PORTD.3=1; // "E" дешифратора.
delay_ms(30); //даем СД разгореться
str++;//следующая строка
}

вот эта delay_ms(30) разве не может на первых порах служить той самой паузой?

только невозможно добиться верного отображения - пауза маленькая - все мигает, пауза большая - слишком медленно

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

Там вообще никаких пауз не должно быть.

Попробуйте в протеусе выкинуть транзисторы. Да и вообще, старайтесь как можно меньше в нём использовать аналоговую часть.

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

не, не показывает))

массив:

buffer [0][0] = 0b00011111;
buffer [0][1] = 0b00100001;  
buffer [0][2] = 0b00100001;
buffer [0][3] = 0b00100001;
buffer [0][4] = 0b00111111;
buffer [0][5] = 0b00100001;
buffer [0][6] = 0b00100001;
buffer [0][7] = 0b00100001;

если установить делитель на таймер то начинает мерцать и мигать в Протеусе, вообщем лажа

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

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

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

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

Странно... не должно быт такого. По коду, вроде, всё в порядке.

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

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

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

Ах да, по поводу динамической индикации в протеусе: лажа полная, не успевает протеус её отрабатывать, это факт

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

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

Ах да, по поводу динамической индикации в протеусе: лажа полная, не успевает протеус её отрабатывать, это факт

Вы хотите сказать, что можно собирать в железе?:)

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

Ну вы на макетке соберите хотябы, или на худой конец навесным монтажом, для проверки так сказать. А там видно будет. И вообще в железе удобнее отлаживаться, все косяки которые протеус не показывает, сразу всплывут.

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

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

Не, по 1 микросекунде надо оставить, микросхемы тоже не сверхзвуковые :)

Раза в два шустрее МК. => 30МГц при 5В.

Никаких микросекунд им не требуется. Проверено не на 1 тысяче штук. Сбоев не было.

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

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

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

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

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

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

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

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

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

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

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

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