АЦП ATmega16 |
eugenemcu | Дата: Суббота, 07.11.2009, 21:53 | Сообщение # 21 |
Группа: Администраторы
Сообщений: 115
Статус: Offline
|
Судя по всему в CVAVR реализована стандартная функция языка Си sprintf (разновидность printf). Если это так, то сильно сочувствую автору статьи присланной вами мне на мэйл, где он пытается расшифровать её смысл По ней много информации в сети, она широко используется в программировании под ПК для консольных приложений. Вы похоже пытаетесь выделить десятичные разряды переменной AdcCode. Я про AdcCode/100,AdcCode0 у вас в коде. Для функции printf этого делать не нужно. Напишите просто: sprintf (lcd_buffer, "VOLTMETR \n V= %i", AdcCode); должно выводиться число от 0 до 255, в зависимости от напряжения на втором канале.
| |
|
|
|
us4ilq | Дата: Воскресенье, 08.11.2009, 04:26 | Сообщение # 22 |
Группа: Пользователи
Сообщений: 48
Статус: Offline
|
Спасибо за совет! Но тут дело не в этом, в тестовой программе мне удалось вывести на ЖКИ то что я хотел. А вот когда я вставил код вывода в программу вольтметра,то на ЖКИ опять пусто. Что до светодиода , так он мигает как и положено ему. Тоесть получается что часть программы работает, но что то не то с каким то условием, что дело до ЖКИ недоходит. Буду смотреть дальше, может что и найду. Ведь , как Вы уже заметили, я довольно невнимателен. Наверное это от того, что уж очень новое для меня все это программирование. Сергей.
| |
|
|
|
eugenemcu | Дата: Воскресенье, 08.11.2009, 12:41 | Сообщение # 23 |
Группа: Администраторы
Сообщений: 115
Статус: Offline
|
Почему говорю именно про вывод на ЖКИ? Потомучто остальное проверял. В ветке фона, там где у вас сейчас отображение на ЖК, у меня была отправка в UART: UDR=AdcCode; И на COM-порте я раз в полсекунды наблюдал числа от 0 до 256 в зависимости от положения переменного резистора на PA2. Вы можете убедиться, что программа приходит в эту ветку, переместив туда светодиод, пока он у вас показывает только работу таймера. К сожалению у меня сейчас нет под рукой подключенного WH1602, но, если жизнь заставит, то изыщем Пока что: Уберите задержку delay_ms(1000); она тут не нужна. И напишите так: Code if (Status==3) { AdcCode=(AdcCode>>2); PORTA^=(1<<LED); lcd_clear(); // Очистить экран. lcd_gotoxy(0,0); sprintf (lcd_buffer, "VOLTMETR: V= %i", AdcCode); // Записать в массив строку "VOLTMETR: V=" и значение AdcCode. lcd_puts(lcd_buffer); // Вывести lcd_buffer на экран. Status=0; } Из обработчика таймера мигание светодиода уберите. Если светик будет мигать, значит по ветке отображения вы проходите нормально. Тогда останется выяснить чем ЖК не нравиться многократный проход по процедуре отображения в отличие от однократного который вы реализовали в тестовой программе. Возможно ему каждый раз нужна очистка экрана в чём я сильно сомневаюсь. На первый взгляд всё просто обязано работать Отпишитесь о результатах. Если снова никак, буду лепить Winstar. Разберёмся. Я начинал с драйвера под DV16100 на ассемблере. Первые две недели был только чистый экран и много матов
| |
|
|
|
eugenemcu | Дата: Понедельник, 09.11.2009, 10:58 | Сообщение # 24 |
Группа: Администраторы
Сообщений: 115
Статус: Offline
|
Ещё раз здравствуйте, Сергей. Подпаял WH1602D по вашей схеме. Всё работает Выкладываю исходник >> CVVolt.c и паршифку CvVolt.hex
4327934.jpg(72Kb)
| |
|
|
|
us4ilq | Дата: Понедельник, 09.11.2009, 13:14 | Сообщение # 25 |
Группа: Пользователи
Сообщений: 48
Статус: Offline
|
Здравствуйте Евгений! К сожалению у нас тут компьютером пользуются аш 3 человека, поэтому я появляюсь эпизодически. Вот вчера например совсем за клаву не садился. Сегодня в течении дня будет время, еще попрограммирую попробую сравнить Ваш исходник и свой ,может я опять чего то напутал. А кстати! А могут появиться какие-нибудь нестыковки из-за того что я перенес в начало программы обработчики перываний. Я почему-то поначалу подумал что это без разницы, а вот как раз сейчас вспомнил то, что я ведь их вынес за пределы main. Наверное в этом и есть причина. Спасибо за вашу помощь. Добавлено (09.11.2009, 13:14) --------------------------------------------- Сейчас специально посмотрел Ваш код. Получается что они и у Вас тоже за пределами main
| |
|
|
|
eugenemcu | Дата: Понедельник, 09.11.2009, 13:59 | Сообщение # 26 |
Группа: Администраторы
Сообщений: 115
Статус: Offline
|
Отроботчики как и любые функции нельзя размещать внутри других функций, в том числе внутри main. Они всегда располагаются за её переделами - либо выше либо ниже. Важно чтобы объявления переменных, используемых в функциях, были расположены по тексту до самих функций. У Вас с этим всё в порядке. По теории Си очень рекомендую почитать "Язык программирования Си" Б. Керниган, Д. Ритчи. Прошейте мой hex, таким образом вы проверите железо. Затем, если проблемы не сгинут, надо бы скачать демо-версию CAVR 2.04.4a, которой пользуюсь я и откомпилироваться в ней. Кстати при добавлении чудо-файла m8_128.h. в CAVR 2.04.4a он заругался на повторное переопределение битов после объявления их в стандартном хидере mega16.h. Зачем нам это надо, если mega16.h видит все биты нормально!?
| |
|
|
|
us4ilq | Дата: Понедельник, 09.11.2009, 16:09 | Сообщение # 27 |
Группа: Пользователи
Сообщений: 48
Статус: Offline
|
Ну просто чудеса в решете!!! Только что залил Вашу прошивку - все прекрасно работает! Сравнил код Ваш и наш - все вроде правильно!!! Опять заливаю свою - неработает Моя версия без m8_128.h ругается на такие действия: А что до книг, так у меня есть несколько и в том числеи Лебедев, Белов, Евстифеев. НО все они в электронном виде. А читать с экрана ну ОЧЕНЬ неудобно! Я конечно ими ползуюсь (читаю) но это невозможно без компьютера, а он (как я уже упоминал) не всегда доступен. Да и память уже совсем не юношеская, УВЫ. Да, к стати! Как Вы и рекомендовали мигание светодиода перенес в тот цикл где идет вывод на ЖКИ, так вот - он МИГАЕТ , а индикатор нехочет ничего показывать
| |
|
|
|
eugenemcu | Дата: Понедельник, 09.11.2009, 16:13 | Сообщение # 28 |
Группа: Администраторы
Сообщений: 115
Статус: Offline
|
Перенесите мой код один в один в свой проект. Пока не прицепляйте m8_128.h Code TCCR1B|=(1<<CS12); замените на TCCR1B|=(1<<2); TIMSK|=(1<<TOIE1); замените на TIMSK|=(1<<2); Если и это не поможет, качайте последнюю версию там ограничение только по размеру кода 4К - для начала хватит. Маленько причесал исходник, для удобства восприятия. Вся инициализация теперь в функции init() >> CVVolt.c
| |
|
|
|
us4ilq | Дата: Понедельник, 09.11.2009, 19:45 | Сообщение # 29 |
Группа: Пользователи
Сообщений: 48
Статус: Offline
|
Только что создал новый проект, в него вставил Ваш код, скомпелировал, зашил, работает Нееее! Это я что то намудрил!!! Буду дальше думать. Да! У меня есть еще один вопрос из раздела (САМ УЖЕ ДОЛЖЕН ЗНАТЬ!!!) Что то я никак фьюзы немогу под кварц установить. Уже кучу разных форумов и статей на эту тему прочитал, и даташит конечно. СТО раз пробовал, и каждый раз "ставлю в позу" свою мегу 16. Уже надоело ее восстанавливать. Так и пробую все прошивки на 1мгц внутренний. Может научите "ОСОБО ОДАРЕННОГО" как их надо установить? Знаю СТЫДНО А что делать!? Скачал версию КОДЕВИЖЕНА как у Вас, но пока неставил. Может позже.
| |
|
|
|
eugenemcu | Дата: Понедельник, 09.11.2009, 20:19 | Сообщение # 30 |
Группа: Администраторы
Сообщений: 115
Статус: Offline
|
Вы думаете я мало Атмег запломбировал ? Недооцениваете Самый простой способ этого избежать - программаторный софт с выбором источника тактирования из выпадающего списка, а не как в PonyProg - каждый фюз вручную. Например, после установки Avr Studio в папке C:\Program Files\Atmel\AVR Tools\AvrProg появляется замечательна софтинка - AvrProg. Она поддерживает множество программторов в том числе AVR910 через COM-порт, которым я сейчас пользуюсь на работе. Кроме того она работет с USB-программаторами типа этого avr910_usb_programmer. Именно такой я собираюсь сваять в ближайшее время для домашнего использования. Минимум пайки, очень недорого и под USB Не знаю как Вы ориентируетесь в рублёвых ценах, комплектация тут не дороже 5$. Соберите себе такой же. Занятие на один вечер, зато навсегда избавитесь от фьюзо-головняков. А пока поработаете на 1МГц, для такой программы и этого заглаза.
| |
|
|