|
ATmega16 + PT2322 + PT2323, Пишем программу в Code Vision AVR... |
|
|
|
Mar 4 2013, 21:59
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Здравствуйте я ученик, и ничего не понимаю в написание программы для ATmega16. Надеюсь здесь я найду людей которые мне смогут помочь. Суть такова у меня есть печатка приложил ниже. (уже сделана, распаяна) Помогите начать с нуля, написать прошивку. Сперва надо сказать то, что будет делать программа и собственно ATmega: -Управлять аудио процессорами по интерфейсу I 2C. (Аудио процессоры PT-2322 + PT2323) -Выводить состояние параметров и управления на LCD Winstar 16x2. -Сигнализировать свечением диодов о выбранных параметрах. -Управляться пультом по протоколу RC-5 -Управляться 5 кнопками (Sesect, 2.1, 5.1, AC-3, StandBy). C чего начать я даже и не знаю. Ниже приложил материалы которые у меня есть.(включая исходник готовой прошивки но с пультом в котором работают только три кнопки, нет регулировки тембром, и физических кнопок.
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
(1 - 83)
|
Mar 5 2013, 06:42
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Спасибо что отозвался помочь!!! Это не учебная задача, а проявление интереса и к тому же у меня акустика 5.1, это для нее! С выводом, текста и подключением библиотек понял, подключу и отпишусь.
|
|
|
|
|
Mar 5 2013, 17:19
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(kovigor @ Mar 5 2013, 11:23)  ОК, ждем-с  . См. мануал на CodeVision, там все достаточно подробно расписано ... Все получилось вот исходник, что дальше? опишем контакты на атмега?? как? Код /******************************************************************************** *************** Project : System Sound Version : 0.1beta Start Date : 5.03.2013 Complite Date : 5.03.2013 Author : Oberemok D.M. and kovigor Company : Home Comments: Пpoeкт шecтикaнaльнoгo peгyлятopa гpoмкocти и ceлeктopa вxoдoв нa микpocxeмax PT2322 и PT2323 Chip type : ATmega16 Program type : Application AVR Core Clock frequency: 8,000000 MHz ******************************************************************************** *****************/ #include <mega16.h> //библиотека для работы с ATmega16
#asm .equ __i2c_port=0x15;PORTC //указываем порт i2c .equ __sda_bit=1 //ножка SDA на 23 PIN PDIP .equ __scl_bit=0 //ножка SCL на 23 PIN PDIP .equ __lcd_port=0x1B;PORTA // Указываем расположение LCD #endasm #include <i2c.h> //Подключение библиотеки i2c #include <lcd.h> //Подключение библиотеки LCD #include <stdio.h> #include <delay.h> //Подключение библиотеки задержки
void main(void) { lcd_init(16); //Обнаружение LCD lcd_clear(); //Очистить LCD lcd_gotoxy(1,2); //указываю место последующего вывода текста lcd_putsf("Syetem Sound"); //выводим lcd_gotoxy(2,2); //указываю место последующего вывода текста lcd_putsf("Ver: 0.1Beta"); //выводим delay_ms(3000); //задержка 3сек } Кстати прикрепил датащиты процессоров
|
|
|
|
|
Mar 5 2013, 19:03
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Дмитрий(846) @ Mar 5 2013, 20:19)  Все получилось вот исходник, что дальше? опишем контакты на атмега?? как? Молодец, поздравляю ! Вы сгенерили проект, CV сгенерил вам шаблон Си - кода, из которого вы выкинули почти все и остаток привели здесь. Естественно, в том, что вы выкинули, эти самые контакты и описаны. Описания корректируются вами же, когда вы инструктируете CV, рассказывая ему, как генерить .c - шаблон. Я уже сегодня давал ссылку: http://atmel.moy.su/publ/1-1-0-3Разберитесь и действуйте. В аудиопроцессоры я вникать не буду. План работы примерно такой. Берете самую простую функцию оного аудиопроцессора, которую вам нужно реализовать у себя в системе, и реализуете. Например, попробуйте посредством программирования/настройки (или как там это называется) аудиопроцессора сгенерить на его выходе простую синусоиду ... P.S. попытайтесь разбить вашу задачу на маленькие кусочки, и реализуйте их, от самых простых к более сложным. Статья про RC5 вот (а вообще, их довольно много): http://www.platan.ru/shem/pdf/prim.pdfМожете пойти другим путем - для начала сделайте декодер RC5, а декодированные значения отображайте на индикаторе. Например, нажали "пятерку" на пульте, приняли ее в МК, декодировали и написали на индикаторе: "RC5 code received: '5' !". А потом займетесь аудиопроцессорами ...
|
|
|
|
|
Mar 5 2013, 19:55
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Ну а как реализовать пять кнопок??? на ноге 37?? кнопки последовательно соединены резисторами 4.7К Ом
|
|
|
|
|
Mar 5 2013, 22:27
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Вот, а вообще я ж печатку выложил
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 6 2013, 13:20
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
да это понятно, да там 4.7 кОм как в моем коде это отобразить
|
|
|
|
|
Mar 6 2013, 14:46
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Вообще ничего не понял.
|
|
|
|
|
Mar 6 2013, 14:53
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Дмитрий(846) @ Mar 6 2013, 18:46)  Вообще ничего не понял. Я говорю, внутри МК есть такой узел, как АЦП. Вот на его вход (pin 37) вам и нужно подать сигнал с делителя, образованного резисторами и кнопками, с целью измерения напряжения, приходящего от делителя. Понятно ? Вот книжки на русском: http://lord-n.narod.ru/download/books/wall.../atmelbook.djvuДальше вот сюда зайдите: http://lord-n.narod.ru/walla.htmlЕвстифеев "Микроконтроллеры AVR семейств Tiny и Mega фирмы Atmel" Трамперт "Измерение, управление и регулирование с помощью AVR микроконтроллеров" Думаю, пока хватит ...
|
|
|
|
|
Mar 6 2013, 19:42
|
Местный
  
Группа: Свой
Сообщений: 357
Регистрация: 6-01-07
Пользователь №: 24 139

|
Озвученная задача - не для того, кто "я ученик, и ничего не понимаю в написание программы для ATmega16". Вероятность что ничего не получится весьма высока.
Про аудиопроцессоры пока и не думайте. Если не в курсе что такое делитель напряжения, то туда пока нечего даже и заглядывать - все равно ничего не поймете.
В качестве совета - возьмите для начала задачу попроще и разберитесь с основами программирования МК.
Разбейте свою задачу на кусочки и понемногу с ними разбирайтесь, начиная с самого простого. По мере освоения простых вещей постепенно сможете осмысленно переходить к более сложным. С наскоку не получится.
Например: 1) Научиться вывести текст и значение переменной на ЖКИ, например, типа такого, "U=456", где 456 - не строка, а значение целочисленной переменной. 2) Научиться использовать АЦП и сделать простейший вольтметр, который может померить напряжение пальчиковой батарейки и вывести напряжение в кодах, полученных от АЦП на первой строке и пересчитанное в милливольты - во второй строке. 3) У Вас кнопки сделаны на основе резисторного делителя. Подключите их к входу, на котором измеряли напряжение в предыдущем варианте. Включите схему и понажимайте на кнопки - увидите, что каждой из них соответствует напряжение. 4) Сделайте программу распознавания какая кнопка нажата. Принцип простой - если напряжение меньше, чем U2, но больше чем U1, значит, нажата кнопка SB1. Для каждой из кнопок эти два напряжения будут своими.
Чтобы осмысленно понимать, что происходит при такой схеме подключения кнопок, надо разобраться что такое делитель напряжения.
А вообще, я посоветовал бы по началу не экономить на спичках и сделать обычное подключение кнопок - по одной на каждый вывод порта МК, для новичка это легче будет.
Если это проделаете, можно двигаться дальше.
|
|
|
|
|
Mar 8 2013, 15:39
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Код /******************************************************************************** *************** Project : System Sound Version : 0.1beta Start Date : 5.03.2013 Complite Date : 8.03.2013 Author : Oberemok D.M. and kovigor Company : Home Comments: Пpoeкт шecтикaнaльнoгo peгyлятopa гpoмкocти и ceлeктopa вxoдoв нa микpocxeмax PT2322 и PT2323 Chip type : ATmega16 Program type : Application AVR Core Clock frequency: 8,000000 MHz ******************************************************************************** *****************/ #include <mega16.h> //библиотека для работы с ATmega16 #include <i2c.h> //Подключение библиотеки i2c #include <lcd.h> //Подключение библиотеки LCD #include <stdio.h> #include <delay.h> //Подключение библиотеки задержки //программирование микроконтроллеров AVR на Си - осваиваем АЦП #include <ioavr.h> //для кнопок #include <intrinsics.h> //для кнопок
#asm .equ __lcd_port=0x1B;PORTA // Указываем расположение LCD .equ __i2c_port=0x15;PORTC //указываем порт i2c .equ __sda_bit=1 //ножка SDA на 23 PIN PDIP .equ __scl_bit=0 //ножка SCL на 23 PIN PDIP #endasm
//Физические кнопки #define KEY___Standby 1 #define KEY___SELECT 2 #define KEY___2_1 3 #define KEY___5_1 4 #define KEY___AC-3 5 // Для удобства пины ввода-вывода сопоставляем с символическими именами - куда что подключено по схеме
#asm("sei") // бесконечный цикл //макрос для запуска преобразования #define StartConvAdc() ADCSRA |= (1<<ADSC)
void skane_key(void) { //ион - напряжение питания, выравнивание влево, нулевой канал ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0); //вкл. ацп, режим одиночного преобр., разрешение прерывания,частота преобр. = FCPU/128 ADCSRA = (1<<ADEN)|(0<<ADSC)|(0<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
__enable_interrupt(); StartConvAdc(); while(1) { //какой-нибудь код } return 0; }
//обработчик прерывания АЦП #pragma vector=ADC_vect __interrupt void adc_my(void) { unsigned char AdcBuf = ADCH; //какой-нибудь код StartConvAdc(); }
void main(void) { lcd_init(16); PORTA=0x00; //Выставляем все выходы PORTA на ноль DDRA=0x00; //Выставляем все выходы PORTA как входы { lcd_init(16); //Обнаружение LCD lcd_clear(); //Очистить LCD lcd_gotoxy(0,0); //указываю место последующего вывода текста lcd_putsf("System Sound"); //выводим lcd_gotoxy(0,1); //указываю место последующего вывода текста lcd_putsf("Downloaded"); //выводим delay_ms(1500); //задержка lcd_clear(); //Очистить LCD
for (;;) { if(!PINA.3 > 0) //если кнопка нажата { lcd_clear(); //Очистить LCD lcd_gotoxy(0,0); //указываю место последующего вывода текста lcd_putsf("On"); //выводим } else { lcd_clear(); //Очистить LCD lcd_gotoxy(0,0); //указываю место последующего вывода текста lcd_putsf("Off"); //выводим } } } }//Main в чем проблема не компилирует ошибка Error: System Sound.c(103): no matching #endif
|
|
|
|
|
Mar 8 2013, 15:51
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Этот код вызывает сомнения, так как не находится внутри какой-либо функции(особенно #asm("sei")): Код /********************************************************************************
#include <mega16.h> //библиотека для работы с ATmega16 #include <i2c.h> //Подключение библиотеки i2c #include <lcd.h> //Подключение библиотеки LCD #include <stdio.h> #include <delay.h> //Подключение библиотеки задержки //программирование микроконтроллеров AVR на Си - осваиваем АЦП #include <ioavr.h> //для кнопок #include <intrinsics.h> //для кнопок
#asm .equ __lcd_port=0x1B;PORTA // Указываем расположение LCD .equ __i2c_port=0x15;PORTC //указываем порт i2c .equ __sda_bit=1 //ножка SDA на 23 PIN PDIP .equ __scl_bit=0 //ножка SCL на 23 PIN PDIP #endasm
//Физические кнопки #define KEY___Standby 1 #define KEY___SELECT 2 #define KEY___2_1 3 #define KEY___5_1 4 #define KEY___AC-3 5 // Для удобства пины ввода-вывода сопоставляем с символическими именами - куда что подключено по схеме
#asm("sei") // бесконечный цикл А этот обработчик не похож на Codevision-ский: Код #pragma vector=ADC_vect __interrupt void adc_my(void) Так в ИАР АВР пишут, но может что поменялось в CV?
|
|
|
|
|
Mar 8 2013, 16:24
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Код /******************************************************************************** *************** Project : System Sound Version : 0.1beta Start Date : 5.03.2013 Complite Date : 8.03.2013 Author : Oberemok D.M. and kovigor Company : Home Comments: Пpoeкт шecтикaнaльнoгo peгyлятopa гpoмкocти и ceлeктopa вxoдoв нa микpocxeмax PT2322 и PT2323 Chip type : ATmega16 Program type : Application AVR Core Clock frequency: 8,000000 MHz ******************************************************************************** *****************/ #include <mega16.h> //библиотека для работы с ATmega16 #include <i2c.h> //Подключение библиотеки i2c #include <lcd.h> //Подключение библиотеки LCD #include <stdio.h> #include <delay.h> //Подключение библиотеки задержки //программирование микроконтроллеров AVR на Си - осваиваем АЦП #include <ioavr.h> //для кнопок #include <intrinsics.h> //для кнопок
#asm .equ __lcd_port=0x1B;PORTA // Указываем расположение LCD .equ __i2c_port=0x15;PORTC //указываем порт i2c .equ __sda_bit=1 //ножка SDA на 23 PIN PDIP .equ __scl_bit=0 //ножка SCL на 23 PIN PDIP #endasm // Для удобства пины ввода-вывода сопоставляем с символическими именами - куда что подключено по схеме //макрос для запуска преобразования #define StartConvAdc() ADCSRA |= (1<<ADSC) //Физические кнопки #define KEY___Standby 0 #define KEY___SELECT 1 #define KEY___2_1 2 #define KEY___5_1 3 #define KEY___AC_3 4
//кнопочный буфер volatile unsigned char KeyBuf = 0;
void skane_key(void) { unsigned char tmp; //настраиваем порты DDRC = 0xff; PORTC = 0xff;
//инициализируем АЦП //ион - напряжение питания, выравнивание влево, нулевой канал ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0); //вкл. ацп, режим одиночного преобразования, разрешение прерывания, частота преобр. = FCPU/128 ADCSRA = (1<<ADEN)|(0<<ADSC)|(0<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
//разрешаем прерывания и запускаем преобразование __enable_interrupt(); StartConvAdc();
//основной цикл программы - опрос кнопочного буфера while(1) { tmp = KeyBuf; if (tmp) { tmp--; PORTC = ~(1<<tmp); } else PORTC = 0xff; } return 0; }
#pragma vector=ADC_vect __interrupt void adc_my(void) { //считываем старший регистр АЦП unsigned char AdcBuf = ADCH; //опеределяем в какой диапазон он попал if (AdcBuf > 240) KeyBuf = KEY___AC_3; else if (AdcBuf > 180) KeyBuf = KEY___SELECT; else if (AdcBuf > 120) KeyBuf = KEY___2_1; else if (AdcBuf > 50) KeyBuf = KEY___5_1; else KeyBuf = KEY___Standby; //защита от дребезга и не только. если нажата какая-нибудь кнопка //сравниваем совпадают ли текущее состояние и предыдущее //если совпадают - проверяем счетчик comp, если нет обнуляем его //кнопка считается нажатой если она удерживается в течении 100 //преобразований АЦП if (Key) { if (Key == LastState) { if (comp > 100) KeyBuf = Key; else comp++; } else { LastState = Key; comp = 0; } } else { comp = 0; KeyBuf = KEY___Standby; LastState = KEY___Standby; } //запускаем преобразование и выходим StartConvAdc(); }
void main(void) { lcd_init(16); PORTA=0x00; //Выставляем все выходы PORTA на ноль DDRA=0x00; //Выставляем все выходы PORTA как входы { lcd_init(16); //Обнаружение LCD lcd_clear(); //Очистить LCD lcd_gotoxy(0,0); //указываю место последующего вывода текста lcd_putsf("System Sound"); //выводим lcd_gotoxy(0,1); //указываю место последующего вывода текста lcd_putsf("Downloaded"); //выводим delay_ms(1500); //задержка lcd_clear(); //Очистить LCD
for (;;) { if(!PINA.3 > 0) //если кнопка нажата { lcd_clear(); //Очистить LCD lcd_gotoxy(0,0); //указываю место последующего вывода текста lcd_putsf("On"); //выводим } else { lcd_clear(); //Очистить LCD lcd_gotoxy(0,0); //указываю место последующего вывода текста lcd_putsf("Off"); //выводим } } } }//Main тоже самое
Сообщение отредактировал Дмитрий(846) - Mar 8 2013, 16:25
|
|
|
|
|
Mar 8 2013, 16:41
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Дмитрий(846) @ Mar 8 2013, 18:24)  тоже самое Возможно. Наверное потому, что всё это: Код #include <intrinsics.h> //для кнопок Код __enable_interrupt(); Код #pragma vector=ADC_vect __interrupt void adc_my(void) CodeVision-у не известно. Выкиньте эти строки из программы и тогда компилируйте. P.S. Посмотрел приложенный архив (файл intrinsics.h): Код This file declares the ARM intrinsic inline functions. Copyright 1999-2006 IAR Systems. All rights reserved. $Revision 34635 $
#ifndef __INTRINSICS_INCLUDED #define __INTRINSICS_INCLUDED
#include ycheck.h
#ifndef _SYSTEM_BUILD #pragma system_include #endif
Check that the correct C compiler is used.
#if ((__TID__ 8) & 0x007F) != 79 #error File intrinsics.h can only be used together with iccarm. #endif
#ifdef __cplusplus extern C { #endif
#pragma language=save #pragma language=extended
__intrinsic void __no_operation(void); Он у вас не только не той системы, но ещё и из другой оперы. И почему-то комментарии раскомментированы...
|
|
|
|
|
Mar 12 2013, 16:20
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Помогите поправить синтаксис. При выводе Volume на Максимум и Минимум, устройство ребутиться !
Сообщение отредактировал Дмитрий(846) - Mar 12 2013, 16:37
|
|
|
|
|
Mar 12 2013, 17:13
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Дмитрий(846) @ Mar 12 2013, 20:20)  Помогите поправить синтаксис. При выводе Volume на Максимум и Минимум, устройство ребутиться ! Мне сейчас некогда. А самому - никак ? Ребутится - значит, почти наверняка рушится стек. Или вы, например, где-то в программе создали массив на 10 элементов, а пишете в него не десять элементов, а больше, и этим разрушаете соседние переменные. P.S. Вообще, не обижайтесь, но я вам по-дружески очень советую с первых же шагов учиться работать самостоятельно, особенно при решении элементарных вопросов ... P.P.S. Лучшим отладчиком часто бывает обычный светодиод, ибо он позволяет довольно точно проследить ход выполнения программы ... Дополню. Еще вариант - вы что-то напутали с типами данных (по ошибке используете знаковый тип как беззнаковый, или наоборот, или же путаете восьмиразрядные данные с 16-разрядными) Дальше, по вашему исходнику. В блоке "switch" непременно должен быть "default", а не только "case 1,2,3 и проч.". Дальше. У вас из обработчиков прерываний вызывается функция " Set_Key", которая вызывает задержку на 300 мС !!!!! Это абсолютно недопустимо. Обработчики прерывания должны выполняться почти мгновенно. Разбираться с результатами работы обработчиков нужно в фоновом процессе, но никак не прямо в самих обработчиках. Конечно, из этого правила бывают исключения, но они только подтверждают правило ... Ладно, пока хватит. Устраните эти вопиющие недоработки, тогда посмотрим ...
|
|
|
|
|
Mar 12 2013, 19:03
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
За распознавание энкодера не понял зачем там default (все работает норм) Вот смотри. И вопросик правильно ли написал код выбора режима Код //Выбор режима роботы if(key == COMMAND_KEY_ok) { switch(mode) { case 1: // 2.1 mode i2c_start(); i2c_write(ADDR_2323); i2c_write(ACK); i2c_write(0xf5); // CE Выключен, включено Mute на канал // 0xf4 Включен i2c_write(0xf9); // RL Выключен, включено Mute на канал // 0xf8 Включен i2c_write(0xfb); // RR Выключен, включено Mute на канал // 0xfa Включен i2c_stop(); break; case 2: // 3.1 mode i2c_start(); i2c_write(ADDR_2323); i2c_write(ACK); i2c_write(0xf4); // CE Включен, выключено Mute на канал // 0xf5 Выключен i2c_write(0xf9); // RL Выключен, включено Mute на канал // 0xf8 Включен i2c_write(0xfb); // RR Выключен, включено Mute на канал // 0xfa Включен i2c_stop(); break; case 3: // 4.1 mode i2c_start(); i2c_write(ADDR_2323); i2c_write(ACK); i2c_write(0xf5); // CE Выключен, включено Mute на канал // 0xf4 Включен i2c_write(0xf8); // RL Включен, выключено Mute на канал // 0xf9 Выключен i2c_write(0xfa); // RR Включен, выключено Mute на канал // 0xfb Выключен i2c_stop(); break; default: // 5.1 mode i2c_start(); i2c_write(ADDR_2323); i2c_write(ACK); i2c_write(0xfe); // Включить все каналы i2c_stop(); break; } }
|
|
|
|
|
Mar 12 2013, 19:34
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Дмитрий(846) @ Mar 12 2013, 23:03)  За распознавание энкодера не понял зачем там default (все работает норм)
Вот смотри.
И вопросик правильно ли написал код выбора режима Мало ли что еще работает из того, что сделано неправильно ? Простите, но я не привык обращаться к незнакомым людям на "ты". Правильно ли, не знаю. Чтобы ответить, нужно вникать в код и алгоритм. А мне сейчас не до этого. Могу почти точно (99.9%) уже сейчас сказать, что у вас неправильно построен сам проект, ибо в правильно построенных проектах функции задержек на 300мС из обработчиков прерываний не вызываются, но такие задержки всегда делаются в фоновом процессе. Функции обмена по I2C также очень желательно никогда не вызывать из обработчиков прерываний, ибо продолжительность их выполнения труднопредсказуема ...
|
|
|
|
|
Mar 12 2013, 19:58
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(kovigor @ Mar 12 2013, 21:34)  Мало ли что еще работает из того, что сделано неправильно ?
Простите, но я не привык обращаться к незнакомым людям на "ты".
Правильно ли, не знаю. Чтобы ответить, нужно вникать в код и алгоритм. А мне сейчас не до этого. Могу почти точно (99.9%) уже сейчас сказать, что у вас неправильно построен сам проект, ибо в правильно построенных проектах функции задержек на 300мС из обработчиков прерываний не вызываются, но такие задержки всегда делаются в фоновом процессе. Функции обмена по I2C также очень желательно никогда не вызывать из обработчиков прерываний, ибо продолжительность их выполнения труднопредсказуема ... Все понял, покажите как организовать выбор default в той части кода?
|
|
|
|
|
Mar 12 2013, 20:14
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Спасибо реализовал break, а там посмотрим. Посмотрите внимательно код, есть еще пожелания. Подскажите расчетные данные для реализации кнопок через ацп на резитротах 4,7кОм !!! Код unsigned char read_key(void) { unsigned char key_adc; key_adc=read_adc(3); if (key_adc <= 3) return KEY_STANDBY; if ((key_adc >= 124) && (key_adc <= 130)) return KEY_STANDBY; //KEY_VOLUME_PLUS; if ((key_adc >= 167) && (key_adc <= 173)) return KEY_STANDBY; //KEY_VOLUME_MINUS; //167-173 = 1630 Om if ((key_adc >= 188) && (key_adc <= 194)) return KEY_STANDBY; //KEY_INPUT5_1; //167-173 = 3000 Om if ((key_adc >= 201) && (key_adc <= 207)) return KEY_STANDBY; //KEY_MUTE; }
Сообщение отредактировал Дмитрий(846) - Mar 12 2013, 20:15
|
|
|
|
|
Mar 12 2013, 20:27
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Дмитрий(846) @ Mar 13 2013, 00:14)  Спасибо реализовал break, а там посмотрим. Посмотрите внимательно код, есть еще пожелания.
Подскажите расчетные данные для реализации кнопок через ацп на резитротах 4,7кОм !!! Код гляну завтра, сегодня уже поздно. А значения вы и сами легко вычислите, исходя из того, что это простейший делитель напряжения, а также из закона Ома и того факта, что сопротивления резисторов задаются с допуском, например, в 10%. Да, если вы используете 8-разрядный АЦП, то макс. значение на его выходе будет равно 255, имейте это в виду. Задача, действительно, простейшая. Нарисуйте на листике делитель и сразу все поймете ...
|
|
|
|
|
Mar 12 2013, 20:31
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(kovigor @ Mar 12 2013, 22:27)  Код гляну завтра, сегодня уже поздно. А значения вы и сами легко вычислите, исходя из того, что это простейший делитель напряжения, а также из закона Ома и того факта, что сопротивления резисторов задаются с допуском, например, в 10%. Да, если вы используете 8-разрядный АЦП, то макс. значение на его выходе будет равно 255, имейте это в виду. Задача, действительно, простейшая. Нарисуйте на листике делитель и сразу все поймете ... Огромное спасибо, за помощь.
|
|
|
|
|
Mar 13 2013, 17:10
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
("state machine") - вообще не понимаю! Поправил, все компилируется.
|
|
|
|
|
Mar 13 2013, 17:29
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Дмитрий(846) @ Mar 13 2013, 20:10)  ("state machine") - вообще не понимаю! Так я же вам ссылки дал. Синонимы - "машина состояний", иногда говорят "цифровой автомат". ("state machine") - один из подходов к разработке ПО, в частности, для МК. Допустим, вы разрабатываете кодовый замок, у него есть 10 кнопок от 0 до 9 , и он должен открываться числом 729. (Возьмите бумажку, карандашик и рисуйте): В состояние С1 замок попадает после включения питания. В этом состоянии он ждет нажатия любой из кнопок. Если нажата только одна кнопка, и это "7", то замок переходит в состояние С2, во всех прочих случаях он остается в состоянии С1. В состоянии С2 замок опять ждет нажатия любой из кнопок. Если нажата только одна кнопка, и это "2", то замок переходит в состояние С3, во всех прочих случаях он переходит в состояние С1. В состоянии С3 замок опять ждет нажатия любой из кнопок. Если нажата только одна кнопка, и это "9", то замок переходит в состояние С4, во всех прочих случаях он переходит в состояние С1. В состоянии C4 замок открывается (втягивает защелку) и ждет три секунды, а затем отпускает защелку и переходит в состояние C5. В состоянии С5 замок ждет отпускания всех кнопок (остается в нем, если не все кнопки отпущены). Если же все кнопки отпущены, то замок переходит в состояние С1, после чего все повторяется сначала. Понятно ? Попробуйте сделать такой замок сами, только предусмотрите подавление дребезга от кнопок ... А, вот еще есть книжка Лобанова. Там не совсем про МК, но суть та же: http://lord-n.narod.ru/walla.htmlЛадно, пока Лобанова не читайте, а то запутаетесь ...
|
|
|
|
|
Mar 13 2013, 18:33
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Честно говоря я уже запутанный.
Я понял что ничего не получиться самостоятельно.
|
|
|
|
|
Mar 13 2013, 18:55
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Дмитрий(846) @ Mar 13 2013, 22:33)  Честно говоря я уже запутанный.
Я понял что ничего не получиться самостоятельно. Нет, наоборот, тут все просто, как песня. Вы просто сходу за слишком сложную задачу взялись. Начните с двух простых задач. Реализуйте в виде цифровых автоматов: -Светофор. Пусть он переключается в каждое следующее состояние по нажатию кнопки. Предусмотрите (обязательно) в том же автомате в виде доп. состояний механизм подавления дребезга -Кодовый замок. Блок-схему алгоритма я набросал выше, но это только набросок. Подойдите к нему творчески. В обоих случаях для отсчета временных интервалов пользуйтесь прерыванием от таймера P.S. А вообще, я вам указал на книги по программированию для МК. Читали ? Смотрели ? Ничего непостижимого там нет, программирование МК доступно даже старшеклассникам
|
|
|
|
|
Mar 13 2013, 19:17
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Но зачем? Ведь есть уже готовое, осталось только подкорректировать, не без вашего участия. Может давайте поможете мне разобрать код, дополнить его, оптимизировать его работу
Сообщение отредактировал Дмитрий(846) - Mar 13 2013, 21:20
|
|
|
|
|
Mar 13 2013, 22:52
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Дмитрий(846) @ Mar 13 2013, 23:17)  Но зачем? Да нет у меня времени разбираться в чужом коде, тем более, что этот проект - не самый простой проект на свете. В него нужно вникать, и вникать глубоко. Да и разбирательство это мне ни к чему, ничему новому я там не научусь. Ладно. Не хотите учиться - не нужно. Я умываю руки. Проект-то ваш. Вы сами не дотите ничего сделать cамостоятельно, чтобы он заработал, так я должен хотеть ? Вам говоришь, как надо, а вы "но зачем ? ...". Ну, тогда, если вы знаете лучше меня, сами и разбирайтесь ...
|
|
|
|
|
Mar 14 2013, 18:59
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(kovigor @ Mar 14 2013, 00:52)  Да нет у меня времени разбираться в чужом коде, тем более, что этот проект - не самый простой проект на свете. В него нужно вникать, и вникать глубоко. Да и разбирательство это мне ни к чему, ничему новому я там не научусь. Ладно. Не хотите учиться - не нужно. Я умываю руки. Проект-то ваш. Вы сами не дотите ничего сделать cамостоятельно, чтобы он заработал, так я должен хотеть ? Вам говоришь, как надо, а вы "но зачем ? ...". Ну, тогда, если вы знаете лучше меня, сами и разбирайтесь ... Помоги разобраться почему ребутиться!
|
|
|
|
|
Mar 15 2013, 17:19
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(XVR @ Mar 15 2013, 09:18)  Во первых маловат массив text (и пишут в него из прерывания и основной программы) Во вторых - у вас общение с LCD идет из прерываний и из основного цикла программы - на LCD будет каша С I2C то же самое
А ребутится может из за использования в прерываниях и основной программе всего, чего только можно. А так же из за использования функции sprintf - ей нужен довольно большой стек (насколько я помню) Ох? реально не учел текста + %Vol глюков стало меньше!
|
|
|
|
|
Mar 15 2013, 22:18
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Подскажите после нажатия кнопки на пульте Power, атмега перезагружается
|
|
|
|
|
Mar 18 2013, 14:19
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Подскажите значения, не могу рассчитать значения делителей.
if (key_adc <= 3) return KEY_ if ((key_adc >= 50) && (key_adc <= 108)) return KEY_ if ((key_adc >= 130) && (key_adc <= 178)) return KEY_ if ((key_adc >= 180) && (key_adc <= 198)) return KEY_ if ((key_adc >= 200) && (key_adc <= 248)) return KEY_ if ((key_adc >= 248) && (key_adc <= 255)) return KEY_
НА ноге атмеги с плюсом кинул 4,7 кОм а на кнопках последовательно кинул по 1кОм
|
|
|
|
|
Mar 18 2013, 21:18
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Спасибо за помощь
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 19 2013, 14:21
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 14-09-10
Из: Уфа
Пользователь №: 59 479

|
Как-то уж слишком мудрено у Вас... Предлагаю привести схему к виду, как в приложенном файле, тогда о уровнях напряжения на входе АЦП можно будет просто догадаться, не прибегая даже к закону имени Ома ))))
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 19 2013, 15:12
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(artkam @ Mar 19 2013, 16:21)  Как-то уж слишком мудрено у Вас... Предлагаю привести схему к виду, как в приложенном файле, тогда о уровнях напряжения на входе АЦП можно будет просто догадаться, не прибегая даже к закону имени Ома )))) НУ я замерял напряжение на своей схеме: 0,9 \ 1,52 \ 2,00 \ 2,35 \ 2,64 как в адц перевести??? Еще подскажите как организовать сдвиг бита для регулировки тона. Исходник привел ниже. Биты регулировки в коде Код 0b1001 G3 G2 G1 G0 Bass tone control 0b1010 K3 K2 K1 K0 Middle tone control 0b1011 H3 H2 H1 H0 Treble tone control
TONE CONTROL BITS G3/K3/H3 G2/K2/H2 G1/K1/H1 G0/K0/H0 Attenuation (dB) 0 0 0 0 -14 0 0 0 1 -12 0 0 1 0 -10 0 0 1 1 -8 0 1 0 0 -6 0 1 0 1 -4 0 1 1 0 -2 0 1 1 1 0 1 0 0 0 +14 1 0 0 1 +12 1 0 1 0 +10 1 0 1 1 +8 1 1 0 0 +6 1 1 0 1 +4 1 1 1 0 +2 1 1 1 1 0 Note: G=Bass, K=Middle, H=Treble
Сообщение отредактировал Дмитрий(846) - Mar 19 2013, 15:25
|
|
|
|
|
Mar 19 2013, 15:46
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Дмитрий(846) @ Mar 19 2013, 18:12)  НУ я замерял напряжение на своей схеме: 0,9 \ 1,52 \ 2,00 \ 2,35 \ 2,64 как в адц перевести??? Для этого придется-таки хоть чуть-чуть подумать и вспомнить пропорции, их учат примерно классе в четвертом. Если АЦП 10-разрядный, и на его вход подано его полное опорное напряжение, например, AVCC=5В (я не знаю, какое опорное напряжение вы выбрали для АЦП), то из его регистра будет считано число 1023. Числа для остальных напряжений рассчитайте сами.
|
|
|
|
|
Mar 19 2013, 17:41
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(kovigor @ Mar 19 2013, 17:46)  Для этого придется-таки хоть чуть-чуть подумать и вспомнить пропорции, их учат примерно классе в четвертом. Если АЦП 10-разрядный, и на его вход подано его полное опорное напряжение, например, AVCC=5В (я не знаю, какое опорное напряжение вы выбрали для АЦП), то из его регистра будет считано число 1023. Числа для остальных напряжений рассчитайте сами. Спасибо с кнопками разобрался, перепаял резистор на +5 на 10кОм, а не 4,7кОм. Все работает вот результат. Код unsigned char read_key(void) { unsigned char key_adc; key_adc=read_adc(3); //3 if (key_adc <= 3) return KEY_STANDBY; if ((key_adc >= 20) && (key_adc <= 60)) return KEY_MUTE; //45//100-148 = 1000 Om if ((key_adc >= 70) && (key_adc <= 85)) return KEY_INPUTAC3; //77//130-178 = 2000 Om if ((key_adc >= 90) && (key_adc <= 118)) return KEY_INPUT1; //102//180-198 = 3000 Om if ((key_adc >= 120) && (key_adc <= 144)) return KEY_MODE; //119//200-248 = 4000 Om if ((key_adc >= 150) && (key_adc <= 190)) return KEY_INDICATE_PLUS; //134//200-248 = 5000 Om } Теперь нужна помощь с регулировкой тона
|
|
|
|
|
Mar 19 2013, 18:05
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Дмитрий(846) @ Mar 19 2013, 21:41)  Теперь нужна помощь с регулировкой тона ... Еще подскажите как организовать сдвиг бита для регулировки тона. Поздравляю, так бы и раньше. Вещи-то простейшие. Сдвиг бита ? Любую книжку по Си гляньте, того же Шилдта, справочник, или Крупника Пример: Код unsigned char x, y;
...
x = 0x80; y = (x >> 1); //Теперь Y = 0x40 y = (y << 1); //Теперь Y равно = 0x80 http://www.cyberguru.ru/cpp/cpp-programmin...ide-page27.html
|
|
|
|
|
Mar 19 2013, 20:24
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Очень благодарен за помощь. Но это я понимаю. Но мне надо начиная с 0 при шаге в право надо +2 ДБ в лево 0 еще в лево -2ДБ на сначениях +14 или -14 остановить выполнение Значение бита перевел, помогите хоть с bass с остальными я уже сделаю Код /*1 0 0 1 G3 G2 G1 G0 Bass tone control 1 0 1 0 K3 K2 K1 K0 Middle tone control 1 0 1 1 H3 H2 H1 H0 Treble tone control Bass Middle Treble 0 0 0 0 -14 0x90 0xA0 0xB5 0 0 0 1 -12 0x91 0xA1 0xB5 0 0 1 0 -10 0x92 0xA2 0xB5 0 0 1 1 -8 0x93 0xA3 0xB5 0 1 0 0 -6 0x94 0xA4 0xB5 0 1 0 1 -4 0x95 0xA5 0xB5 0 1 1 0 -2 0x96 0xA6 0xB6 0 1 1 1 0 0x97 0xA7 0xB7 1 1 1 1 0 0x9F 0xAF 0xBF 1 1 1 0 +2 0x9E 0xAE 0xBE 1 1 0 1 +4 0x9D 0xAD 0xBD 1 1 0 0 +6 0x9C 0xAC 0xBC 1 0 1 1 +8 0x9B 0xAB 0xBB 1 0 1 0 +10 0x9A 0xAA 0xBA 1 0 0 1 +12 0x99 0xA9 0xB9 1 0 0 0 +14 0x98 0xA8 0xB8 */
Сообщение отредактировал Дмитрий(846) - Mar 19 2013, 20:27
|
|
|
|
|
Mar 19 2013, 21:50
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 14-09-10
Из: Уфа
Пользователь №: 59 479

|
CODE void Tone_Controll(void) { i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(TONE_CONTROLL_Treble); i2c_write(TONE_CONTROLL_Middle); i2c_write(TONE_CONTROLL_Bass); i2c_stop(); } Вот эту функцию Вы сами писали? Спрашиваю, ибо в документации рекомендуется передача данных к звуковому процессору с использованием бита подтверждения. Либо необходимо выжидать 1 такт (шины i2c).
|
|
|
|
|
Mar 20 2013, 10:34
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Да писал сам.!!! Есть замечания, подправьте, буду только рад.
|
|
|
|
|
Mar 20 2013, 20:07
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Решил попробовать так, но звук не меняется Код #define Bass14DAWN 0b10010000 #define Bass12DAWN 0b10010001 #define Bass10DAWN 0b10010010 #define Bass8DAWN 0b10010011 #define Bass6DAWN 0b10010100 #define Bass4DAWN 0b10010101 #define Bass2DAWN 0b10010110 #define Bass0DAWN 0b10010111 #define Bass0UP 0b10011111 #define Bass2UP 0b10011110 #define Bass4UP 0b10011101 #define Bass6UP 0b10011100 #define Bass8UP 0b10011011 #define Bass10UP 0b10011010 #define Bass12UP 0b10011001 #define Bass14UP 0b10011000 #define Middle14DAWN 0b10100000 #define Middle12DAWN 0b10100001 #define Middle10DAWN 0b10100010 #define Middle8DAWN 0b10100011 #define Middle6DAWN 0b10100100 #define Middle4DAWN 0b10100101 #define Middle2DAWN 0b10100110 #define Middle0DAWN 0b10100111 #define Middle0UP 0b10101111 #define Middle2UP 0b10101110 #define Middle4UP 0b10101101 #define Middle6UP 0b10101100 #define Middle8UP 0b10101011 #define Middle10UP 0b10101010 #define Middle12UP 0b10101001 #define Middle14UP 0b10101000
#define Treble14DAWN 0b10110000 #define Treble12DAWN 0b10110001 #define Treble10DAWN 0b10110010 #define Treble8DAWN 0b10110011 #define Treble6DAWN 0b10110100 #define Treble4DAWN 0b10110101 #define Treble2DAWN 0b10110110 #define Treble0DAWN 0b10110111 #define Treble0UP 0b10111111 #define Treble2UP 0b10111110 #define Treble4UP 0b10111101 #define Treble6UP 0b10111100 #define Treble8UP 0b10111011 #define Treble10UP 0b10111010 #define Treble12UP 0b10111001 #define Treble14UP 0b10111000 //Регулировка басс void Tone_Change_Bass(void) { switch(Tone_Change_Bass_Switch) { case 1: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass14DAWN); i2c_write(ACK); i2c_stop(); lcd_gotoxy(13,0); lcd_putsf("-14"); delay_ms(600); break; case 2: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass12DAWN); i2c_write(ACK); i2c_stop(); lcd_gotoxy(13,0); lcd_putsf("-12"); delay_ms(600); break; case 3: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass10DAWN); i2c_write(ACK); i2c_stop(); lcd_gotoxy(13,0); lcd_putsf("-10"); delay_ms(600); break; case 4: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass8DAWN); i2c_write(ACK); i2c_stop(); lcd_gotoxy(13,0); lcd_putsf("-8"); delay_ms(600); break; case 5: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass6DAWN); i2c_write(ACK); i2c_stop(); lcd_gotoxy(13,0); lcd_putsf("-6"); delay_ms(600); break; case 6: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass4DAWN); i2c_write(ACK); i2c_stop(); lcd_gotoxy(13,0); lcd_putsf("-4"); delay_ms(600); break; case 7: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass2DAWN); i2c_write(ACK); i2c_stop(); lcd_gotoxy(13,0); lcd_putsf("-2"); delay_ms(600); break; case 8: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass0DAWN); i2c_write(ACK); i2c_stop(); lcd_gotoxy(13,0); lcd_putsf("-0"); delay_ms(600); break; case 9: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass0UP); i2c_write(ACK); i2c_stop(); lcd_gotoxy(0,1); lcd_putsf("+0"); delay_ms(600); break; case 10: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass2UP); i2c_write(ACK); i2c_stop(); lcd_gotoxy(0,1); lcd_putsf("+2"); delay_ms(600); break; case 11: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass4UP); i2c_write(ACK); i2c_stop(); lcd_gotoxy(0,1); lcd_putsf("+4"); delay_ms(600); break; case 12: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass6UP); i2c_write(ACK); i2c_stop(); lcd_gotoxy(0,1); lcd_putsf("+6"); delay_ms(600); break; case 13: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass8UP); i2c_write(ACK); i2c_stop(); lcd_gotoxy(0,1); lcd_putsf("+8"); delay_ms(600); break; case 14: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass10UP); i2c_write(ACK); i2c_stop(); lcd_gotoxy(0,1); lcd_putsf("+10"); delay_ms(600); break; case 15: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass12UP); i2c_write(ACK); i2c_stop(); lcd_gotoxy(0,1); lcd_putsf("+12"); delay_ms(600); break; case 16: i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(Bass14UP); i2c_write(ACK); i2c_stop(); lcd_gotoxy(0,1); lcd_putsf("+14"); delay_ms(600); break; } }
|
|
|
|
|
Mar 21 2013, 18:09
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Подсказали через массив функций бахнуть, а результат 0, звук не меняется
|
|
|
|
|
Mar 21 2013, 18:22
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 14-09-10
Из: Уфа
Пользователь №: 59 479

|
В приложенном документе подробно расписана процедура программирования микросхемы PT2322 по шине I2C. Создайте отдельную программу, которая содержит три функции main(){}; функцию инициализации и настройки I2C и функцию, которая настраивает звуковой процессор. Пока в таком виде не заработает, лучше в дебри приложенного вами исхродника не соваться...
Прикрепленные файлы
pt2322.pdf ( 201.67 килобайт )
Кол-во скачиваний: 81
|
|
|
|
|
Mar 21 2013, 18:31
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(artkam @ Mar 21 2013, 20:22)  В приложенном документе подробно расписана процедура программирования микросхемы PT2322 по шине I2C. Создайте отдельную программу, которая содержит три функции main(){}; функцию инициализации и настройки I2C и функцию, которая настраивает звуковой процессор. Пока в таком виде не заработает, лучше в дебри приложенного вами исхродника не соваться... Все кроме тона работает, инициализация проходит нормально в функции main, настройки аналогично
|
|
|
|
|
Mar 21 2013, 19:38
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 14-09-10
Из: Уфа
Пользователь №: 59 479

|
Попробуйте, в качестве эксперимента, в функции загрузки параметров из ЕЕПРОМ после вызовов этих функций: CODE i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(0b11000111); // aктивaция caбвyфepa i2c_stop();
добавить что-то вроде: CODE i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(TONE_CONTROL_ON); i2c_stop();
Я тут присмотрелся... Нет, не будет и в таком виде работать. В общем, я Вам подправил исходник, в теории, должно "запеть"...
|
|
|
|
|
Mar 21 2013, 19:46
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Пробовал, но я писал только CODE i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(IN_1 вместо 0b11000111); // aктивaция caбвyфepa i2c_write(ACK); i2c_write(TONE_CONTROL_ON); i2c_write(ACK); i2c_stop();
Кстати то я дефинил все переменные
|
|
|
|
|
Mar 21 2013, 19:55
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 14-09-10
Из: Уфа
Пользователь №: 59 479

