Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Pavel_RnD
0 / 0 / 0
Регистрация: 25.12.2018
Сообщений: 5
1

АЦП на Atmega 328p u

25.12.2018, 18:42. Просмотров 178. Ответов 9

Замучился... помогите плиз!

Не работает АЦП на atmega328p u

Зависает на ожидании считывания или не пойму где...

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#define F_CPU 16000000L
#include <avr/io.h>
#include <avr/interrupt.h>
int data;
volatile int t = 0;
 
ISR (TIMER0_OVF_vect)
{
    t++;//1000 циклов переполнения = 1 секунда
}
 
void ADC_Init()
{
    ADCSRA |= (1 << ADEN) |(1 << ADLAR);                    // Включаем АЦП
    ADCSRA |= (1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0);    // устанавливаем предделитель преобразователя 
    ADMUX |= (0 << REFS1)|(1 << REFS0);                  //выставляем опорное напряжение
    ADMUX |= (1 << MUX0)|(0 << MUX1)|(1 << MUX2)|(0 << MUX3); // снимать сигнал будем с  входа PC5 
    ADCSRA |= 1 << ADSC;
}
 
int main(void)
{
    DDRB |= (1 << PB0)|(1<<PB1);
    DDRC = 0x00;
    PORTC = 0xff;
    TCCR0B = 0b00000011; //делитель на 64
    TIMSK0 |= 1 << TOIE0;
    sei();
    ADC_Init();
    while (1) 
    { 
        while (ADCSRA &(1 << ADSC));//тут все виснет
        data = ADCH; // Считываем  полученное значение;
        if (data > t) //заполняем секунду пропорционально 
            {
                PORTB |= 1 << PB0;
            } else 
            {
                PORTB &= ~(1 << PB0);//включение нагревателя через опторазвязку
            }
        if (t > 1000)
            {
                PORTB ^= 1 << PB1;//индикатор что код ЖИВ  - НЕ МИГАЕТ пока не убрать while (ADCSRA &(1 << ADSC));
                t = 0;
                ADCSRA |= 1 << ADSC;
            }
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2018, 18:42
Ответы с готовыми решениями:

atmega 328p USART
Доброго времени суток и панигите люди добрые :) Общие оговорки: я любознателен, но не знаком с ...

atmega 328p 128Khz
Доброго дня всем! Случайно прошил неверные fuse на на атмега 328p. CKSEL=0011 SUT=00 SPIN и...

Atmega 328p + WH1602A
Купил ЖКИ WH1602A, подключил: 1) питание с 5В и земли; 2) регулирование контраста - на PB2 через...

Atmega 328p pwm
Привет. Вопрос конечно нубский - но это потому, что я только начинаю знакомится с avr по статьям DY...

как проверить работоспособность Atmega 328p
Добрый день, кошаки. Помогите, пожалуйста. У меня есть опыт с Ардуино, но совсем нет опыта работы...

9
COKPOWEHEU
1158 / 820 / 193
Регистрация: 09.09.2017
Сообщений: 3,530
25.12.2018, 19:28 2
В ветке (t > 1000) вы запускаете преобразование. Но если (t<=1000) вы сразу попадаете в цикл ожидания окончания преобразования, которое не было запущено. Естественно, программа там зацикливается.
Самый простой (НО НЕПРАВИЛЬНЫЙ!) способ починить это - заменить if(t>1000) на while(t<=1000){}, то есть ждать наступления нужного времени.
0
Pavel_RnD
0 / 0 / 0
Регистрация: 25.12.2018
Сообщений: 5
25.12.2018, 19:51  [ТС] 3
Не совсем понял...
C
1
while (ADCSRA &(1 << ADSC));
после считывания АЦП аппаратно сбрасывает бит ADSC в 0 и
C
1
 ADCSRA &(1 << ADSC)
равно нулю, то есть в этот цикл даже не заходим?

проблема в том что даже TIMER0 не делает прерываний, t не меняет значение, РВ1 не меняет состояние.

я сутки убил на это, люди, подскажите
0
pyzhman
785 / 480 / 65
Регистрация: 15.05.2012
Сообщений: 2,718
26.12.2018, 12:29 4
C
1
while (ADCSRA &(1 << ADSC));
Зачем вхиле??? Нужно стартануть, взведя как раз ADSC, а потом ждать по вхиле появления ADIF.
0
Pavel_RnD
0 / 0 / 0
Регистрация: 25.12.2018
Сообщений: 5
26.12.2018, 12:34  [ТС] 5
Меньше букв потому что.

C
1
while (ADCSRA & (1 << ADIF) == 0);
то же самое что
C
1
while(ADCSRA &(1 << ADSC));
поскольку ADCS сбрасывается в 0 аппаратно по завершению преобразования
0
ValeryS
Модератор
7401 / 5599 / 710
Регистрация: 14.02.2011
Сообщений: 19,049
Завершенные тесты: 1
26.12.2018, 18:46 6
Цитата Сообщение от Pavel_RnD Посмотреть сообщение
то же самое что
Уверен?

C
1
while(ADCSRA &(1 << ADSC));
это аналог

C
1
while((ADCSRA &(1 << ADSC))!=0);
0
Ethereal
Нарушитель
5197 / 1940 / 251
Регистрация: 17.02.2013
Сообщений: 2,876
27.12.2018, 01:26 7
Цитата Сообщение от Pavel_RnD Посмотреть сообщение
C
1
while (ADCSRA & (1 << ADIF) == 0);
Это однократно исполняющийся цикл.
== приоритетнее чем &
Поэтому (1 << ADIF) == 0 сосчитается как константа 0 , а & с нулем даст всегда 0
0
Pavel_RnD
0 / 0 / 0
Регистрация: 25.12.2018
Сообщений: 5
27.12.2018, 10:42  [ТС] 8
C
1
ADCSRA |= (1 << ADEN) |(1 << ADLAR);
Установив бит ADLAR в 0 все заработало
0
ValeryS
Модератор
7401 / 5599 / 710
Регистрация: 14.02.2011
Сообщений: 19,049
Завершенные тесты: 1
27.12.2018, 10:59 9
Цитата Сообщение от Pavel_RnD Посмотреть сообщение
Установив бит ADLAR в 0
это вот так?
Цитата Сообщение от Pavel_RnD Посмотреть сообщение
C
1
(1 << ADLAR)
0
Pavel_RnD
0 / 0 / 0
Регистрация: 25.12.2018
Сообщений: 5
27.12.2018, 11:23  [ТС] 10
C
1
ADCSRA |= (1 << ADEN) |(0 << ADLAR);
0
27.12.2018, 11:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2018, 11:23

Передача сообщения через UART для Atmega 328P
Добрый день. Сам я новичок в этом деле. Сделал устройство бегущей строки на Atmega328P по этой...

АЦП AD7705 c Atmega
Всем привет! В чем затык... Подключил AD7705 к Atmega328. АЦП, вроде, делает пару правильных...

Меряем напряжение с помощью АЦП ATMEGA-8
Уважаемые форумчане, возникла такая задача. Необходимо замерять напряжение на 2-х клеймах...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru