А вы так и будете заниматься унижением???,так и скажите что вам просто нравиться так делатьARV писал(а):не представляя себе, что этот синус обозначает и нафига он нужен?! или без проблем жизнь кислая?
извините за оффтоп.
настроить АЦП
- Сообщения: 550
- Зарегистрирован: Ср авг 17, 2011 23:12:30
- Реклама
- Сообщения: 410
- Зарегистрирован: Чт ноя 13, 2008 16:33:42
sirha При внутреннем Vref=1.1В результат должен быть 1В*1023/1.1В=930 = 0x3a2. Т.е. ADCL - 0xa2, ADCH - 0x3.
- Сообщения: 550
- Зарегистрирован: Ср авг 17, 2011 23:12:30
vdavid писал(а):sirha При внутреннем Vref=1.1В
А внутреннее всегда такое? как то его менять можно?
когда подключаю внешнее что то нужно менять в настройках и что?
Код: Выделить всё
#include <tiny13.h>
#include <delay.h>
interrupt [ADC_INT] void adc_isr(void) {
PORTB=~ADCL ;
delay_ms(5); }
void main(void) {
PORTB=0xFF;
DDRB=0xFF;
ADCSRA=0x8F;
#asm("sei")
ADMUX=0x00;
ADCSRA|=0x40;
while (1) ;
} подаю 1 вольт
должно получиться 0xA2=10100010
но горят светодиоды так PB0=0;PB1=1;PB2=0;PB3=0;PB4=1;PB5=1;
?
почему так получается
- Сообщения: 410
- Зарегистрирован: Чт ноя 13, 2008 16:33:42
Внутреннюю опору изменить нельзя. Только 1.1В. За ее выбор отвечает 6-й бит в ADMUX. Если там 0, то в качестве опорного выбрано напряжение питания тиньки. Вывод ADC0 (он же PB5) читать бессмысленно, поскольку без прошитого фюза RSTDSBL он выполняет роль RESET. Прошивать этот фьюз не советую, потому, что без высоковольтного программатора с тинькой ничего уже сделать будет невозможно.
- Реклама
- Сообщения: 550
- Зарегистрирован: Ср авг 17, 2011 23:12:30
все правильно,я его в протеусе прошил),токо светодиоды зажглись не совсем так как нужно,vdavid писал(а): Вывод ADC0 (он же PB5) читать бессмысленно, поскольку без прошитого фюза RSTDSBL он выполняет роль RESET. Прошивать этот фьюз не советую, потому, что без высоковольтного программатора с тинькой ничего уже сделать будет невозможно.
прочитайте то что я выше написал
Наверно, не самый лучший способ. Переходное сопротивление контактов может внести коррективы.Барсик писал(а): использовать АЦП чтобы определить, какая кнопка нажата.
- Сообщения: 410
- Зарегистрирован: Чт ноя 13, 2008 16:33:42
Про PB5 в любом случае забудьте. Он может работать либо как вход АЦП, либо как цифровой вывод. И то и другое совместить никак не получается. А какое у Вас напряжение питания? Ведь оно используется в качестве опорного. Поэтому на выходе должно быть Uadc0*1023/Uпит
- Сообщения: 3459
- Зарегистрирован: Ср сен 27, 2006 16:18:57
На 7 кнопок работает устойчиво на резисторах с допуском +/- 5%.Jack_A писал(а):Наверно, не самый лучший способ.
Буржуины вовсю применяют такой способ, когда у микроконтроллера ног не хватает.
- Сообщения: 758
- Зарегистрирован: Вс фев 10, 2013 15:26:00
- Сообщения: 550
- Зарегистрирован: Ср авг 17, 2011 23:12:30
поздравляю вас ,а смысл то что вы пишите,может хватить флудить всякой ерундойnirq писал(а):Мне тоже нравиться заниматся унижением.
Один умный человек сказал: "Унижая других, унижаешь себя",можете начинать,ведь ни на что другое вы больше не способны.
не понимаю)vdavid писал(а): А какое у Вас напряжение питания? Ведь оно используется в качестве опорного. Поэтому на выходе должно быть Uadc0*1023/Uпит
выже говорите про внутреннее 1.1 вольт,а теперь спрашиваете про питание,питание контроллера 5 вольт,вообще проект я делал токо в протеусе.
- Сообщения: 410
- Зарегистрирован: Чт ноя 13, 2008 16:33:42
sirha,
Код: Выделить всё
#include <tiny13.h>
#include <delay.h>
interrupt [ADC_INT] void adc_isr(void) {
PORTB=~ADCL & 0x1f ;
ADCSRA |= (1<<ASDSC); // Запустить следующее преобразование
}
void main(void) {
DDRB=0x1F; // PB5 (ADC0) - на ввод
ADCSRA=0x8F;
#asm("sei")
ADMUX=0x00; // Вход ADC0, опора - напряжение питания
// ADMUX=(1 << REFS0); // Вход ADC0, опора - внутренняя (1.1В)
ADCSRA|=(1<<ASDSC);
while (1) ;
}- Сообщения: 1
- Зарегистрирован: Вт дек 30, 2014 21:24:38
делаю АЦП на ATmega16 на 2 канала. оба работают нормально, но при увеличении напряжения на входе до 0,5 В состояние портов В и С не изменяется. на выходах устанавливается 0b110010 т.к. внешний источник AREF =1.024 B и далее ничего на выходе не изменяется. что я делаю не так?
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
void preset(){
DDRA=0x0;
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
ADMUX=(0<< REFS1)|(0<< REFS0)|(0<<ADLAR)|(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
DDRD=0b00110000;
TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(0<<WGM11)|(1<<WGM10);
TCCR1B=(0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
DDRB=0xFF;
PORTB=0x00;
DDRC=0xFF;
PORTC=0x00; }
unsigned int ADC_result(unsigned char adc_input){
ADMUX=adc_input | (ADMUX & 0xF0);
_delay_us(5);
ADCSRA =ADCSRA|(1<<ADSC);
while((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;}
int main(void){
preset();
while(1){
PORTB=ADC_result(0);
PORTC=ADC_result(7);
}
}
Потому что результат измерения у Вас 2 байта, а порт может принять размер данных всего в 1 байт. Старший байт просто обрезается. Либо выводите в два порта отдельно младшую и отдельно старшую часть, либо сдвигайте результат измерений влево (бит ADLAR must установлен в 1 в регистре ADMUX).
И читайте результат только из региста ADCH
И читайте результат только из региста ADCH
Fucking static initialization order fiasco
Порт В и порт С устанавливаются одинаково?Котейко1990 писал(а): что я делаю не так?![]()
Относительно порта С, первое что приходит в голову - включен JTAG, нужно отключить, если включен.


