Easyelectronics.ru

Электроника для всех
Текущее время: 15 дек 2019, 07:04

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Типовые решения, подпрограммы, вопросы.
СообщениеДобавлено: 02 май 2011, 12:14 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2011, 23:22
Сообщения: 2364
Откуда: Украина, Запорожье
немного переписал код
Код:
void interrupt(tmr)
{
  if ((INTCON.B5)&&(INTCON.B2))
  {

    if (PORTA.B1 = 0)
    {
    INTCON.B1=0;
      temper = EEPROM_Read(0x01);
      temper = temper++;
      EEPROM_Write(0x01, temper);
      }
    if (PORTA.B2 = 0)
    {
    INTCON.B1=0;
        temper = EEPROM_Read(0x01);
      temper = temper--;
      EEPROM_Write(0x01, temper);
  }

}
}

но контроллер по-моему вообще ничего не хочет делать...
сначала был термометр, потом думал прикрутить термостат, термометр работал норм, после добавления кода прерывания - на дисплее - пусто, на ножках(на вых. которые) - 1
направьте на путь истинный!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Типовые решения, подпрограммы, вопросы.
СообщениеДобавлено: 02 май 2011, 15:00 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 25 ноя 2010, 12:21
Сообщения: 82
Откуда: СПб
Уже направили - очищать бит прерывания при обработке его.
У PIC не как у AVR, у него вектор прерываний(указатель на область в памяти, где находится обработчик) - один, и по этому вектору располагаются все обработчики, последовательно выполняясь.

В начале каждого обработчика должна быть проверка на соотвестиве того что вызвало прервание и разрешенности прерываний для этого источника(в твоем случае - (T0IE)&&(T0IF)), которую ты убрал в новом листинге. В принципе - не страшно, но, например, когда ты добавишь асинхронный UART на прерываниях по опустошению буферов приема/передачи, у тебя появяться проблемы с разбором источников прерываний. Это было первое.

А второе - раз ты не очищаешь T0IF после обработки(а можно и после проверки условия (T0IE)&&(T0IF) - я бы сказал что удобнее), то контроллер сразу же после выхода из прерывания попадаёт обратно в обработчик, и зацикливается там. таким образом у тебя контроллер постоянно выполняет код прерывания, а по сути - висит.

Третье - ты делаешь довольно медленную операцию(запись в EEPROM) в прерывании. На эту тему, конечно, много копий сломано, но если ты делаешь индийский код, от которого требуется просто работать в данном применении и не больше - это полбеды. А когда этот код захочешь расширить функционалом, то что ты будешь делать?

Или вот ещё:
Код:
OPTION_REG = 0b00000101;
INTCON = 0b10100100;
Проще и читабельнее сделать как множество операций И над битовыми масками разных флагов этих регистров, которые описаны в заголовочных модулях. И не только потому что красивше, но и потому что при переходе на другой контроллер у тебя всё поплывёт нафиг, и конфигурационные биты тоже - они по-разному раскиданы у разных PIC16х. На эту тему есть хорошая книжка(и не одна, рекомендую, меня от них вштырило), в формате PDF гуглится по словам "osa@pic24.ru" и "В. Тимофеев"

_________________
Путь в электронику, обычно, начинается с удара током.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Типовые решения, подпрограммы, вопросы.
СообщениеДобавлено: 02 май 2011, 20:18 
Старожил

Зарегистрирован: 29 янв 2010, 00:34
Сообщения: 818
Откуда: Санкт-Петербург
Насколько я помню, в MicroC конфиг. биты выставляются только через меню, в коде их прописать нельзя. Там вообще-то имхо многовато "детских" недоделок.

Ан насчет сдвига бит, если в хедере они обозначены не по номерам бита, а по адресам, то сдвинуть 1/0 на нужное кол-во бит не получится. Я в PICC уже обломался как-то с этим.

Достаточно удобно, на мой взгляд, записывать через структуры:
Код:
    OSCCONbits.IRCF0   = 1;
    OSCCONbits.IRCF1   = 0;
    OSCCONbits.IRCF2   = 1;
    OSCCONbits.IRCF3   = 1;        /* внутренний генератор 4МГц                */


В пределах одного семейства, как правило корректировать регистры все равно приходится, но работы не очень много.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Типовые решения, подпрограммы, вопросы.
СообщениеДобавлено: 03 май 2011, 01:35 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2011, 23:22
Сообщения: 2364
Откуда: Украина, Запорожье
спасибо за помощь, теперь контроллер не висит=)
Show индийский код

но в еепром в ячейке 00 - 16, в остальных - FF и не меняется при жмакании кнопок... что не так?
и чем плохо от того, что запись длинная? тормоза? как тогда лучше производить запись? или данные лучше держать в озу? книгу погуглю, но уже не сегодня..устал уже... завтра-послезавтра почитаю...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Типовые решения, подпрограммы, вопросы.
СообщениеДобавлено: 03 май 2011, 12:18 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 25 ноя 2010, 12:21
Сообщения: 82
Откуда: СПб
Ну почему не :
Код:
void interrupt(tmr)
{
  INTCON.B2=0;                     //TOIF clean
  if (INTCON.B5&&INTCON.B2)
  {

    if (PORTA.B1 = 0)
    {
      temper = EEPROM_Read(0x01);
      temper = temper++;
      EEPROM_Write(0x01, temper);
      }
    if (PORTA.B2 = 0)
    {
      temper = EEPROM_Read(0x01);
      temper = temper--;
      EEPROM_Write(0x01, temper);
  }

}
}

про епром ничего не скажу, не применял, прекращай индусить - это себе дороже

_________________
Путь в электронику, обычно, начинается с удара током.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Типовые решения, подпрограммы, вопросы.
СообщениеДобавлено: 03 май 2011, 13:11 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:08
Сообщения: 7549
Откуда: Алма-ата
Kramer писал(а):
или данные лучше держать в озу?...

Естественно, лучше.
У EEPROM ограниченный ресурс (порядка 100тысяч перезаписей), и при частом использовании оно рано или поздно сдохнет. Кроме того, работа с ним довольно заморочная по сравнению с ОЗУ. Поэтому обычно его используют только по необходимости - например, для сохранения критичных данных при пропадании питания. В большинстве случаев про него можно вообще забыть, хватает ОЗУ и флэша программ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Типовые решения, подпрограммы, вопросы.
СообщениеДобавлено: 22 дек 2011, 22:45 
Заглядывает иногда

Зарегистрирован: 25 окт 2010, 23:12
Сообщения: 72
Откуда: Магнитогорск
Вложение:
1.jpg
1.jpg [ 213.86 Кб | Просмотров: 6862 ]
Всем привет! После долгого запустения в программировании снова решил заняться, и вот какая загвоздка:установил MPLAB v8.56 и программку-прошивалку IC-Prog. Пишем, компилим кое-как и вот что показало окно программы айси-прог: вопрос: откуда берутся непонятные адреса после компиляции???? прога нормально запускаться в железе категорически отказывается!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Типовые решения, подпрограммы, вопросы.
СообщениеДобавлено: 25 дек 2011, 20:24 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 22:09
Сообщения: 44
Всё верно, PORTD не верно определён. Метка определяющая этот порт какой имеет вид?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Типовые решения, подпрограммы, вопросы.
СообщениеДобавлено: 13 янв 2015, 11:42 
Здравствуйте!

Зарегистрирован: 13 янв 2015, 10:58
Сообщения: 3
В программе на 1886ВЕ2У (аналог PIC17C756) опрашивается порт и в зависимости от установленного кода должна быть различная инициализация и логика работы и прерываний,
доступной памяти данных 4 банка по 217 байт, необходимо объединить память, но IAR 2.31E не позволяет объединить в union разные банки данных и не дает создать union размером больше 127 байт. Может кто работал со старым IAR-ом и подскажет как можно обойти данные ограничения или как можно получше выйти из ситуации вот как я пока делаю, пример для 2го банка:
Код:

typedef __bank2 union b2_1{
   struct {   
      #include "sens_R_bank2_1.h"   
   }r;
   struct {   
      #include "sens_V_bank2_1.h"   
   }v;
} bb21;

   
   
typedef __bank2 union b2_2{
   struct {   
      #include "sens_R_bank2_1.h"   
   }r;
   struct {   
      #include "sens_V_bank2_2.h"   
   }v;
} bb22;