|
Вот здесь:
unsigned char Array2[][16] = {"-14", "-12", "-10", "-8", "-6", "-4", "-2", "-0", "+0", "+2", "+4", "+6", "+8", "+10", "+12", "+14"};
скорее всего должно быть как-то так:
unsigned char* Array2[16] = {"-14", "-12", "-10", "-8", "-6", "-4", "-2", "-0", "+0", "+2", "+4", "+6", "+8", "+10", "+12", "+14"};
Иначе, не компилицца...
|
|
|
|
|
Mar 21 2013, 19:57
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Вы имеете ввиду Код i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(tsss &= ~0x02); //отключает байпасс регулятора тембра i2c_write(ACK); i2c_stop(); Изменил исходник, проверю на выходных, атмега сгорела из за халатности. Ну я так понял должно работать? А в чем физическая суть?
Сообщение отредактировал Дмитрий(846) - Mar 21 2013, 20:28
|
|
|
|
|
Mar 21 2013, 20:04
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Я в каждом после выкладываю свежий, с исправлением ошибок, держите
|
|
|
|
|
Mar 21 2013, 20:16
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(artkam @ Mar 21 2013, 22:06)  Так в нем нет исправлений, которые внес я... Поверьте, те моменты что я подправил, очень важны... Так что замените исходник в Вашем проекте моим и пересоберите... ?? спасибо, а где он
|
|
|
|
|
Mar 21 2013, 20:35
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Вы имеете ввиду Код Код i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(tsss &= ~0x02); //отключает байпасс регулятора тембра i2c_write(ACK); i2c_stop(); Изменил исходник, проверю на выходных, атмега сгорела из за халатности. Ну я так понял должно работать? А в чем физическая суть?
Сообщение отредактировал Дмитрий(846) - Mar 21 2013, 20:35
|
|
|
|
|
Mar 21 2013, 20:38
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 14-09-10
Из: Уфа
Пользователь №: 59 479

