Proteus, KiCAD и другие ECAD Разработчик так или иначе сталкивается с системами автоматизированного проектирования. Данный раздел - по САПР. |
24.11.2014, 17:20
|
|
Заблокирован
Регистрация: 26.12.2013
Сообщений: 379
Сказал спасибо: 66
Сказали Спасибо 61 раз(а) в 23 сообщении(ях)
|
attiny13 adc
написал программу под атмегеу8
Код:
|
#include ‹mega8.h›
#include ‹delay.h›
#include ‹stdio.h›
void main(void)
{
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
ACSR=0x80;
ADCSR=0x85;
while (1)
{
ADCSR |= 0x40;
delay_ms(50);
if (ADCW ›=155)
{
действие
}
else
{
действие
}
};
} |
а как её на attiny13 запустить?
порты В/В я поменял, а с инициализацией adc не получилось
|
|
|
|
24.11.2014, 18:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: attiny13 adc
Посмотри в даташите
Там 3 регистра всего
Это не 2 десятка как в СТМ
|
|
|
|
24.11.2014, 18:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,031
Сказал спасибо: 3,032
Сказали Спасибо 3,205 раз(а) в 2,175 сообщении(ях)
|
Re: attiny13 adc
Сообщение от WindoЗavr
|
ADCSR=0x85;
|
1. Что-то я не вижу в документации на эти контроллеры регистр ADCSR. Вижу ADCSRA.
2. Написав вместо этого (если на GCC):
Код:
|
ADCSR=_BV(ADEN)+_BV(ADIE)+_BV(ADPS0); |
не надо было-бы задумываться, "а не перенёс-ли Atmel биты в другие позиции". Так у них иногда бывает, несмотря на заявления о совместимости. Хотя, в данном случае - это не важно.
3. В третьих - где установка опорного напряжения и номера канала (ADMUX)?
|
|
|
|
24.11.2014, 18:48
|
|
Заблокирован
Регистрация: 26.12.2013
Сообщений: 379
Сказал спасибо: 66
Сказали Спасибо 61 раз(а) в 23 сообщении(ях)
|
Re: attiny13 adc
Код:
|
PORTB=0x00;
DDRB=0b11110000;
ACSR=0x80;
ADCSRA=0x85; |
на атмеге оно и так работало
|
|
|
|
24.11.2014, 22:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,031
Сказал спасибо: 3,032
Сказали Спасибо 3,205 раз(а) в 2,175 сообщении(ях)
|
Re: attiny13 adc
Сообщение от WindoЗavr
|
на атмеге оно и так работало
|
Тема-то - про портирование (портируемость) кода, а не про то, что на mega8 работало.
При манкировании инициализацией ADMUX, канал и выравнивание результата, предположим, будут выбраны одни и те-же - ADC0 с выравниванием вправо. А вот источник опрного напряжения - всё-таки разный. Vcc для tiny13 и внешний источник на Aref для mega8.
Ответ уже очевиден?
|
|
|
|
25.11.2014, 09:23
|
|
Временная регистрация
Регистрация: 23.05.2006
Сообщений: 60
Сказал спасибо: 8
Сказали Спасибо 1 раз в 1 сообщении
|
Re: attiny13 adc
скорей всего в атмеге8 дефолтного состояния ADMUX было достаточно для нормальной работы твоего проекта
|
|
|
|
25.11.2014, 12:41
|
|
Прописка
Регистрация: 15.07.2009
Адрес: г. Москва
Сообщений: 262
Сказал спасибо: 36
Сказали Спасибо 59 раз(а) в 35 сообщении(ях)
|
Re: attiny13 adc
В начале инициализация АЦП проводилась?
В остальном по тексту у меня работает
// ADC initialization
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On пока не включешь выход 5в не работает!!!
DIDR0|=(0‹‹ADC0D) | (0‹‹ADC2D) | (0‹‹ADC3D) | (0‹‹ADC1D);
ADMUX=ADC_VREF_TYPE;
// 0‹‹ADATE ----------------- режим одиночного преобразования
// 1‹‹ADIE -----------------разрешает прерывание
ADCSRA=(1‹‹ADEN) | (0‹‹ADSC) | (0‹‹ADATE) | (0‹‹ADIF) | (1‹‹ADIE) | (1‹‹ADPS2) | (0‹‹ADPS1) | (1‹‹ADPS0);
ADCSRB=(0‹‹ADTS2) | (0‹‹ADTS1) | (0‹‹ADTS0);
|
|
|
|
26.11.2014, 00:41
|
|
Прохожий
Регистрация: 08.05.2010
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: attiny13 adc
Правильно выбрать DDRB (вход)
Настройка регистров:
ADMUX = _BV(MUX1)|_BV(MUX0); // выбираем ADC3 для контроля напряжения
//ADMUX = _BV(REFS0)|_BV(MUX1); // выбираем ADC2 для контроля напряжения
//ADMUX |= _BV(REFS0) - встроенный 1.1в
ADCSRA = _BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0); // - внешний 5В
Само считывание:
ADCSRA |= _BV(ADEN); // Разрешаем ADC
ADCSRA |= _BV(ADSC); // Инициируем прерывание считывания напряжения
while(bit_is_set(ADCSRA, ADSC)); // Ждем, пока закончится преобразование напряжения и обработается прерывание
// Читаем значения, обязательно сначала младший, потом старший!
uint8_t adc_data = ADCL;
uint8_t adc_data_h = ADCH;
ADCSRA &= ~(_BV(ADEN)); // Запрещаем ADC
Вот и вся любовь)
Дальше обрабатываем полученные значения.
Для справки:
Максимальное разрешение 10 бит (это в десятичной системе 1023).
// 0x?? 0x?? = (1023/Vcc)*V
// 2 0x28 = 2.7V Vcc=5V
// 1 0xEB = 2.4V Vcc=5V
// 1 0xC2 = 2.2V Vcc=5V
// 1 0x99 = 2.0V Vcc=5V
// 1 0x70 = 1.8V Vcc=5V
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:17.
|
|