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

Вежливая подсветка на AtTiny25


-=FISHER=-

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

12.02.2020 в 17:47, snn_krs сказал:

У вас похоже неправильно прерывание объявлено

Изменил, результата нет...

Потому что это одно и то же...

1768761657_.JPG.1e401e46154e8678386d04c59fd15ed3.JPG

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

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

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

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

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

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

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

28 минут назад, -=FISHER=- сказал:

А вот в такой связке не работает,

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

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

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

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

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

12.02.2020 в 18:17, ruhi сказал:

если убрать SEI - общее разрешение прерываний - тоже будет работать?

Да, так работает. Что теперь можно проверить?

12.02.2020 в 18:09, snn_krs сказал:

Для Тини13 вектор прерывания по таймеру 0 не 5 а 3.

Да 13. Я не уверен что означает цифра 5 в библиотеки Atmel Studio.

502581043_.JPG.b9df72fc86c1a9a91d66104904313da8.JPG

Дошло... В проекте не изменил контроллер (остался старый Attiny25)........................................ Вопрос закрыт. Всем спасибо!!!

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

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

@Yurkin2015 Добрый день! Я всё же немного переделал схему, добавив стабилизатор 78L05, отладил прошивку на отладочной плате, собрал всё в железе и в целом, всё работает как надо. Кроме одного странного момента, когда на схему подан постоянный плюс, минус и зажигание, то контроллер включается, хотя такого быть по задумке не должно, подскажите пожалуйста, где я ошибся? То есть на истоке Q3 присутствует 2,5 В, а на выходе 78L05 3,5 В

893920233_.JPG.dfc5a549f7d0234f96b896adaf29ab34.JPG

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

Я извиняюсь, что вклиниваюсь, не изучив все предыдущие посты... Но вы учитываете тот факт, что через R4 микроконтроллер запитывается сам и по цепи VCC запитывает остальную часть схемы? Может, те самые 3,5 вольта на выходе 78L05 на самом деле появляются не с её выхода, а "из 8-й ноги микроконтроллера"?

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

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

2 минуты назад, ARV сказал:

Может, те самые 3,5 вольта на выходе 78L05 на самом деле появляются не с её выхода, а "из 8-й ноги микроконтроллера"?

Может быть, а какое на Ваш взгляд есть решение?...

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

Решение? Исключать возможность запитки схемы сигналами управления. Иначе говоря, ставьте оптроны на сигнальные цепи.

Кстати, проверить мою версию достаточно просто: принудительно заресеттьте микроконтроллер (чтобы гарантировать отсутствие его влияния) и посмотрите, как будет меняться напряжение на его 8 ноге при подаче и отключении сигнала IGN.

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

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

11 минут назад, ARV сказал:

Решение?

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

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

3 hours ago, -=FISHER=- said:

и зажигание, то контроллер включается

Это было уже, раньше обсуждали в другой теме. Питание процессора происходит через резистор R4 1кОм. Увеличьте R4 до 100кОм или больше.

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

1 час назад, Yurkin2015 сказал:

Это было уже

Да, Вы правы с этим разобрался изменив прошивку. Но теперь возникла в принципе типичная проблема при использовании "прямого" ШИМ. Когда значение переменной ocr равно 0, высокий уровень всё равно подается совсем на короткое время на ножку которая управляет транзистором, и тот из-за этого не может до конца закрыться и как следствие, светодиоды в нагрузке еле-еле святятся. Подскажите пожалуйста, как организовать инверсный ШИМ на основе вот этого прямого.

//****************МАКРОСЫ ДЛЯ ПРОГРАММНОГО ШИМ*********************************
#define PWM_PORT PORTB //PORT на котором расположен ШИМ
#define PWM_DDR DDRB //DDR на котором расположен пин ШИМ
#define PWM_PIN 0 //номер пина на который будет выводиться программный ШИМ

//****************ПЕРЕМЕННЫЕ ДЛЯ ПРОГРАММНОГО ШИМ******************************
uint8_t counter;
uint8_t ocr;
uint8_t buf_ocr;

void soft_pwm_ini(void)
{
	PWM_DDR|=(1<<PWM_PIN); //настраиваем порт ШИМ на выход
}

void PWM(void)
{
	if (++counter==0) //счетчик перехода таймера через ноль
	{
		buf_ocr=ocr; //значения длительности ШИМ
		PWM_PORT |=(1<<PWM_PIN); //подаем 1 на канал
	}
	if (counter==buf_ocr) PWM_PORT&=~(1<<PWM_PIN);  //подаем 0 на канал
}

P.S. Я пробовал просто поменять местами строчки подачи 1 и 0 на ножку, но это не помогло.

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

