Jump to content

Bugrim

Members
  • Content Count

    223
  • Joined

  • Last visited

Community Reputation

2 Обычный

About Bugrim

  • Rank
    Постоялец
  • Birthday 09/28/1980

Информация

  • Пол
    Мужчина
  • Город
    г. Запорожье, Украина

Электроника

  • Стаж в электронике
    10-20 лет

Recent Profile Visitors

5741 profile views
  1. Разобрался. Регистр ANSELH не был настроен. При запуске устанавливался в единицы (аналоговые входы). При правильной настройке, правильно и макетка (до этого не совсем корректно) и протеус заработал. Всем спасибо.
  2. Доброго времени суток. Подскажите что делаю не так. Необходимо настроить внешнее прерывание на RB0. Proteus на изменение RB0 совсем не реагирует. Решил промоделировать в живую на макетке. Прерывание срабатывает однако флаг прерывания не сбрасывается (наблюдаю в пошаговом выполнении). Камень PIC16f886, программатор/отладчик PicKit4, среда разработки MPLABX IDE v5.3, proteus 8.4 SP0. void main(void) { nastroyka(); F_bili_izmeneniya=1; while (1) { // ekran(); ADC_start(); ADC_read(); __delay_ms(50); __nop; } } void nastroyka(void){ //******Настройка прерываний******** //******GIE=1 PEIE=1 T0IE=0 INTE=0 //******RBIE=1 T0IF=0 INTF=0 RBIF=0 INTCON=0b11001000; IOCB=0xff; BCLIE=1; //ULPWUIE=1; // ANS12=1; //*******Настройка порта A TRISA0=1; //вход ***Вход АЦП TRISA2=1; //вход **Вход Uref- //*******Настройка порта B TRISB0=1; //***********Настройка АЦП*********** // Настройка времени обрабатки АЦП = 32*Tosc ANS0=1; ANS2=1; ADCS0=0; ADCS1=1; ADFM=1; //Правое выравнивание результата //*****Подключение канала 0 CHS0=0; CHS1=0; CHS2=0; CHS3=0; //****Подтяжка Vref+ к внутренниму + VCFG0=0; //**** Vref- к внешниму источнику (AN2)) VCFG1=1; //Включить АЦП ADON=1; //***********Настройка PORTC*********** TRISC=0x18;////RC3 and RC4 Input (SDC and SDA) TRISC5=1; //вход кнопки //***********I2C*********** SSPADD=0X09; SSPSTAT=0X80; SSPCON=0X38; } void interrupt interr(void){ volatile char temp; if(RBIF){ temp=PORTB; RBIF=0; } } Почему флаг прерывания не сбрасывается? Что делаю не так? Подскажите протеус адекватный к внешним прерываниям.
  3. ПИД регулятор. Контроль температуры. Хочется: 1 частота опроса 25 Гц для каждого канала. 2 каналов - 3 3 датчик температуры - термопара К типа - 3 шт. 4 динамическая индикация 5 разрядов. 5 органы управления - 4 кнопки. В первом приближении так. В вычислениях предполагаю использовать такой формат. 16 бит: 5 разрядов - дробная часть, 10 - целая, 1 знаковый. Расчет примерно так ( ещё обдумываю): U = K * ( Err + (1/Ti)*Int + Td*dErr ) Eo = E; Нам нужна прошла ошибка. Ошибки — по 16бит E = Y-X; Вычисляем новое рассогласование. 16bit Int = Int + (E+Eo)/2; Интегрируем ошибку. При этом считаем полусумму разности (разностная схема). 32bit = 32bit + 16bit cI = Int * (1/Ti); Считаем интегральный вклад — 32bit * 32bit => 32bit cD = Td * (E-Eo); Считаем диф вклад — 16*16 => 32bit PID = E + cI + cD; Подскобочное; 16+32+32 => 32bit U = K*PID/256; Коэфф; 32*16/8 bit => 40bit. Будет ли успевать на частоту 25Гц, или изначально снизить надо. Источник вдохновения - https://m.habr.com/ru/post/145991/
  4. Да... Жаль. Это довольно длинный путь. Буду пробывать.
  5. Может и за умножение загнул, но так или иначе оперировать надо 32 разрядными. На данном этапе пока что это размышления о будующем проекте. Но в протеусе посмотреть проблемы не составит, однако я подозреваю, что время операции деления числа на 2, 4 или 8 будет отличатся от времени деления на число, например, 863. Все комбинации деления перебрать - глупость, с моей точки зрения. Подозреваю, что не один я столкнулся с подобным.
  6. Доброго дня. Подскажите возможно ли вычислить максимальное время вычисления выражения. В конкретном случае деление/умножение 32 разрядных чисел. Максимальное время выполнения операций необходимо для расчета времени (частоты) опроса датчика, который предоставит новые данные для вычисления. Пишу на xc8. За ранее благодарен.
  7. Не раз накалываюсь. Присваивается не правильное значение, однако программа отрабатывает правильно. Вероятней всего для данного камня это не имеет значения. Использую PIC16F886, компилятор XC8, v1.33.
  8. Объявлены массивы: unsigned char dekady[4][10],dekadyBCD[4][10]; Начальный адрес первого 0х110, второго 0х190. Функция void inc_chass(char *chas_dec,char *chas_bcd); Тогда вызов функции inc_chass(&dekady[1][0],&dekadyBCD[1][0]); должен передать указателю chas_dec значение 0х11А, а указателю chas_bcd значение 0х19А. Однако при прогоне в протеусе указателю chas_dec присваивается значение 0x0F1A, почему мне не понятно. Указателю chas_bcd присваивается правильное значение 0х19А.
  9. Да так и есть - предупреждение "illegal conversion between pointer types". Однако переписав вызов функции: inc_chass(&(dekady[1][0]),&(dekadyBCD[1][0])); //увеличить час приводит не совсем к нужному результату: chas_dec=0x0F1A, должен быть 0х11А, chas_bcd=0х19А, что есть правильно. Я знаю, однако, в дальнейшем, необходимо будет передавать указатель на разные области массива.
  10. Опять затупил. Помогите разобраться. Объявлены массивы: unsigned char dekady[4][10],dekadyBCD[4][10]; Начальный адрес первого 0х110, второго 0х190. Есть функция void inc_chass(unsigned char *chas_dec,unsigned char *chas_bcd){ if (++(*chas_dec)==24) *chas_dec=0; *chas_bcd=bin_to_bcd(*chas_dec); *(chas_bcd+1)=*chas_bcd&0x0f; *chas_bcd=(*chas_bcd>>4)&0x0f; } Ее прототип: void inc_chass(char *chas_dec,char *chas_bcd); Вызов функции: inc_chass(dekady,dekadyBCD[1][0]); //увеличить час Но в функцию передаются не те данные, которые хочу, т.е. не адрес начала массива "dekady" (0х110) и не адрес "dekadyBCD[1][0]" (0х19А), а вот что: Где не прав, подскажите. Может это длина адреса виновата, которая в char не помещается?
  11. Проверит на самой стабильной версии - работает. Теперь стабильный протеус найти надо.
  12. Может все таки протеус глючит? Подскажите стабильную версию.
  13. ANSEL=0. Но только в даташите, не сказано что данный регистр влияет на работу порта В.
×
×
  • Create New...