|
Цитата(Дмитрий(846) @ Mar 22 2013, 00:57)  А в чем физическая суть? Присмотритесь внимательнее, изменения коснулись и функции Mute()! Физическая сущность в том, что в микросхеме предусмотрена возможность посылать сигнал мимо темброблока, а у вас данные записываются в регистр фукнций так, что это и происходит.
|
|
|
|
|
Mar 21 2013, 20:42
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(artkam @ Mar 21 2013, 22:38)  Присмотритесь внимательнее, изменения коснулись и функции Mute()! Физическая сущность в том, что в микросхеме предусмотрена возможность посылать сигнал мимо темброблока, а у вас данные записываются в регистр фукнций так, что это и происходит. Нет я это все понял, изменил, видел и добавление unsigned char... Спасибо огромное на выходных опробую, думаете будет работать? Подскажите а как сделать так что б при выбраном входе отображалось на LCD в условие indicate=1;, ато я писал функцию Код //Засветим свето-диоды по выбраному каналам и покажем на LCD void Input_CH_Indicate(void) { if(input_ADDR == IN_AC3) // Если канал выбран { lcd_gotoxy(0,0); lcd_putsf("ac-3"); LED_inputAC3=1; } else { LED_inputAC3=0; }; if(input_ADDR == IN_1) { lcd_gotoxy(0,0); lcd_putsf("ac-3"); LED_input1=1; } else { LED_input1=0; }; if(input_ADDR == IN_2) { lcd_gotoxy(0,0); lcd_putsf("ac-3"); LED_input2=1; } else { LED_input2=0; }; if(input_ADDR == IN_3) { lcd_gotoxy(0,0); lcd_putsf("ac-3"); LED_input3=1; } else { LED_input3=0; }; if(input_ADDR == IN_4) { lcd_gotoxy(0,0); lcd_putsf("ac-3"); LED_input4=1; } else { LED_input4=0; };
}
Сообщение отредактировал Дмитрий(846) - Mar 21 2013, 20:44
|
|
|
|
|
Mar 23 2013, 16:55
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Попробовал звук не меняется.
|
|
|
|
|
Mar 23 2013, 18:00
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(artkam @ Mar 23 2013, 19:18)  А при нажатии на кнопку Mute, что-то происходит? ДА звук отключается, снова нажав включается и соответственно загорается светодиод. Кстати если что у меня наоборот, диод светиться при логическом 0 ( так как у меня стоят ключи)
|
|
|
|
|
Mar 23 2013, 18:47
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 14-09-10
Из: Уфа
Пользователь №: 59 479

|
Внес изменения в Function_3D(). Обратите внимание, происходит ли что-то при нажатии соответствующей кнопки на пульте....
|
|
|
|
|
Mar 23 2013, 20:12
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(artkam @ Mar 23 2013, 20:47)  Внес изменения в Function_3D(). Обратите внимание, происходит ли что-то при нажатии соответствующей кнопки на пульте.... нет, ничего не меняется О немного получается, только две колонки не работаю F.L. & F.R.
Сообщение отредактировал Дмитрий(846) - Mar 23 2013, 20:00
|
|
|
|
|
Mar 23 2013, 20:21
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Да, но где то блокируются два канала F.R. и F.L.
|
|
|
|
|
Mar 23 2013, 20:32
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(artkam @ Mar 23 2013, 22:25)  У вас ошибка в Load_Options()... Сами прочитаете документацию и найдете ошибку, или надо подсказать?? ??? а на что обратить внимание??? Спасибо огромное за помощь
|
|
|
|
|
Mar 23 2013, 20:54
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(artkam @ Mar 23 2013, 22:38)  Внимание надо обратить на раздел "даташита": "PT2322 PROGRAMMING PROCEDURE".... Я так понял //=============================== Фyнкция зaгpyзки пapaмeтpoв ================================================ void Load_Options(void) { standby=0; // peжим STANDBY в oжидaнии mute=1; // фyнкция включeнa при загрузке Атмеги base=base_eep; // зaгpyжaeм ypoвeнь пoдъeмa в кaнaл caбвyфepa для Surround surr=surr_eep; // зaгpyжaeм cocтoяниe фyнкции Surround function3d=function3d_eep; // зaгpyжaeм 3д input_ADDR=input_ADDR_eep; // зaгpyжaeм нoмep кaнaлa // зaгpyзкa кaнaлoв кopeкции //volume10=vol_eep; trim_fl=trim_fl_eep; trim_fr=trim_fr_eep; trim_ct=trim_ct_eep; trim_sw=trim_sw_eep; trim_rl=trim_rl_eep; trim_rr=trim_rr_eep; trim_Bass=trim_Bass_eep; trim_Middle=trim_Middle_eep; trim_Treble=trim_Treble_eep; Volume_Trim(); i2c_start(); i2c_write(ADDR_2322); i2c_write(0b11111111); //Установить регистр, для нормальной работы i2c_stop(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(0b11000111); //Посли включения питания послать 0b11000111 для активиции C7H для запуска пт2322//Активировать 6ти канальный прием пт2322 //IN_1 aктивaция caбвyфepa включив первый канал // 0b11000111(был АЦ3) i2c_write(ACK); i2c_stop(); i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(tsss &= ~0x02); //отключает байпасс регулятора тембра, необходимо для регулировки тембров i2c_write(ACK); i2c_stop(); i2c_start(); i2c_write(ADDR_2323); i2c_write(ACK); i2c_write(CH_ALL_ON); // 0b11111110 // 0xfe // aктивaция нacтpoeк PT2323 включив все каналы i2c_write(ACK); i2c_stop(); Mute(); } Все равно, может я не понял???
|
|
|
|
|
Mar 23 2013, 21:13
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Цитата(artkam @ Mar 23 2013, 22:58)  Так пробуйте уже записать прошивку в процессор, железо-то у Вас ))) Попробовал, результат 0 Все получилось, проблема была только в следующем. Нельзя было разделять заполнение регистра и включения С7H. Правильный код Код i2c_start(); i2c_write(ADDR_2322); i2c_write(ACK); i2c_write(0b11111111); //Установить регистр, для нормальной работы i2c_write(ACK); i2c_write(0b11000111); //Посли включения питания послать 0b11000111 для активиции C7H для запуска пт2322//Активировать 6ти канальный прием пт2322 //IN_1 aктивaция caбвyфepa включив первый канал // 0b11000111(был АЦ3) i2c_write(ACK); i2c_stop(); Подскажите как лучше реализовать регулировку тембра, и вывод значения на дисплей, и посли выключения запись этого параметра, а при включение, чтоб и значение на LCD и уровень подъема исправно загрузились.
|
|
|
|
|
Mar 23 2013, 22:50
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Свежий исходник
Сообщение отредактировал Дмитрий(846) - Mar 23 2013, 23:13
|
|
|
|
|
Mar 24 2013, 10:12
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
в принципе разобрался и сам с регулировкой кроме отображения мне надо от -14 до +14 отображать с шагом 2 а у меня от 1 до 15 И вопрос в чем может быть проблема не регулируется понижение в FR и FL
|
|
|
|
|
Oct 20 2013, 18:34
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-03-13
Из: Украина / Харьков
Пользователь №: 75 894

|
Всем огромное спасибо, пока во всем практически разобрался кроме как нормально регулировать громкость. она регулируется, но иногда с непонятными лагами. Там надо две переменные посылать в аудио контроллере регулировать надо с посылкой бита как на 10 ДБ так и 0-9 ДБ Код 0b11010000 //0 208 0b11010001 //1 209 0b11010010 //2 210 0b11010011 //3 211 0b11010100 //4 212 0b11010101 //5 213 0b11010110 //6 214 0b11010111 //7 215 0b11011000 //8 216 0b11011001 //9 217
0b11100000 //0 десяток 224 0b11100001 //1 десяток 225 0b11100010 //2 десяток 226 0b11100011 //3 десяток 227 0b11100100 //4 десяток 228 0b11100101 //5 десяток 229 0b11100110 //6 десяток 230 0b11100111 //7 десяток 231 Код //=============================== Master Volume ============================================================== void Master_Volume(void) { i2c_start(); i2c_write(ADDR_2322); i2c_write(volume10); i2c_write(volume); i2c_stop(); }; Код if(key == KEY_VOLUME_UP) /* oбщaя гpoмкocть ++ */ { switch (indicate) { case 1: if(vol <= 78) //так как от 0 до 79 по дата щиту //было 80 { vol++; }; volume--; if(volume <= 207) { volume=217; volume10--; }; if(volume10 >= 225) //224 { Master_Volume(); Viev_Indicate(); } else { volume10++; }; break;
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|