4 hours ago, Yurkin2015 said:

Питание процессора происходит через резистор R4 1кОм

 

2 hours ago, -=FISHER=- said:

с этим разобрался изменив прошивку.

Ну, это очень круто!

 

2 hours ago, -=FISHER=- said:

высокий уровень всё равно подается совсем на короткое время

Меняем условия местами и добавляем else, например, вот так:

void PWM(void)
{
 buf_ocr=ocr; //значения длительности ШИМ
 if (++counter==buf_ocr) 
 {
     PWM_PORT&=~(1<<PWM_PIN);  //подаем 0 на канал    
 }
 else
 if (counter==0) //счетчик перехода таймера через ноль
 {
     PWM_PORT |=(1<<PWM_PIN); //подаем 1 на канал
 }  
}
Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Yurkin2015 сказал:

Ну, это очень круто!

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

1 час назад, Yurkin2015 сказал:

Меняем условия местами и добавляем else, например, вот так:

Таким образом, 254 - минимальная скважность, а 0 - максимальная, правильно?

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

18 minutes ago, -=FISHER=- said:

минимальная скважность,

При ocr=0 на выходе всегда 0, лампочки не горят.

При ocr=255 на выходе практически всегда единица, лампочки горят в полный накал.

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

4 часа назад, Yurkin2015 сказал:

if (++counter==buf_ocr)

Меня до сих пор сбивает вот эта строчка, как ее правильно читать? Что-то вроде: сначала проверяем условие и после проверки инкрементируем переменную counter?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

1 hour ago, -=FISHER=- said:

как ее правильно читать?

Сначала инкрементируем, потом используем полученное значение.

Можно проще записать, будет то же самое.

counter++;
if (counter==buf_ocr)
{
   ....
}

 

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

11 часов назад, Yurkin2015 сказал:

Сначала инкрементируем, потом используем полученное значение.

Но ведь тогда переменная counter при первом входе в условие будет равна 1 и далее эта переменная будет принимать по кругу такие значения: 1,2,3,4,5...253,254,0,1,2,3... Так?

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

if (counter >= buf_ocr)
{ 
PWM_PORT&=~(1<<PWM_PIN);  //подаем 0 на канал     
}

Ещё одна поправка в код. Для выключения выхода лучше проверять на больше или равно.

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

1 минуту назад, Yurkin2015 сказал:

Ещё одна поправка в код.

Поправил, тестируем

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

@Yurkin2015 Добрый день! Собрал в железе, всё работает! Уже поставил на машину, катаюсь - радуюсь. Спасибо ещё раз большое за подсказки!

В общем я разгадал тайный смысл выхода KEY на плате плафона освещения. Этот вывод является минусом для подсветки замка зажигания. И по задумке инженеров GM замок зажигания подсвечивается синхронно центральному плафону. Я решил чтобы всё было ещё ближе к изначальной задумке, задействовать и этот вывод. Могу ли я подключить ещё один полевой транзистор параллельно биполярному на штатной плате? Будет ли таким образом один канал ШИМ открывать и закрывать сразу два транзистора разной структуры, подскажите пожалуйста?

 

Скрытый текст

765663658_.thumb.jpg.dc6e7ec62410bb1dca92fde04bc53405.jpg

 

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Автору. Никаких тут 250...200 ватт у этой китайской бздюшки нет в помине. Тем паче на таком подобии радиатора Катушки даже на выходе нет-плохо  
    • Повторюсь - НЕТ, так как у вас там крутилки, что приведет к искажениям при работе в мостовой схеме. Если бы вы "могли" то вам нужно было разорвать выход с темброблока и вход усилителей и впаять (можно навесом) вот такую схему:
    • Все верно, вы почти все что нужно сделали.  Только не нужно было добавлять это b=UDR; Сразу после старта сбросить флаг flags = 0; А в основном цикле ждать установки флага FLAG_END_RX. И если он установлен, проверять на совпадение строки в буфере (rx_buf) с вашей строкой (AT+QM \ r \ n .....   .....  AT+MP \ r \ n) При совпадении вызывать выполнение нужного алгоритма.
    • У меня до саба ещё дело не дошло, только сейчас думаю купить амп на полкиловатта, но так можно, при условии, что на входе будет моно, и будет срез частот
    • Про флаг Т: если он не используется в основной программе, а у меня он постоянно в деле. для меня меня отложенная обработка прерывания обычное дело, нужно лишь правильно расставить приоритеты частей программы. И обычное дело: выставляешь частоту задающего генератора побольше, делишь его до получения частоты 1000 Гц каким либо таймером, загоняешь в прерывание с флагом. затем закольцовываешь основную программу с проверкой флага прерывания от таймера 1000Гц. загоняешь программу в Sleep. Получаешь кольцо обработки с образцовым интервалом в 1 мс. После любого прерывания проверяешь флаг от таймера, если он, то сбрасываешь флаг и начинаешь перебирать подпрограммы обработки индикаторов, клавиатуры, и тд. и тп, подпрограммы обработки флагов и др. После окончания обработки всех подпрограмм возвращаешься к Sleep. И так по кольцу. Если происходит прерывание не от таймера, программа выходит из Sleep, проверяется флаг от таймера, если не он (а это не он) обратно к Sleep. В большенстве программ использую этот алгоритм.   GPIOR1 и GPIOR2 в 88 условно можно использовать как флаги, но их адреса больше 0х1Е, на них не распространяются команды cbi, sbi, sbic, sbis, и их сначала нужно загрузить в общий регистр, промодифицировать, и заново сохранить. Эта последовательность длинная, и модифицирует SREG, что сводит на нет работу по сравнению с  классическим GPIOR.
    • @korsaj Сегодня попробовал сделать как ты посоветовал. Получился следующий код. #define F_CPU 7372800UL #define BAUND 9600L #define UBRRL_value (F_CPU/(BAUND*16))-1 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> void init_pin(void); #define C_PC0 (~PINC&(1<<PC0)) #define C_PC1 (~PINC&(1<<PC1)) #define LED_1_ON() PORTD|=(1<<PD2) #define LED_1_OFF() PORTD&=~(1<<PD2) #define LED_2_ON() PORTD|=(1<<PD3) #define LED_2_OFF() PORTD&=~(1<<PD3) #define FLAG_END_RX (1<<3) #define FLAG_ERR_RX (1<<4) #define BUF_SIZE 20 char rx_buf[BUF_SIZE]; char buf_index = 0; volatile start=1, flags; char b; ISR(USART_RXC_vect) { b=UDR; if(!(flags & FLAG_END_RX)) { rx_buf[buf_index]=UDR; if(rx_buf[buf_index] == 0x0D) { flags |= FLAG_END_RX; return; } buf_index++; if(buf_index >= BUF_SIZE) { buf_index = 0; flags |= FLAG_ERR_RX; } } } void init_UART() { UBRRL = UBRRL_value; UBRRH = UBRRL_value>>8; UCSRB|=(1<<TXEN); UCSRB|=(1<<RXEN); UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)); UCSRB|=(1<<RXCIE); sei(); flags = 0; } void send_UART(char value) { while(!(UCSRA&(1<<UDRE))); UDR=value; } int main(void) { init_pin(); init_UART(); while(1) { if (start==1) { _delay_ms(500); send_UART('O'); send_UART('K'); send_UART('!'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); start=0; } if (b == '0') { LED_1_ON(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '1') { LED_1_OFF(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '2') { LED_1_ON(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('2'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '3') { LED_1_OFF(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('3'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (C_PC0) { send_UART('P'); send_UART('C'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } if (C_PC1) { send_UART('P'); send_UART('C'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } } } void init_pin(void) { DDRC = 0b00000000; PORTC = 0b11111111; DDRD |= ((1<<2)|(1<<3)); PORTD &=~ ((1<<2)|(1<<3)); } Ну как сказать всё работает, но вот меня очень интересует приём команд на саму ATMEGA16. Он так и работает только с цифрами. Более ничего корректно принять не получается даже используя таблицу ascii. А мне нужно будет принимать команды и посложней чем просто буквенно - цифровые. Потому как возвращаясь к командам самого плеера там в этих командах хранятся различные данные. Вот примерно так это всё выглядит. AT+QM \ r \ n Запрос режима работы [0: Bluetooth], [1: MP3] AT+M1 \ r \ n Номер текущего файла AT+M2 \ r \ n Общее количество звуковых файлов AT+MD \ r \ n Источник музыки USB или SD Card AT+MT \ r \ n Общее время воспроизведения текущего файла AT+MK \ r \ n Время воспроизведения текущего файла AT+MP \ r \ n Текущее состояние плеера [0]Стоп, [1]Воспроизведение, [2]Пауза К примеру при отправке команды AT+M1 \ r \ n в ответ мы получим M1 + 000002 \ r \ n при этом здесь может быть любое число в hex формате. Мне же нужно каким то образом принять эти данные и обработать их соответствующим образом. Но при этом и нужно учитывать так же что плеер может сам отправить эти данные по началу воспроизведения трека. Вот в этом сейчас и стоит основная задача. Чего я и пытаюсь получить в итоге.
×
×
  • Создать...