Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: CodeVision - подключение дисплея 1602 к любому порту Atmega8

  1. #1
    Аватар для ut7du
    Регистрация
    04.02.2006
    Адрес
    Украина
    Сообщений
    926
    Записей в дневнике
    2
    Позывной
    UT7DU- UT7D

    CodeVision - подключение дисплея 1602 к любому порту Atmega8

    Привет всем !
    Хочу подключить дисплейчик 1602 к порту B Atmega8
    Для порта D подключаю вот это:

    #asm
    .equ __lcd_port=0x12; PORTD /* ЖКИ дисплей подключили к порту I/O D*/
    #endasm

    PORTB=0x00;
    DDRB=0x00;
    lcd_init(16);
    lcd_gotoxy(0,0);
    lcd_putsf("Test 1602A");

    delay_ms(500);


    то есть число 0x12 - определяет номер порта.
    Мне нужно например к порту B или D
    Как узнать этот номер ?
    Всем хорошего настроения !


  2. #2
    ATmega8 datasheet
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	mega8.jpg 
Просмотров:	1255 
Размер:	243.5 Кб 
ID:	217044  
    73 de rz3qs

  3. Спасибо от ut7du

  4. #3
    Аватар для ut7du
    Регистрация
    04.02.2006
    Адрес
    Украина
    Сообщений
    926
    Записей в дневнике
    2
    Позывной
    UT7DU- UT7D
    Спасибо огромное !!!!!!!!!!!!
    Всем хорошего настроения !

  5. #4
    Аватар для ut7du
    Регистрация
    04.02.2006
    Адрес
    Украина
    Сообщений
    926
    Записей в дневнике
    2
    Позывной
    UT7DU- UT7D
    Все заработало. Подскажите как считать из ADC

    Добавлено через 59 минут(ы):

    Хотя бы сам процесс считывания из АЦП. Не получается....
    Последний раз редактировалось ut7du; 16.11.2015 в 22:35.
    Всем хорошего настроения !

  6. #5
    Цитата Сообщение от ut7du Посмотреть сообщение
    Подскажите как считать из ADC
    Хотя бы сам процесс считывания из АЦП. Не получается....
    Вижу Вы пока еще в начале пути. Рекомендую как настольные книги Евстифеева"Микроконт роллеры AVR...". Там правда в описании АЦП есть опечатка в таблице 2.113. Перепутаны названия битов прерывания и флага сработки АЦП и компаратора(вместо "АЦП" написано "компаратора").
    А также книги Баранова по AVR. Любые. Правда Баранов пишет на ассемблере, но, тем не менее, на знание ассемблера еще ни один не жаловался, а главное в этих книгах - описание работы с проциком и разработки алгоритма решения поставленных задач, что не зависит от выбора языка.
    Прочтите внимательно назначение регистров управления и настройки АЦП - ADCSR (ADCSRA), ADMUX, за что они отвечают, и чем управляют, и все получится.

    Прилагаю простейший пример настройки АЦП и работы с АЦП, правда для winavr, но в такой транскрибции, как в примере, должно пройти и на CV.
    Вложения Вложения
    • Тип файла: txt adc.txt (2.3 Кб, Просмотров: 191)

  7. #6
    Аватар для ut7du
    Регистрация
    04.02.2006
    Адрес
    Украина
    Сообщений
    926
    Записей в дневнике
    2
    Позывной
    UT7DU- UT7D
    Спасибо. Я сделал вот так:
    unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    delay_us(10);
    ADCSRA|=0x40;
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCW;
    void main(void)
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x81;

    while (1)
    {
    adc=read_adc(0);
    aa=(360*adc)/1024;
    sprintf(buffer,"V=%d ",aa);
    lcd_puts(buffer);
    }

    Мне нужно получить целое число из ADC - 0-400 к примеру
    но пока не получается...
    Всем хорошего настроения !

  8. #7
    Несколько поправил Ваш текст, чтобы он был более читабельным, во всяком случае для меня хотя бы.
    и добавил мыслей вслух, надеюсь поможет

    //******************** ******************** ******************** ******
    unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    delay_us(10);//хотя должно работать и без этой задержки, все устаканивается за 1 такт процика, если преобразование не первое //во времени

    ADCSRA|=0x40;
    /*
    //0x40 это бит ADSC, запуск преобразования
    //я бы написал макрос
    #define setbit(var,bitnomber ) ((var) |= 1 << (bitnomber))
    //и выглядело бы как
    setbit (ADCSRA,ADSC); //просто и понятно без всяких коментариев, и ,главное, все названия совпадают с даташитом
    //что очень важно, когда смотришь собственный текст скажем через пару недель
    */

    while ((ADCSRA & 0x10)==0);

    /*
    //то же самое пишем макрос
    #define BitIsClear(var,bitno mber) (!(var & (1<<bitnomber)))
    //получаем прямо как у меня
    while BitIsClear(ADCSRA,AD IF);
    */

    ADCSRA|=0x10;
    /*
    //сброс флага завершения преобразования можно не делать, то есть совсем это удалить из текста,
    //если изменить установку регистра ADCSRA до начала преобразования вместо установки бита ADSC
    //загрузкой в регистр вычисленного значения следующим образом:
    ADCSRA= _BV(ADEN) + f_64 + _BV(ADSC);
    */

    return ADCW;
    //пока все правильно

    } //пропущена скобка здесь компилятор должен был заорать "АХТУНГ, ошибка!"
    //******************** ******************** *************

    void main(void)
    //******************** ******************** *****************
    //здесь тоже должна быть скобка
    {
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x81;//а вот ADPS0=1 и ADPS1=0 ADPS2=0 это соответствует коэффициенту
    //деления тактовой процика всего на 2. Даже если пускаете с частотой 1 мгц, то получаем тактовую 500 кгц
    //Вы куда торопитесь??? точность преобразования будет никакая, по даташиту максимальная точность преобразования
    //у AVR при тактировании АЦП в пределах 50-200 кгц, поэтому сделайте хотя бы делитель на 32 при тактовой 8 мгц.
    //это будет
    //ADCSRA=0x85;
    //А лучше сразу привыкнуть к мнемонике даташитов и написать
    /*
    #define ADSC (6)
    #define ADPS0 (0)
    #define ADPS1 (1)
    #define ADPS2 (2) //круглые скобки в дефайнах не стесняемся ставить, помогает потом экономить время на поиске ошибок
    ADCSRA=1<<ADSC|1<<AD PS2|1<<ADPS0;
    */
    while (1)
    {
    adc=read_adc(0);

    aa=(360*adc)/1024;//а вот здесь кроется потенциальная ошибка из-за чего все не получается.
    //если aa объявлена как беззнаковое 16 битное значение, то даю 100% того, что будет переполнение разрядной сетки
    //и результат будет неверным.
    //aa нужно объявлять как 32 битное беззнаковое число,
    //а деление на 1024 делать сдвигом вправо на 10, если компилятор не заточен на степень двойки,
    //то так будет значительно быстрей и компактней в скомпилированном виде
    //поэтому
    /*
    unsigned long aa;
    aa=(360*adc)>>10;
    */


    sprintf(buffer,"V=%d ",aa);//могучая функция, жрет много сил у процика
    /*
    //гораздо проще применить
    itoa(aa,buffer,10);
    //в данном случае делает все то же самое, только быстрей и меньше места в памяти
    */
    lcd_puts(buffer);

    //а вот здесь уже надо поставить цикловую задержку, чтобы хоть увидеть, что намеряно,
    //так как при меняющейся величине показания на дисплее будут плясать с большой скоростью
    _delay_sec(1); //название функции от балды, возьмете в CV какая там есть.

    }

    }//end main

    //PS почему-то движок форума вставляет пробелы в имена регистров и битов, поэтому будьте внимательны при копипасте, это я выправить не смог, хотя и пытался.
    Последний раз редактировалось Кукин Николай Николаевич; 17.11.2015 в 18:44.

  9. #8
    Аватар для ut7du
    Регистрация
    04.02.2006
    Адрес
    Украина
    Сообщений
    926
    Записей в дневнике
    2
    Позывной
    UT7DU- UT7D
    Error: Test1.c(166): undefined symbol 'itoa' - какой include нужен ?
    Да .....в Bascome проще....
    Хотя цель стоит изучить С

    Если оставляю могучую функцию sprint то - Warning: Test1.c(163): overflow is possible in 16 bit multiplication, casting to 'long' may be required
    я aa определил как unsigned long aa;
    Последний раз редактировалось ut7du; 17.11.2015 в 19:50.
    Всем хорошего настроения !

  10. #9
    Цитата Сообщение от ut7du Посмотреть сообщение
    Error: Test1.c(166): undefined symbol 'itoa' - какой include нужен ?

    Warning: Test1.c(163): overflow is possible in 16 bit multiplication, casting to 'long' may be required
    я aa определил как unsigned long aa;
    Ошибка в itoa.
    Может быть из-за того, что cvavr не поддерживает такую функцию, так как она "немного не стандартная" - не входит в стандартный си.
    Посмотрите stdlib.h Я cvavr пользовал всего несколько дней много лет назад и сразу от него отказался, когда попробовал winavr.
    Посмотрите в хелпе.

    Второе сообщение как раз о возможном переполнении и предлагает преобразование в 32 битную величину.
    Попробуйте так
    aa=(((unsigned long)(adc))*360)>>10 ;



    Может быть у этой функции формат "кастрирован" до десятичного основания, поэтому вызов может быть itoa(aa,buffer);
    Надо смотреть хелп для cvavr. У меня cvavr сейчас нет, поэтому посмотреть не могу.
    Вполне возможно, что и значение эта функция в cvavr может глотать только типа int, поэтому для гарантии попробуйте еще одно преобразование типов из 32 бит в 16 знаковых бит . Это будет выглядеть примерно так:
    itoa((int) aa,buffer);
    Для Вашего случая это должно проканать, так как результат вычислений не может быть больше 360 по определению, что всяко меньше 32кб.
    При этом лишнего кода от преобразования типов не должно добавиться, так как потеря старших двух байт произойдет безболезненно для компилятора (преобразование типов произведено), и он не выдаст предупреждающего сообщения.

    Вот другой вариант вывести на дисплей число до 9999
    void PrintValue4(uint16_t value,uint8_t pos,uint8_t line)
    {
    if (value >= 1000)
    {
    Lcd_Chr(line,pos,(va lue/1000)+0x30); //разряд тысяч
    PrintLcd((value/100)%10+0x30); //разряд сотен
    PrintLcd((value/10)%10+0x30); //разряд десятков единиц
    PrintLcd(value%10+0x 30); //разряд десятков единиц
    }

    else if (value >= 100)
    {
    Lcd_Chr(line,pos,' '); //разряд тысяч
    PrintLcd((value/100)+0x30); //разряд сотен
    PrintLcd((value/10)%10+0x30); //разряд десятков
    PrintLcd(value%10+0x 30); //разряд единиц
    }
    else
    if(value>=10)
    {
    Lcd_Chr(line,pos,' ');
    PrintLcd(' ');
    PrintLcd((value/10)+0x30); //разряд десятков
    PrintLcd(value%10+0x 30); //разряд единиц
    }
    else
    {
    Lcd_Chr(line,pos,' ');
    PrintLcd(' ');
    PrintLcd(' ');
    PrintLcd(value+0x30) ; //разряд десятых
    }
    }
    Здесь код по величине получается минимальных размеров.
    Последний раз редактировалось Кукин Николай Николаевич; 17.11.2015 в 22:57.


  11. #10
    Аватар для Veka
    Регистрация
    18.01.2006
    Адрес
    Московская обл.
    Сообщений
    2,135
    Цитата Сообщение от Кукин Николай Николаевич Посмотреть сообщение
    //PS почему-то движок форума вставляет пробелы в имена регистров и битов, поэтому будьте внимательны при копипасте, это я выправить не смог, хотя и пытался.
    для борьбы с этим эффектом, при ответе пользуйтесь режимом ввода кода (кнопка "#" в инструментах), при этом, автовставка разделителей не сработает и не исказит текст:

    //йцукенгшщзхъфывапрол джэячсмитьбю12345678 90 - пример неправильного ввода, критичного к пробелам текста.
    Код:
    //йцукенгшщзхъфывапролджэячсмитьбю1234567890 - пример правильного ввода
    73!

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. CodeVision AVR
    от redd в разделе Конструкции на микроконтроллерах для радиолюбителей
    Ответов: 29
    Последнее сообщение: 06.12.2022, 21:01
  2. Проверка дисплея 1602
    от rn3qno в разделе Конструкции на микроконтроллерах для радиолюбителей
    Ответов: 9
    Последнее сообщение: 07.07.2015, 03:02
  3. Осцилограф приставка к СОМ порту.
    от Altay2920 в разделе Технический кабинет
    Ответов: 6
    Последнее сообщение: 08.04.2009, 11:50
  4. Отличие Atmega8-16PI от Atmega8-16PU????
    от Toms в разделе Конструкции на микроконтроллерах для радиолюбителей
    Ответов: 3
    Последнее сообщение: 26.06.2006, 22:46
  5. перестал работать LCD МТ-1602
    от RA0CHE в разделе Технический кабинет
    Ответов: 7
    Последнее сообщение: 21.06.2006, 13:26

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •