PIC16F1503

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC16F1503

Сообщение Аlex »

1. После изменением номера канала, необходимо выдерживать паузу.
2. По программе. У Вас имеются совершенно одинаковые куски кода. Зачем их плодить в такую огромную нечитаемую простыню, вместо создания одной функции и её вызова ?
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: PIC16F1503

Сообщение DarkWolf »

задержка имеется в 20 мкс
вот как выглядит для каждого канала

ADCON0 = 0b00000000; // выбор канала
__delay_us(20);
ADRESH = 0;
ADRESL = 0;
ADCON0bits.ADON = 1;
__delay_us(20);
ADCON0bits.GO = 1;
while (ADCON0bits.GO_nDONE)
{continue;}
ADC = calc_v();

if (ADC >= 4700)
{
countChanel++;
}

да, согласен код оставляет желать лучшего.. просто срочно надо рабочий код, а не красивый.. красоту позже наведу
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: PIC16F1503

Сообщение Zhuk72 »

УАРТ можно задействовать, если он не занят, выводить в комп в терминальную программу.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15551
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: PIC16F1503

Сообщение BOB51 »

У этих ПИКов обслуживание прерываний весьма специфичное (в отличии от стандартной "среднемладшей" серии).
В обязательном порядке помимо стека задействуются "теневые хранилки".
Так что прежде, чем прерываниями воспользоваться внимательно даташит перечитать надо и помозговать над возможными "наложениями"
8)
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25155
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC16F1503

Сообщение КРАМ »

Теневые регистры используются в обязательном порядке только при СОХРАНЕНИИ контекста. А вот при восстановлении совсем нет. Совсем как в 18-х.
В зависимости от параметра команды retfie контекст будет или не будет восстановлен из теневых регистров. И тем обеспечена возможность вложенных прерываний.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC16F1503

Сообщение Аlex »

DarkWolf писал(а):задержка имеется в 20 мкс
Вы уверены, что этого достаточно ? Попробуйте поставить побольше. Для эксперимента, можно и миллисекунду воткнуть.

DarkWolf писал(а):просто срочно надо рабочий код, а не красивый.. красоту позже наведу
Красота тут не причём. Выведя код в функцию, Вы получаете быстрое изменение кода для всех каналов, меняя код только в одном месте. Разве это не быстрее ?
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: PIC16F1503

Сообщение DarkWolf »

переписал код в следующем виде

функция чтения ацп

Код: Выделить всё

unsigned int calc_v(void)
{
    unsigned int result_adc;
    unsigned long result_v;

    result_adc = (ADRESH | (ADRESL << 2));
    result_v = (unsigned long)Vdd_mV * result_adc;
    return (result_v / 1024);
}


функция с выбором каналов

Код: Выделить всё

unsigned char  read_adc( unsigned char ch) 
{
    unsigned int ADC = 0;
   
    switch (ch)                                     
         {case 0:ADCON0=0b00000000; // Канал 0
                 break;
          case 1:ADCON0=0b00000100; // Канал 1
              break;
          case 2:ADCON0=0b00001000; // Канал 1
              break;
          case 3:ADCON0=0b00001100; // Канал 1
              break;
          case 4:ADCON0=0b00010000; // Канал 1
              break;
          case 5:ADCON0=0b00010100; // Канал 1
              break;
          case 6:ADCON0=0b00011000; // Канал 1
              break;
          case 7:ADCON0=0b00011100; // Канал 1
              break;
          }
  __delay_ms(1);//задержка в 1 мс
    // Обнуляем регистры
    ADRESH = 0;
    ADRESL = 0;
    // Разрешаем АЦП
    ADCON0bits.ADON = 1;
    __delay_us(20);
    // Запускаем измерение
    ADCON0bits.GO = 1;
    while (ADCON0bits.GO);
    {
        ADC = calc_v();
    }
    if (ADC >= 4700)
    {
        return 1;
    }
    else
        return 0; 
 } 


в основной функции проверяю

Код: Выделить всё

count = read_adc(0) + read_adc(1) + read_adc(2) + read_adc(3) + read_adc(4) + read_adc(5) + read_adc(6)+read_adc(7);
   
    if (count == 2)
    {
     PORTA = 0x20; // Порт A5 устанавливаем 1.
     mydelay_ms(87);
    PORTA = 0; // Порт A5 устанавливаем 1.
    mydelay_ms(25);
     PORTA = 0x20; // Порт A5 устанавливаем 1.
    }
    else
    {
        PORTA = 0x20; // Порт A5 устанавливаем 1.
    }


сейчас у меня два канала с напряжением 4.75 вольта. Но программа почему то не работает.
Прерывания не использую. Из отладочных средств только вольтметр и осцилограф. Может кто в протеусе проверить работоспособность кода?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: PIC16F1503

Сообщение Аlex »

1.

Код: Выделить всё

    while (ADCON0bits.GO);
    {
        ADC = calc_v();
    }
Что то тут не то ... Вам не кажется ? :roll:
Зачем, пока идёт преобразование, постоянно читать его результат ? Его же (результата) пока ещё нет, он появится только после преобразования.

2. Для чего Вы преобразовываете в милливольты ? Пороги известны, а значит и значение "попугаев" тоже известны. Почему бы с ними и не сравнивать ? Вам же не на экран значения выводить. Только лишние преобразования, которые только увеличивают вероятность совершения ошибки.

Может кто в протеусе проверить работоспособность кода?
Почему бы Вам самому его не установить и не погонять свой код ? :roll:
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: PIC16F1503

Сообщение DarkWolf »

Всем принявшим участие в помощи, огроменное спасибо. Поставленная задача выполнена. Но не без костылей. Наблюдается следующая особенность поведения АЦП. Если подать напряжение питания на 3 и больше каналов, то в результате код выдает как будто напряжение питания подано на все 8 каналов. Если напряжение питания подать на 2 и меньше каналов то они успешно определяются программой.
sogd
Родился
Сообщения: 5
Зарегистрирован: Сб фев 16, 2019 19:15:40

Re: PIC16F1503

Сообщение sogd »

DarkWolf , не вы ли автор светoдиoдных фонaрей на кaмaзe?
Аватара пользователя
Vovan555
Мучитель микросхем
Сообщения: 428
Зарегистрирован: Вс мар 12, 2006 14:53:26
Откуда: Вологда

Re: PIC16F1503

Сообщение Vovan555 »

Если Вам нужен только высокий уровень, почему-бы компараторы не использовать?
Ответить

Вернуться в «PIC»