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

a_slepnev

Members
  • Постов

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

  • Посещение

Информация

  • Пол
    Мужчина

Электроника

  • Стаж в электронике
    Менее года

Посетители профиля

537 просмотров профиля

Достижения a_slepnev

Новичок

Новичок (1/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Не могли бы подсказать, где ошибка? на дисплее просто мигающий курсор
  2. Не могли бы подсказать, где ошибка? на дисплее просто мигающий курсор #include <avr/io.h> //#include <intrinsics.h> #define F_CPU 8000000 #include <util/delay.h> #include <avr/interrupt.h> #include <stdio.h> // #define _delay_us(us) __delay_cycles((F_CPU / 1000000) * (us)); // #define _delay_ms(ms) __delay_cycles((F_CPU / 1000) * (ms)); //порт к которому подключена шина данных ЖКД #define PORT_DATA PORTD #define PIN_DATA PIND #define DDRX_DATA DDRD //порт к которому подключены управляющие выводы #define PORT_SIG PORTB #define PIN_SIG PINB #define DDRX_SIG DDRB //номера выводов микроконтроллера //к которым подключены управляющие выводы ЖКД #define RS 4 #define RW 5 #define EN 6 //макросы для работы с битами #define ClearBit(reg, bit) reg &= (~(1<<(bit))) #define SetBit(reg, bit) reg |= (1<<(bit)) //функция записи команды void LcdWriteCom(unsigned char data) { ClearBit(PORT_SIG, RS); // устанавливаем RS в 0 PORT_DATA = data; // выводим данные на шину SetBit(PORT_SIG, EN); // устанавливаем Е в 1 _delay_ms(60); ClearBit(PORT_SIG, EN); // устанавливаем Е в 0 _delay_ms(60); } //функция записи данных void LcdWriteData(unsigned char data) { SetBit(PORT_SIG, RS); //устанавливаем RS в 1 PORT_DATA = data; //выводим данные на шину SetBit(PORT_SIG, EN); //устанавливаем Е в 1 _delay_ms(60); ClearBit(PORT_SIG, EN); // устанавливаем Е в 0 _delay_ms(60); } //функция инициализации void InitLcd(void) { //настраиваем порты ввода/вывода DDRX_DATA = 0xff; PORT_DATA = 0xff; DDRX_SIG = 0xff; PORT_SIG |= (1<<RW)|(1<<RS)|(1<<EN); ClearBit(PORT_SIG, RW); _delay_ms(60); LcdWriteCom(0x38); //0b00111000 - 8 разрядная шина, 2 строки LcdWriteCom(0x0f); //0b00001111 - дисплей, курсор, мерцание включены LcdWriteCom(0x01); //0b00000001 - очистка дисплея _delay_ms(60); LcdWriteCom(0x06); //0b00000110 - курсор движется вправо, сдвига нет } void InitADC(void) { ADMUX |=(1<<REFS0)|(1<<ADLAR);//AVCC — источник опорного напряжения ADCSRA |=(1<<ADEN)|(1<<ADIE)|(1<<ADPS1)|(1<<ADPS2); } void Send_Str (char* str,char length)// Отправить строку LCD, длины length { for (int i = 0;i<length;i++) { LcdWriteData(*str); str++; _delay_us(60); } } ISR (ADC_vect) //Прерывание окончания преобразования АЦП { float Voltage = ADCH*0.00489;//Результат преобразования хранится в ADCW = ADCH:ADCL char buffer [5];// Строка для отправки LCD sprintf(buffer,"U=%.2f V",Voltage);// Преобразуем значение напряжения к строке LcdWriteCom(0b00000001);// Подаем команду очистки экрана _delay_ms(2);// Пауза для ожидания завершения исполнения команды Send_Str(buffer,10); // Отправляем строку _delay_ms(100); //Пауза ADCSRA |=(1<<ADSC); //Запускаем следующее преобразование } int main(void) { InitADC(); InitLcd(); while(1) { } }
  3. А тогда ADCW для чего? и еще такая проблема, мне нужно вывести значение ацп на wh0802, если, например, я пишу lcd_data(ADCW) - на экране какой-то непонятный символ, lcd_data- запись данных, а если: void Send_Str (char* str,char length)// Отправить строку LCD, длины length { for (int i = 0;i<length;i++) { LcdWriteData(*str); str++; _delay_us(60); } } float v; InitLcd(); ADMUX=0b01000101; // канал 5 _delay_us(10); // стабилизация входа... ADCSRA|=0b01000000; // Старт преобразования. while ((ADCSRA & 0x10)==0); // ждём ADIF - флаг завершении преобразования ADCSRA|=0x10; // сброс ADIF - флаг завершении преобразования v=ADCW*0.00489; // (напряжение) char buffer [10]; sprintf(buffer, "U=%.1f", v); LcdWriteCom(0b00000001); _delay_ms(10); Send_Str(buffer,10); // Отправляем строку _delay_ms(100); //Пауза ADCSRA |=(1<<ADSC); //Запускаем следующее преобразование while(1); { } то на дисплее просто мигающий курсор, помогите, пожалуйста, разобраться, где ошибка
  4. Здравствуйте, подскажите, пожалуйста, где ошибка в программе, просто текст выводится, а вот с выводом данных из АЦП проблема - мигающий курсор вместо значения.. float v; InitLcd(); ADMUX=0b01000101; // канал 5 _delay_us(10); // стабилизация входа... ADCSRA|=0b01000000; // Старт преобразования. while ((ADCSRA & 0x10)==0); // ждём ADIF - флаг завершении преобразования ADCSRA|=0x10; // сброс ADIF - флаг завершении преобразования v=ADCW*0.00489; // (напряжение) (00000011 11111111). char buffer [5]; //InitADC(); sprintf(buffer, "U=%.1f", v); LcdWriteCom(0b00000001);// команда очистки экрана _delay_ms(100); Send_Str(buffer,5); // Отправляем строку _delay_ms(100); //Пауза ADCSRA |=(1<<ADSC); //Запускаем следующее преобразование //ADCSRA |=(1<<ADSC); while(1); { }
  5. спасибо за ответ. Насколько я понял из даташита, преобразованное значение хранится в ADCH:ADCL и битом ADLAR выставляем выравнивание, если мы берем, например, переменную v (напряжение) и записываем, что v=ADCH, предварительно выставив бит ADLAR, то ничего не работает...подскажите, пожалуйста, как правильно выводить (считывать) преобразованное значение?
  6. a_slepnev

    АЦП Atmega8

    Здравствуйте, вопрос по ацп atmega8, задача примитивная - сделать вольтметр, подскажите, пожалуйста, как вывести данные из ADCW, и нужно ли делать прерывание по таймеру или можно запустить нерперывное преобразование?если непрерывное, то как считывать данные? с остальными регистрами вроде разобрался по даташиту, прошу строго не судить - только начинаю разбираться... TEST_DISP_PROBA_2.atsln
  7. Всем привет. Начал изучать МК, дошел до 6 урока, все сделал, согласно видео, а в Proteus 8.4 белый дисплей Больше ни на что не реагирует, пробовал ставить другие библиотеки с этого форума, результат тот же.. вроде многие, у кого Proteus 8, сталкивались с такой проблемой, подскажите, пожалуйста, это как нибудь лечится?? или только переустанавливать на Proteus v7?
×
×
  • Создать...