Внимание! Перед тем как создавать тему на форуме, воспользуйтесь поиском! Пользователь создавший тему, которая уже была, будет немедленно забанен! Читайте правила названия тем. Пользователи создавшие тему с непонятными заголовками, к примеру: "Помогите, Схема, Резистор, Хелп и т.п." также будут заблокированны навсегда. Пользователь создавший тему не по разделу форума будет немедленно забанен! Уважайте форум, и вас также будут уважать!
Возможно кому то будет интересно... МК atmega8,индикация на 4-х разрядном семисегментном индикаторе ОК Из органов управления только энкодер,перестройка по частоте только ручная,31 запоминаемый в еепром канал
набрали нужную частоту,нажимаем кнопку энкодера и удерживаем,через 3 сек частота запишется в еепром в канал 1 (на экране кратковременно загорится CH 1),снова выбираем частоту и снова сохраняем так же,всего сохраненных частот не более 31
если кратковременно нажимать кнопку энкодера то переключаемся по каналам,нажали-кратковременно светится номер канала (например СН 5),затем частота
если надо удалить частоту из памяти выбираем ее кратковременным нажатием энкодера,выключаем приемник,нажимаем кнопку энкодера и удерживая ее нажатой включаем приемник,на экране будет "- - - -",отпускаем кнопку энкодера,частота сотрется из памяти,если есть записанные частоты выше стертого канала то они перепишутся на канал ниже
фузы- HIGH=C9 LOV=C3 на плате и в схеме предусмотрены кнопки но они пока не задействованы,планируется переход на атмега88 и расширение функционала Жду предложения и замечания здесь
Из органов управления энкодер (скнопкой) и еще 2 кнопки (STEREO и BASS)
При первом включении частота 88,0 МГц,вращение энкодера=перестройка частоты с шагом 100 кгц
Короткое нажатие на кнопку энкодера-переходим в регулировку громкости,на экране ГР08(громкость=8)
Еще одно нажатие-переход обратно на перестройку по частоте
Кнопки-
1) кнопка BASS-короткое нажатие включение/выключение басов,длинное нажатие(более 2 сек)-переход из режима перестройки частоты в режим перестройки по каналам (если хоть одна частота записана в память),на экране CHAN,крутим энкодер-перестраиваемся по записанным в память каналам,короткое нажатие на энкодер-регулировка громкости,еще короткое нажатие на энкодер-обратно перестройка по каналам,короткое нажатие BASS=вкл/выкл басов,нажатие более 2 сек-переход из режима перестройки по каналам в режим перестройки по частоте
2) кнопка STEREO-короткое нажатие включение/выключение стерео,длинное нажатие(более 2 сек)-в зависимости от того в каком режиме (перестройка по частотам/по каналам) находимся-
если в режиме перестройки по частотам то запись частоты в память
если в режиме перестройки по каналам то стирание частоты из памяти
поддержка индикаторов с ОК и ОА,выбор -если PORTC.3 никуда не подключен то общий анод,если подключен к минусу то общий катод
Программа базовая,мк ATMEGA8 (HIGH FUSE= C9 LOW FUSE=83 ) Индикатор-любой с общим катодом или анодом Энкодер-с кнопкой любой,RDA5807M,Стаб 3,3 в-xc6206p332mr
Группа: Cоучастник
Сообщений: 1050
Пользователь №: 4008
Регистрация: 13-January 06
Место жительства: Москва
Может, подскажешь, есть сетка частот, как сделать, чтоб после выкл вкл включалось последняя станция? Сейчас все работает, но после выкл и вкл через раз возвращается последняя включенная станция.
while(1){ if (!ST_UP) {station++; if (station>11) {station=1;} set_station(station); _delay_ms(200);} if (!ST_DN) {station--; if (station<1) {station=11;} set_station(station); _delay_ms(200);} } } // end main
Группа: Cоучастник
Сообщений: 1050
Пользователь №: 4008
Регистрация: 13-January 06
Место жительства: Москва
последняя выбранная. Я еще добавил 1-а сегментный индикатор от 0 и до 9 соответственно 1-11канал. Включаю, ставлю 4канал все работает, принимает индикатор показывает 4 выключаю, включаю индикатор показывает 4 но приема нет (шипение) не та частота нажимаю 1 верх и 1 вниз все норм 4канал, просто не удобно так надо чтоб при выключение сохранялся канал, а не каждый раз щелкать вверх в низ по диапазону.
Еще, наверное, косяк я записываю так понял сразу по очереди все каналы при включение.
void set_station (uint8_t st) { if (st==1) {writeBuf[2] = 0b11101010; writeBuf[3] = 0b10110011;} if (st==2) {writeBuf[2] = 0b11101010; writeBuf[3] = 0b11110011;} if (st==3) {writeBuf[2] = 0b11101011; writeBuf[3] = 0b00110011;} if (st==4) {writeBuf[2] = 0b11101011; writeBuf[3] = 0b01110011;} if (st==5) {writeBuf[2] = 0b11101011; writeBuf[3] = 0b10110011;} if (st==6) {writeBuf[2] = 0b11101011; writeBuf[3] = 0b11110011;} if (st==7) {writeBuf[2] = 0b11101100; writeBuf[3] = 0b00110011;} if (st==8) {writeBuf[2] = 0b11101100; writeBuf[3] = 0b01110011;} if (st==9) {writeBuf[2] = 0b11101100; writeBuf[3] = 0b10110011;} if (st==10) {writeBuf[2] = 0b11101100; writeBuf[3] = 0b11110011;} if (st==11) {writeBuf[2] = 0b11101101; writeBuf[3] = 0b00110011;}
Группа: Cоучастник
Сообщений: 1050
Пользователь №: 4008
Регистрация: 13-January 06
Место жительства: Москва
QUOTE
Не всегда возвращается то, что было до выключения, так?
да все правильно чего то не хватает, вроде работает но криво.. Если выключить и подождать больше 3-4сек, то при включение встает не понятная частота, предполагаю либо первая или последняя, но если быстро выл-вкл то встает именно последняя включенная. А главное индикатор сохраняется по показанием четко...
Это сообщение отредактировал sonyyy - Jan 24 2018, 11:10 PM
Группа: Автор
Сообщений: 7625
Пользователь №: 35582
Регистрация: 3-August 08
Место жительства: Украина, Харьков
Трудно сказать, много уязвимых мест в коде, которые могут вызвать подобное поведение.
Полный код на текущий момент не помешает, крайне желательно zip архивом. Не понятно, в каком месте программы индикатор сохраняется. Может фигню на приемник кидает уже после того как вывелось на экран.
Это сообщение отредактировал vitalik_b - Jan 24 2018, 11:13 PM
Группа: Автор
Сообщений: 7625
Пользователь №: 35582
Регистрация: 3-August 08
Место жительства: Украина, Харьков
Кстати да, вроде и это тоже было. Не помню задержки, но 100 мс точно хватает, а так думаю и 10-20 мс вполне хватит.
Так же следует обращать внимание на правильное снятия и поднятие напряжений питания. Т.е. подниматься должно за время не более 10 мс, опускаться тоже, и обязательно до нуля. Обычно для этого ставят специальные discharge цепи, но для низкого бюджета хватит и резистора параллельно питанию 100 кОм - 1 МОм.
В основном даташите на RDA5807M не все данные отражены. Я кое что использовал из даташита на RDA5807HS. А процесс инициализации и программирования с необходимыми задержками (очень уж капризная в этом) описан в RAD5807P_ProgManual_1.0.
Группа: Cоучастник
Сообщений: 1050
Пользователь №: 4008
Регистрация: 13-January 06
Место жительства: Москва
по коду ругается на uint8_t TABLE__init[MAX_INIT_DATA] PROGMEM на uint8_t TABLE__channels[MAX_CHANNELS*2] PROGMEM = и на uint8_t TABLE__display[MAX_CHANNELS] PROGMEM = {
по питанию на шине еще унч стоит. да и касяк проявляется какраз если напряжение полностью уходит (конденсаторы по питанию) ноесть если выключить и подождать некое время 100% при повторном включение включится не то, в тоже время если быстро вкл вкл то норм. попробую задержку и резистор в питание...
Это сообщение отредактировал sonyyy - Jan 25 2018, 02:12 PM
Присоединённое изображение (Нажмите для увеличения)
Группа: Cоучастник
Сообщений: 1050
Пользователь №: 4008
Регистрация: 13-January 06
Место жительства: Москва
vitalik_b получилось, правда 1-й задержкой в 100мс не обошлось. вроде работает, правда долго включается ну и ладно. главное работает, огромное спосибище vitalik_b за 3 часа практически новый код написал я тот дня 4 ковырял
int main (void) { _delay_ms(400); PORTC = (1<<0)|(1<<1); DDRD = 0xFF; _delay_ms(200); for(uint8_t i = 0; i < MAX_INIT_DATA; i++) { _delay_ms(200); writeBuf[i] = pgm_read_byte(&TABLE__init[i]); } _delay_ms(200); uint8_t tmp = eeprom_read_byte(&station_ee); _delay_ms(200); if(tmp < MAX_CHANNELS) { station = tmp; set_station(station); }
я ж написал-включили,подождали 1 сек,потом инициализация RDA5807
тоже так нарвался,приемник включаю-на индикаторе последняя частота,а на деле не та частота,но если быстро выкл и вкл приемник то частота та которая должна быть,для эксперимента сделал в программе так-вкл приемник,инициализазия,потом считал с RDA все что можно,там такая белиберда была,начал делать задержку между вкл приемника и инициализацией RDA5807,при 700 мсек заработал как надо но время от времени опять вылезал этот косяк,сейчас 1 секунда и работает отлично! вкл/выкл приемника имеется ввиду именно питание
итоговая прошивка,вроде все поправил,проверял с индикаторами ОК,с индикаторами ОА испытывал ув vbrt с сайта схем.нет за что ему огромная благодарность прошивка энкодер реверс отличается тем что направление вращения энкодера изменено программно (вдруг энкодер при вращении по часовой уменьшает частоту или громкость,чтоб не перепаивать или резать дорожки прошивка с реверсом-не знаю как правильнее назвать ))) ) исходник в баском авр
Это сообщение отредактировал bulat - Jan 27 2018, 06:20 PM