банк я разделил на два объединения для того чтоб не превысить лимит в 127 байт на объединение
переменные упрятаны в структуры для каждого алгоритма
переменные описываются в отдельных файлах для каждого алгоритма.
для алгоритма R вызов переменной будет выглядеть так b21.r.var
минусов у такого подхода очень много может есть возможность сделать попонятнее?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Типовые решения, подпрограммы, вопросы.
СообщениеДобавлено: 22 фев 2015, 16:13 
Только пришел

Зарегистрирован: 05 май 2014, 12:56
Сообщения: 10
Всем привет, вчера установил MPLAB X v2.05 + XC8 достал запылившуюся плату с pic12f683, нашел дебаггер PicKit-3 и решил поюзать все это дело... До этого с pic -ами дело не имел, наверно по этому появился небольшой вопрос (возможно глупый), но столкнулся с такой вещью... сброс бита в позиции 5 почему то обнуляет бит 2. Вот мой код:

#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Function Select bit (MCLR pin function is MCLR)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown Out Detect (BOR enabled)
#pragma config IESO = ON // Internal External Switchover bit (Internal External Switchover mode is enabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)

#define _XTAL_FREQ 4000000 // this is used by the __delay_ms(xx) and __delay_us(xx) functions
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))

/******************************************************************************/
/* Main Program */
/******************************************************************************/
int main(void)
{
// PORT A Assignments
TRISIObits.TRISIO0 = 1; // R13 Analog Voltage In
TRISIObits.TRISIO1 = 1; // R14 Analog Voltage In
TRISIObits.TRISIO2 = 0; // Control Voltage/Rele OFF pin
TRISIObits.TRISIO3 = 1; // C6 Analog Voltage In
TRISIObits.TRISIO4 = 1; // R13 Analog Voltage In
TRISIObits.TRISIO5 = 0; // Rele ON pin

while(1)
{
GPIObits.GP2 = 1;
GPIObits.GP5 = 0;
__delay_ms(100);
GPIObits.GP2 = 0;
GPIObits.GP5 = 1;
__delay_ms(100);
}
}
Если строчки GPIObits.GP2 = 1; и GPIObits.GP5 = 0; поменять местами, то все работает как надо, иначе имеем импульс 100мс на GP5 и примерно 1мкс импульс на GP2. В листинге посмотрел компилятор формирует соответствующие bsf, bcf инструкции.
В чем фишка подскажите, DS я читал..))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Типовые решения, подпрограммы, вопросы.
СообщениеДобавлено: 25 фев 2015, 01:53 
Здравствуйте!

Зарегистрирован: 13 янв 2015, 10:58
Сообщения: 3
Show "lem21 писал



Единственное что приходит в голову прописать тоже самое не через структуру, а напрямую в регистр порта. Ну может еще оптимизацию отключить если она есть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Типовые решения, подпрограммы, вопросы.
СообщениеДобавлено: 26 фев 2015, 11:18 
Только пришел

Зарегистрирован: 05 май 2014, 12:56
Сообщения: 10
actclekcz писал(а):
Единственное что приходит в голову прописать тоже самое не через структуру, а напрямую в регистр порта. Ну может еще оптимизацию отключить если она есть.

Спасибо за ответ, но это не помогло. Вообще среда MPLAB удивила своей глючностью. Программатор PicKit-3 то видится, то не видится, зависит от погоды. При попытке отладитиь pic12f683 требует debug header, но когда подключаешь его говорит извините... там не поддерживается ваш контроллер. MPLAB X IPE тормозной и требует переоткрытия hex файла. Для моего кристалла инструкции bsf 5,2 (GP2=1) затем bcf 5,5 (GP5=0) приводят к обнулению GP2, перепробовал все..., соответственно С инструкции типа
if(adc_val>512) GPIO |=(1<<5);
else GPIO &= ~(1<<5);
нифига не работают правильно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Типовые решения, подпрограммы, вопросы.
СообщениеДобавлено: 26 фев 2015, 16:40 
Старожил

Зарегистрирован: 08 окт 2012, 00:25
Сообщения: 871
Читайте про RMW... знатные грабельки...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 5 часов


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB