Делаем светодиодный индикатор напряжения

Модератор: boogyman

Делаем светодиодный индикатор напряжения

Сообщение:#1  Сообщение StyleWarrior » 23 янв 2012, 08:56

Сделал 8 разрядный все прекрасно работает, захотелось 10 разрядный, подключил еще 2 светодиода к порту С на РС7 и РС6 мк atmega64 резистор на PF0 остальные светодиоды на PA0-PA7
При прокрутки резистора и при достижении порта РС7 светодиод загорается но при уменьшении он не гаснет в чем может быть проблема?

код программы:
Код: Выделить всё
/***Использование АЦП. Светодиодная шкала***/

#define F_CPU 8000000UL  // 8 MHz
#include <avr/io.h>
#include <avr/delay.h>

/***Главная функция***/
int main (void)
{
   DDRA = 0xFF;
    PORTA = 0x00;
   DDRC = 0xFF;
    PORTC = 0x00;


/***Настройка АЦП***/
    ADCSRA |= (1 << ADEN) //Включение АЦП
   |(1 << ADPS1)|(1 << ADPS0);   // предделитель преобразователя на 8
    ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
   |(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PF0

while(1)
   {
    unsigned int u;
    ADCSRA |= (1 << ADSC);   //Начинаем преобразование
    while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования   
 
     u = (ADCL|ADCH << 8);  // Считываем  ADC
       
if (u > 102)                 //0.5V
    {PORTA = (1 << PA0);}         
else {PORTA &= ~(1 << PA0);}
   
if (u > 204)                  //1.0V
    PORTA = (1 << PA0)|(1 << PA1);     
if (u > 306)                  //1.5V 
    PORTA = (1 << PA0)|(1 << PA1)
                      |(1 << PA2);
if (u > 408)                  //2V
    PORTA = (1 << PA0)|(1 << PA1)
           |(1 << PA2)|(1 << PA3);
if (u > 510)                  //2.5V
    PORTA = (1 << PA0)|(1 << PA1)
           |(1 << PA2)|(1 << PA3)
                    |(1 << PA4);
if (u > 612)                  //3V
    PORTA = (1 << PA0)|(1 << PA1)
           |(1 << PA2)|(1 << PA3)
         |(1 << PA4)|(1 << PA5);
if (u > 714)                  //3.5V
    PORTA = (1 << PA0)|(1 << PA1)
           |(1 << PA2)|(1 << PA3)
         |(1 << PA4)|(1 << PA5)
                    |(1 << PA6);
if (u > 816)                 //4V
    PORTA = (1 << PA0)|(1 << PA1)
           |(1 << PA2)|(1 << PA3)
         |(1 << PA4)|(1 << PA5)
         |(1 << PA6)|(1 << PA7);
   
if (u > 918) {                //4.5V
    PORTA = (1 << PA0)|(1 << PA1)
           |(1 << PA2)|(1 << PA3)
         |(1 << PA4)|(1 << PA5)
         |(1 << PA6)|(1 << PA7);         
    PORTC = (1 << PC7);
    }
if (u > 1020) {                 //5V
    PORTA = (1 << PA0)|(1 << PA1)
           |(1 << PA2)|(1 << PA3)
         |(1 << PA4)|(1 << PA5)
         |(1 << PA6)|(1 << PA7);         
    PORTC = (1 << PC7)|(1 << PC6);
    }
    _delay_ms(30);
    }
}
Аватара пользователя
StyleWarrior
Новичок
 
Сообщения: 5
Зарегистрирован: 23 янв 2012, 08:46

Re: Делаем светодиодный индикатор напряжения

Сообщение:#2  Сообщение boogyman » 23 янв 2012, 20:38

Проверял в Proteuse или собирал на макетке? Я просимулировал в Proteuse, тоже самое показывает.
Аватара пользователя
boogyman
Модератор
 
Сообщения: 183
Зарегистрирован: 25 дек 2011, 21:48
Откуда: Москва

Re: Делаем светодиодный индикатор напряжения

Сообщение:#3  Сообщение boogyman » 23 янв 2012, 21:54

Для полного выключения порта С добавить else, также как для порта А
Аватара пользователя
boogyman
Модератор
 
Сообщения: 183
Зарегистрирован: 25 дек 2011, 21:48
Откуда: Москва

Re: Делаем светодиодный индикатор напряжения

Сообщение:#4  Сообщение StyleWarrior » 24 янв 2012, 17:33

на макетке собрал.
Да уже сам разобрался...
надо было погасить сигмент последний в 28 стоке else {PORTD &= ~(1 << PD0);} это и делается только для другова порта, я пошел немного другим путем:

Код: Выделить всё
/***Использование АЦП. Светодиодная шкала***/

#define F_CPU 8000000UL  // 8 MHz
#include <avr/io.h>
#include <avr/delay.h>


/***Главная функция***/
int main (void)
{
   DDRA = 0xFF;
    PORTA = 0x00;
   DDRC = 0xFF;
    PORTC = 0x00;
   DDRD = 0xFF;
    PORTD = 0x00;


/***Настройка АЦП***/
    ADCSRA |= (1 << ADEN)|(1 << ADPS1)|(1 << ADPS0);   // предделитель преобразователя на 8 //Включение АЦП
   
    ADMUX |= (0 << REFS1)|(0 << REFS0)|(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PF0 // Частота АЦП = такту микроконтроллера / 64

while(1)
   {
    unsigned int u;
    ADCSRA |= (1 << ADSC);   //Начинаем преобразование
   
   while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования   
 
     u = (ADCL|ADCH << 8);  // Считываем  ADC
       
if (u > 102)                 //0.5V
    {PORTA = 0x01;}         
else {PORTA &= ~(1 << PA0);}
   
if (u > 204) {                 //1.0V
    PORTA = 0x03;
    PORTC = 0x00;
    PORTD = 0x00;
}     
if (u > 306) {                 //1.5V 
    PORTA = 0x07;
    PORTC = 0x00;
    PORTD = 0x00;

if (u > 408) {                 //2V
    PORTA = 0x0F;
    PORTC = 0x00;
    PORTD = 0x00;

if (u > 510) {                 //2.5V
    PORTA = 0x1F;
    PORTC = 0x00;
    PORTD = 0x00;

if (u > 612) {                 //3V
    PORTA = 0x3F;
    PORTC = 0x00;
    PORTD = 0x00;

if (u > 714) {                 //3.5V
    PORTA = 0x7F;
    PORTC = 0x00;
    PORTD = 0x00;

if (u > 816) {                //4V
    PORTA = 0xFF;
    PORTC = 0x00;
    PORTD = 0x01;

   
if (u > 918) {               //4.5V
    PORTA = 0xFF;
    PORTC = 0x80;
    PORTD = 0x01;
}        
   
if (u > 1020) {                 //5V
    PORTA = 0xFF;
    PORTC = 0xC0;
    PORTD = 0x01;
}           
   
    _delay_ms(1);
    }
}


гасил сегменты в других условиях.
Аватара пользователя
StyleWarrior
Новичок
 
Сообщения: 5
Зарегистрирован: 23 янв 2012, 08:46

Re: Делаем светодиодный индикатор напряжения

Сообщение:#5  Сообщение StyleWarrior » 24 янв 2012, 17:48

В продолжение к теме Занятие №2. Переключение светодиода
Она не рабочая, почему не знаю...
На ноге где светодиод почему то постоянно присутствует +2,5 вольта, соответственно он светится в пол накала, а при нажатии на кнопку, он иногда включается на полную (повторяюсь иногда раза с 3-4)
я предполагаю это из за входа AREF он посажен на +5, хотя врятле скорее всего из за резюка на кнопке...
притом +2.5 вольт появятся только после прошивки контроллера.

Еще встал вопрос о многозадачности контроллеров, как ее реализовать ведь, если в предыдущий вариант скрестить с переключением светодиода ничего не получится так как в обоех случаях используется бесконечный цыкл соответственно как реализовать например вольтметр и амперметр или все в один цикл записать
еще вопрос про мигание светодиодов ведь если делать delay то цикл останавливается и соответственно все измерения тоже.
Аватара пользователя
StyleWarrior
Новичок
 
Сообщения: 5
Зарегистрирован: 23 янв 2012, 08:46

Re: Делаем светодиодный индикатор напряжения

Сообщение:#6  Сообщение StyleWarrior » 26 янв 2012, 08:41

Да уж форум гиблый нечего тут оставаться...
Аватара пользователя
StyleWarrior
Новичок
 
Сообщения: 5
Зарегистрирован: 23 янв 2012, 08:46

Re: Делаем светодиодный индикатор напряжения

Сообщение:#7  Сообщение boogyman » 26 янв 2012, 17:35

StyleWarrior писал(а):Да уж форум гиблый нечего тут оставаться...

Форуму 2 месяца, а ты что хотел?
Аватара пользователя
boogyman
Модератор
 
Сообщения: 183
Зарегистрирован: 25 дек 2011, 21:48
Откуда: Москва


Вернуться в Микроконтроллеры AVR

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Rambler's Top100