Дмитрий Мамедиев

Members
  • Публикации

    555
  • Зарегистрирован

  • Посещение

Репутация

23 Обычный

О Дмитрий Мамедиев

  • Звание
    Завсегдатай

Электроника

  • Стаж в электронике
    Не связан с электроникой
  1. Вопросы От Начинающих По Мк

    Я понимаю что нужен алгоритм, пытаюсь, просто не хватает знаний. Например усреднение через битовый сдвиг...., да я бы в жизнь до этого не догадался.
  2. Вопросы От Начинающих По Мк

    показал четыре нуля, уже достижение я думаю здесь проблема #define current (0<<MUX0)|(0<<MUX1)|(1<<MUX2)|(0<<MUX3)//ADC4 #define voltage (1<<MUX0)|(0<<MUX1)|(1<<MUX2)|(0<<MUX3)//ADC5
  3. Вопросы От Начинающих По Мк

    #define current (0<<MUX0)|(0<<MUX1)|(1<<MUX2)|(0<<MUX3) int ADC_convert (unsigned char chanel) { chanel=ADMUX и т.д. я тут подумал, а ведь ARV прав, лучше в функцию передавать значение порта и потом использовать эту функцию чем переписывать один и тот же кусок кода. ведь может придется измерять напряжение в двух местах к примеру, на входе и выходе прибора да еще и ток, а это уже три канала...
  4. Вопросы От Начинающих По Мк

    А такая запись будет актуальна? #define adc_input (1 Не знаю почему не передает код по телефону. Щас до компа доберусь
  5. Вопросы От Начинающих По Мк

    все у меня нет больше сил этим заниматься, видимо это не мое
  6. Вопросы От Начинающих По Мк

    void voltage(void)//здесь получим значение напряжения { ADMUX|=(1<<MUX2)|(1<<MUX0);ADMUX&=~((1<<MUX1)|(1<<MUX3));//ADC5 ADCSRA|=(1 << ADSC); // запуск преобразования static unsigned int ADC_value;//переменная суммы измерений static unsigned char count;//переменная суммы количества измерений ADC_value+=ADC;//складываем ADC 64раза if (count==64)//если прошло 64 измерения { ADC_value>>=6;//расчитываем среднее значение побитовым сдвигом value=(ADC_value*500L)>>10;//получаем значение напряжения при он 5,00 вольт L-означает //что хотим получить в 32 битах, >>10 сдвинув на 10 получим 16бит ADC_value=0; count=0; } else { count++;//делаем следующий замер } } int main(void) { port_ini(); lcd_ini(); ADC_ini(); int value; while (1) { lcd_poz(0); //lcd_string("I love Maria"); value=voltage();//запишем значение напряжения в переменную lcd_num_to_str(value);//выводим ее на экран } } а так?
  7. Вопросы От Начинающих По Мк

    точно? я полагал так: заходим в основную функцию int main(void) проводим инициализацию port_ini();//портов lcd_ini();//дисплея ADC_ini();//ацп затем идет цикл while (1)//в котором ADMUX|=(1<<MUX2)|(1<<MUX0);ADMUX&=~((1<<MUX1)|(1<<MUX3));//ADC5 напряжение ADC_convert();//заходим в функцию и ходим в ней пока не завершится 64 измерения lcd_poz(0);// выбираем позицию lcd_string(buffer);//записываем результат 64 измерений потом выходим ADMUX|=0;//завершаем преобразование выбираем канал ADC4 ток и повторяем все тоже самое повторю вопрос @ARV ADMUX = ADMUX & 0xF8; // надо подавить три младшие бита, ведь номер канала задается ими а записывая 0xF8 т.е. 0b11111000 мы не испортим состояние других битов регистра ADMUX? может все же void current(void) { ADMUX|=(1<<MUX2);ADMUX&=~((1<<MUX0)|(1<<MUX1)|(1<<MUX3));//ADC4 ADCSRA|=(1 << ADSC); // запуск преобразования } void voltage(void) { ADMUX|=(1<<MUX2)|(1<<MUX0);ADMUX&=~((1<<MUX1)|(1<<MUX3));//ADC5 ADCSRA|=(1 << ADSC); // запуск преобразования }
  8. Вопросы От Начинающих По Мк

    это как? @ARV ADMUX = ADMUX & 0xF8; // надо подавить три младшие бита, ведь номер канала задается ими а записывая 0xF8 т.е. 0b11111000 мы не испортим состояние других битов регистра ADMUX. и кстати нужно четыре последние бита
  9. Вопросы От Начинающих По Мк

    #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> #define RS PD0 #define EN PD1 unsigned char buffer[5]={'0',',','0','0',0}; void port_ini (void) { DDRB=0xFF; DDRC=0b1001111;//4 и 5 на вход для ацп DDRD=0xFF; PORTB=0x00; PORTC=0x00; PORTD=0x00; } // Функция передачи команды void lcd_com(unsigned char com) { PORTD &= ~(1 << RS); // RS = 0 (запись команд) PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (com & 0xF0); // старший нибл _delay_us(100); PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (com << 4); // младший нибл _delay_us(100); PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); } // Функция передачи данных void lcd_data(unsigned char data) { PORTD |= (1 << RS)|(1 << EN); // RS = 1 (запись данных), EN - 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (data & 0xF0); // старший нибл _delay_us(100); PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (data << 4); // младший нибл _delay_us(100); PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); } //функция передачи строки void lcd_string (unsigned char str1[]) { wchar_t n; for(n=0;str1[n]!='\0';n++) lcd_data(str1[n]); } //функция позиционирования курсора void lcd_poz(unsigned char x) { char adress; adress=x|0b10000000;//set DDRAM adress дш стр24 lcd_com(adress); } //функция инициализации дисплея void lcd_ini(void) { _delay_ms(15); // Конфигурирование четырехразрядного режима PORTD |= (1 << PIND5); PORTD &= ~(1 << PIND4); // Активизация четырехразрядного режима PORTD |= (1 << EN); PORTD &= ~(1 << EN); lcd_com(0x20); //0b00100000 - 4 разрядная шина, 1 строки _delay_ms(40); lcd_com(0x08); // 0b00001000 полное выключение дисплея _delay_ms(40); lcd_com(0x01); // 0b00000001 очистка дисплея lcd_com(0x06); //0b00000110 - курсор движется вправо, сдвига нет _delay_ms(40); lcd_com(0x0C); //0b00001100 - дисплей включен, курсор выключен, мерцание выключено _delay_ms(40); } //функция очистки дисплея void lcd_clear (void) { lcd_com(0b00000001); } void ADC_ini(void) { ADCSRA|= (1<<ADEN)// включаем ацп |(1 << ADSC) // запуск преобразования |(1 << ADIE) // разрешение прерывания от АЦП |(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//делитель на 128 ADMUX|=(1<<REFS0);ADMUX&=~(1<<REFS1);//он = AVCC sei ();// Глобально разрешаем прерывания } void ADC_convert(void) { static unsigned int value;//значение измеренной величины static unsigned int ADC_value;//переменная суммы измерений static unsigned char count;//переменная суммы количества измерений ADC_value+=ADCW;//складываем ADCW 64раза if (count==64)//если прошло 64 измерения { ADC_value>>=6;//расчитываем среднее значение побитовым сдвигом value=(ADC_value*500L)>>10;//получаем значение напряжения при он 5,00 вольт L-означает //что хотим получить в 32 битах, >>10 сдвинув на 10 получим 16бит //делим число и выводим посимвольно в buffer, buffer[1] значение запятой buffer[0]=(value/100)+'0'; buffer[2]=((value%100)/10)+'0'; buffer[3]=(value%10)+'0'; ADC_value=0; count=0; } else { count++;//делаем следующий замер } } int main(void) { port_ini(); lcd_ini(); ADC_ini(); while (1) { //lcd_poz(0); //lcd_string("I love Maria"); ADCSRA|= (1<<ADEN)// включаем ацп |(1 << ADSC); // запуск преобразования ADMUX|=(1<<MUX2)|(1<<MUX0);ADMUX&=~((1<<MUX1)|(1<<MUX3));//ADC5 напряжение ADC_convert(); lcd_poz(0); lcd_string(buffer); ADMUX|=0;//завершаем преобразование ADCSRA|= (1<<ADEN)// включаем ацп |(1 << ADSC); // запуск преобразования ADMUX|=(1<<MUX2);ADMUX&=~((1<<MUX0)|(1<<MUX1)|(1<<MUX3));//ADC4 ток ADC_convert(); lcd_poz(8); lcd_string(buffer); ADMUX|=0;//завершаем преобразование } } что то я устал совсем
  10. Вопросы От Начинающих По Мк

    значит так собрал я ADC.c ADC.h и прочее в одну портянку чтобы выложить сюда иииии... он скомпилировался! правда в протеусе не показывает ничего.
  11. Вопросы От Начинающих По Мк

    Я вас понял. Завтра буду дома за компом выложу весь файл в одну портянку с коментариями и на сайт.
  12. Вопросы От Начинающих По Мк

    все то же только extern добавило предупреждение что функции обьявлены ранее как внешние
  13. Вопросы От Начинающих По Мк

    ADC.h #ifndef ADC_H_ #define ADC_H_ #include "main.h" #include "LCDHD44780.h" void ADC_ini(void); void ADC_convert(void); unsigned char buffer[5]={'0',',','0','0',0}; #endif ADC.c #include "ADC.h" void ADC_ini(void) { ADCSRA|= (1<<ADEN)// включаем ацп |(1 << ADSC) // запуск преобразования |(1 << ADIE) // разрешение прерывания от АЦП |(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//делитель на 128 ADMUX|=(1<<REFS0);ADMUX&=~(1<<REFS1);//он = AVCC sei ();// Глобально разрешаем прерывания } void ADC_convert(void) { static unsigned int value;//значение измеренной величины static unsigned int ADC_value;//переменная суммы измерений static unsigned char count;//переменная суммы количества измерений ADC_value+=ADCW;//складываем ADCW 64раза if (count==64)//если прошло 64 измерения { ADC_value>>=6;//расчитываем среднее значение побитовым сдвигом value=(ADC_value*500L)>>10;//получаем значение напряжения при он 5,00 вольт L-означает //что хотим получить в 32 битах, >>10 сдвинув на 10 получим 16бит //делим число и выводим посимвольно в buffer, buffer[1] значение запятой buffer[0]=(value/100)+'0'; buffer[2]=((value%100)/10)+'0'; buffer[3]=(value%10)+'0'; ADC_value=0; count=0; } else { count++;//делаем следующий замер } } main.c на всякий случай while (1) { //lcd_poz(0); //lcd_string("I love Maria"); ADMUX|=(1<<MUX2)|(1<<MUX0);ADMUX&=~((1<<MUX1)|(1<<MUX3));//ADC5 напряжение ADC_convert(); lcd_poz(0); lcd_string(buffer); ADMUX|=0;//завершаем преобразование ADMUX|=(1<<MUX2);ADMUX&=~((1<<MUX0)|(1<<MUX1)|(1<<MUX3));//ADC4 ток ADC_convert(); lcd_poz(8); lcd_string(buffer); ADMUX|=0;//завершаем преобразование }
  14. Вопросы От Начинающих По Мк

    Как же он будет работать если столько ошибок дает? Вообще даже не пробовал