CodeVision AVR в вопросах и ответах
- Сообщения: 102
- Зарегистрирован: Вт дек 28, 2010 18:25:31
Спасибо.А как сохранить настройки этих кнопок,в памяти,чтоб при пропадании питания и потом его появлении,они сохранились?
- Реклама
- Сообщения: 73
- Зарегистрирован: Вт июн 22, 2010 20:15:17
прошу прощения, уже обращался с данным вопросом но все таки... не могу дать ладу с АЦП меги16... постоянно присутствует на ножке некоторое малое напряжение (около 0.1 - 0.2 В), пытаюсь подключить датчик LM35. пробовал и напрямую и через резистор...
напрямую - занижает показания, через резистор - АЦП дает 0... плюс к этому показания "скачут", то есть вывожу на дисплей каждые 0.5 сек и при напряжении выхода LM35 в 0.3В (т.е 28 С) на дисплее отображает вперемешку значения от 12 до 18...
с АЦП работаю так:
подскажите пожалуйста где я не прав...
напрямую - занижает показания, через резистор - АЦП дает 0... плюс к этому показания "скачут", то есть вывожу на дисплей каждые 0.5 сек и при напряжении выхода LM35 в 0.3В (т.е 28 С) на дисплее отображает вперемешку значения от 12 до 18...
с АЦП работаю так:
Код: Выделить всё
// процедура чтения значения АЦП
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(100);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
это стандартно от визарда, только увеличил задержку так как считывание периодически шло не из нужных каналов
PORTA=0x00; - подтяжки нету
DDRA=0x00; - настроен на вход
SFIOR=0x04; - еще раз принудительное отключение подтяжки резисторами
ADMUX=ADC_VREF_TYPE & 0xff; при этом ADC_VREF_TYPE = 0x20 - то есть опорное напряжение от AREF, но используются старшие 8 бит
ADCSRA=0xA6; - включение АЦП, бит ADATE и делитель на 64 (частота кварца 8 Мгц)
Как вы вообще пришли к выводу, что АЦП занижает показания?
- Сообщения: 73
- Зарегистрирован: Вт июн 22, 2010 20:15:17
Может я выразился неправильно.. если выход LM35 "висит в воздухе" - на нем корректные 0.3в, а если его посадить на вход АЦП напряжение в точке садится примерно до 0.14-0.18в
- Сообщения: 804
- Зарегистрирован: Чт мар 12, 2009 16:31:05
hfelyx,перед типом переменной поставь квалификатор eeprom.
DDark,в "протезе" пробовал эмулировать,если есть проект в "протезе" ,скидывай,посмотрим.
DDark,в "протезе" пробовал эмулировать,если есть проект в "протезе" ,скидывай,посмотрим.
- Реклама
- Сообщения: 73
- Зарегистрирован: Вт июн 22, 2010 20:15:17
- Сообщения: 73
- Зарегистрирован: Вт июн 22, 2010 20:15:17
в таком случае получше, но почему то наблюдаются все равно некие скачки значений.. то есть висит секунд 20 верное напряжение, потом на пару секунд оно скачет почти в 2 раза, потом опять стабилизируется и снова скачет... от чего это может быть? после выбора канала АЦП и так задержку 100 мкс поставил
- Сообщения: 804
- Зарегистрирован: Чт мар 12, 2009 16:31:05
- Сообщения: 73
- Зарегистрирован: Вт июн 22, 2010 20:15:17
подобрал 240 Ом.. пока полет нормальный - спасибо огромное!
продолжил развивать свое устройство - подключил еще 3 канала АЦП
самое интересное - пока значения напряжений не меняются то показывают они в общем-то совсем немного плавая, но плавая...
а вот когда напряжение начинает мало-мальски меняться получается совсем нехорошо:
на одном висит потенциометр (датчик дроссельной заслонки - около 8 кОм) - мультиметром меряю 0.85в, АЦП показывает 0.80 - 0.86 в перемешку.. я понимаю что у меня АЦП настроен на 8 бит (т.е шаг 20 мВ) - ну это ладно, приемлемо
на втором канале - датчик давления воздуха.. его меряю мультиметром - 1.2, а вот АЦП прыгает от 0.98 до 1.22 - и это уже не годится... как это плавание уничтожить? я так понимаю что внутри датчика тензорезистор подключенный в мост... как бы мне с них снять точно напряжение...
и третий канал - самая кривая проблема... о ней я уже писал, и признаю что усложнил себе жизнь - но в общем то работает...
- тут значения плавают при напряжении 1.2в в пределах до 0.5 до 2в....
посоветуйте книжку какую-нибудь пожалуйста, или чего - нибудь...
продолжил развивать свое устройство - подключил еще 3 канала АЦП
самое интересное - пока значения напряжений не меняются то показывают они в общем-то совсем немного плавая, но плавая...
а вот когда напряжение начинает мало-мальски меняться получается совсем нехорошо:
на одном висит потенциометр (датчик дроссельной заслонки - около 8 кОм) - мультиметром меряю 0.85в, АЦП показывает 0.80 - 0.86 в перемешку.. я понимаю что у меня АЦП настроен на 8 бит (т.е шаг 20 мВ) - ну это ладно, приемлемо
на втором канале - датчик давления воздуха.. его меряю мультиметром - 1.2, а вот АЦП прыгает от 0.98 до 1.22 - и это уже не годится... как это плавание уничтожить? я так понимаю что внутри датчика тензорезистор подключенный в мост... как бы мне с них снять точно напряжение...
и третий канал - самая кривая проблема... о ней я уже писал, и признаю что усложнил себе жизнь - но в общем то работает...
посоветуйте книжку какую-нибудь пожалуйста, или чего - нибудь...
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Analog Devices. Методы практического конструирования при нормировании сигналов с датчиковDDark писал(а):..посоветуйте книжку какую-нибудь пожалуйста, или чего - нибудь...
- Сообщения: 73
- Зарегистрирован: Вт июн 22, 2010 20:15:17
спасибо, на страницах 172-173 как раз мой случай с термистором... сделал как описано - токовое зеркало и термистор с шунтом - все равно показания АЦП плавают...
с датчиком давления я придумал подключить АЦП через диод и посадить на землю через резистор - пульсации уменьшились, но характеристика стала нелинейной =( чего еще придумать...
с датчиком давления я придумал подключить АЦП через диод и посадить на землю через резистор - пульсации уменьшились, но характеристика стала нелинейной =( чего еще придумать...
а если конденсатор параллельно повесить?DDark писал(а): с датчиком давления я придумал подключить АЦП через диод и посадить на землю через резистор - пульсации уменьшились, но характеристика стала нелинейной =( чего еще придумать...
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Извините за возможно глупый вопрос, но все же! CodeWizard генерирует "множество кода с нулевыми значениями". Т.е. у меня не используется таймер Т1 - в итоге
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
Вопрос. Обязательны ли такие подобные куски кода (с нулевыми значениями) или же можно их не писать вообще? (разумеется если не используется таймер, к примеру)
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
Вопрос. Обязательны ли такие подобные куски кода (с нулевыми значениями) или же можно их не писать вообще? (разумеется если не используется таймер, к примеру)
Самое гениальное - всегда самое простое
- Сообщения: 804
- Зарегистрирован: Чт мар 12, 2009 16:31:05
Я может и не прав,но считаю,что "нуна",чтобы потом не искать "внешние помехи" в работе проца.Ведь при старте они могут принять произвольное значение.Да и код при этом немного увеличивается.
Строго говоря, существуют значения по умолчанию, которые принимают регистры процессора ( не все ) при включении. Но полагаться на умолчание не следует. 100 процев фурчат нормально, а у 101-го какой-то бит не скинулся. Или еще хуже -- через раз. В результате сэкономленные несколько строчек кода могут дать геморру на всю опу.
Господа, поделитесь пожалуйста ds1307.h и ds1307.lib
У меня оказалось нет. Программу-то написал, часы работают, но хочу все же поудобнее сделать, а либы этой в моем codevision почему-то не оказалось.
У меня оказалось нет. Программу-то написал, часы работают, но хочу все же поудобнее сделать, а либы этой в моем codevision почему-то не оказалось.
Это правило, принятое коллективом програмистов, без особых возражений?Jack_A писал(а):Строго говоря, существуют значения по умолчанию, которые принимают регистры процессора ( не все ) при включении. Но полагаться на умолчание не следует. 100 процев фурчат нормально, а у 101-го какой-то бит не скинулся. Или еще хуже -- через раз. В результате сэкономленные несколько строчек кода могут дать геморру на всю опу.
Какой достигнут Концепcус -обнулить регистры самому или верить дефолту?
- Сообщения: 173
- Зарегистрирован: Вт дек 21, 2010 21:18:52
Здравствуйте!
Подскажите как узнать хватает ли оперативной памяти в микроконтроллере?
У меня мега 168, и очень много переменных.
Мое устройство по разному - глючно работает при компилировании тремя разными версиями компиляторов (1,25,9/2,05,0/2,05,3)
Добавляю в программе операцию, которая даже и не связанна с глюком, а глюк проявляется.
Думаю, что кончилась оперативка! КАК ПРОВЕРИТЬ???
После компиляции выскакивает окно, и я его скопировал, что бы показать.
Может быть , что то прояснится?
Clock frequency: 16,000000 MHz
Program type: Application
Memory model: Small
Optimize for: Size
(s)printf features: int, width
(s)scanf features: int, width
Promote 'char' to 'int': No
'char' is unsigned: Yes
global 'const' stored in FLASH: Yes
8 bit enums: No
Enhanced core instructions: Yes
Automatic register allocation: Yes
Smart register allocation: Yes
Build: 3
3679 line(s) compiled
No errors
12 warning(s)
Bit variables area: 0x2 to 0x3
Bit variables size: 2 byte(s)
Data Stack area: 0x100 to 0x1FF
Data Stack size: 256 byte(s)
Estimated Data Stack usage: 27 byte(s)
RAM Global variables area: 0x200 to 0x37D
RAM Global variables size: 382 byte(s)
Hardware Stack area: 0x37E to 0x4FF
Hardware Stack size: 386 byte(s)
Heap size: 0 byte(s)
EEPROM usage: 441 byte(s), 86,1% of EEPROM
Program size: 7166 words (14332 bytes), 87,5% of FLASH
Его перевод
Тактовая частота: 16,000000 МГц
Тип программы: Применение
Модель памяти: Малый
Оптимизация для: Размер
(ы) Е функции: INT, ширину
(ы) SCANF функции: INT, ширину
Не поощрять "символ", чтобы "INT": Нет
"символ" не подписано: Да
глобального "строительства" хранятся во флэш-памяти: Да
Не 8 бит перечислений: Нет
Расширенные основные инструкции: Да
Автоматическое распределение регистров: Да
Смарт распределения регистров: Да
Телосложение: 3
3679 линия (линии), составленная
Нет ошибок
12 предупреждение (ы)
Бит области переменных: 0x2 до 0x3
Бит размер переменных: 2 байта (ы)
Данные области стека: 0x100 для 0x1FF
Стек данных Размер: 256 байт (а)
Расчетное стека данных использование: 27 байт (ы)
RAM области глобальных переменных: 0x200 для 0x37D
RAM глобальный размер переменных: 382 байт (а)
Аппаратный стек площадь: 0x37E к 0x4FF
Аппаратный стек Размер: 386 байт (а)
Куча размер: 0 байт (ы)
Использование EEPROM: 441 байт (ов), 86,1% из EEPROM
Размер программы: 7166 слов (14 332 байт), 87,5% от FLASH
Подскажите как узнать хватает ли оперативной памяти в микроконтроллере?
У меня мега 168, и очень много переменных.
Мое устройство по разному - глючно работает при компилировании тремя разными версиями компиляторов (1,25,9/2,05,0/2,05,3)
Добавляю в программе операцию, которая даже и не связанна с глюком, а глюк проявляется.
Думаю, что кончилась оперативка! КАК ПРОВЕРИТЬ???
После компиляции выскакивает окно, и я его скопировал, что бы показать.
Может быть , что то прояснится?
Спойлер
Chip: ATmega168Clock frequency: 16,000000 MHz
Program type: Application
Memory model: Small
Optimize for: Size
(s)printf features: int, width
(s)scanf features: int, width
Promote 'char' to 'int': No
'char' is unsigned: Yes
global 'const' stored in FLASH: Yes
8 bit enums: No
Enhanced core instructions: Yes
Automatic register allocation: Yes
Smart register allocation: Yes
Build: 3
3679 line(s) compiled
No errors
12 warning(s)
Bit variables area: 0x2 to 0x3
Bit variables size: 2 byte(s)
Data Stack area: 0x100 to 0x1FF
Data Stack size: 256 byte(s)
Estimated Data Stack usage: 27 byte(s)
RAM Global variables area: 0x200 to 0x37D
RAM Global variables size: 382 byte(s)
Hardware Stack area: 0x37E to 0x4FF
Hardware Stack size: 386 byte(s)
Heap size: 0 byte(s)
EEPROM usage: 441 byte(s), 86,1% of EEPROM
Program size: 7166 words (14332 bytes), 87,5% of FLASH
Спойлер
Чип: ATmega168Тактовая частота: 16,000000 МГц
Тип программы: Применение
Модель памяти: Малый
Оптимизация для: Размер
(ы) Е функции: INT, ширину
(ы) SCANF функции: INT, ширину
Не поощрять "символ", чтобы "INT": Нет
"символ" не подписано: Да
глобального "строительства" хранятся во флэш-памяти: Да
Не 8 бит перечислений: Нет
Расширенные основные инструкции: Да
Автоматическое распределение регистров: Да
Смарт распределения регистров: Да
Телосложение: 3
3679 линия (линии), составленная
Нет ошибок
12 предупреждение (ы)
Бит области переменных: 0x2 до 0x3
Бит размер переменных: 2 байта (ы)
Данные области стека: 0x100 для 0x1FF
Стек данных Размер: 256 байт (а)
Расчетное стека данных использование: 27 байт (ы)
RAM области глобальных переменных: 0x200 для 0x37D
RAM глобальный размер переменных: 382 байт (а)
Аппаратный стек площадь: 0x37E к 0x4FF
Аппаратный стек Размер: 386 байт (а)
Куча размер: 0 байт (ы)
Использование EEPROM: 441 байт (ов), 86,1% из EEPROM
Размер программы: 7166 слов (14 332 байт), 87,5% от FLASH


