Програмирование pic на СИ.

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Програмирование pic на СИ.

Сообщение uldemir »

= присваивание
== сравнение

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

if (porta.RA0==1) {
iliich
Потрогал лапой паяльник
Сообщения: 318
Зарегистрирован: Вс апр 25, 2010 13:37:02

Re: Програмирование pic на СИ.

Сообщение iliich »

знаю но не выходит
не выдает 1
http://s52.radikal.ru/i137/1401/d4/1dc098d6b9bc.jpg
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Програмирование pic на СИ.

Сообщение dosikus »

PA0 после RESET аналоговый ...
iliich
Потрогал лапой паяльник
Сообщения: 318
Зарегистрирован: Вс апр 25, 2010 13:37:02

Re: Програмирование pic на СИ.

Сообщение iliich »

я новичок скажите поподробнее в чем моя ошибка

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

Re: Програмирование pic на СИ.

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

iliich писал(а):скажите поподробнее в чем моя ошибка
В том, что Вы начали не с чтения документации и изучения камня.
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Програмирование pic на СИ.

Сообщение Ghost in shell »

как вывести частоту работы таймера на RC3? Я вывел флаг прерывания по переполнению TMR0.

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

RC3 = T0IE;

Но частотомер ничего не показывает. Правда, частотомер свежесобранный.
Последний раз редактировалось Ghost in shell Ср янв 22, 2014 16:31:52, всего редактировалось 1 раз.
Кот гуляет сам по себе, но вблизи холодильника.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

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

Дык, T0IE всегда равен единице :)
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Програмирование pic на СИ.

Сообщение Ghost in shell »

Нет, флаг сбрасывается программно. Этот код гарантированно рабочий.

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

if (T0IF && T0IE)  // ветка опроса флага прерывания по переполнению TMR0
   {
      T0IF = 0;    // сброс флага прерывания по переполнению TMR0
      TMR0+= 6;   // предзагрузка TMR0
      T0IE = 1;     // 1/0 разрешение/запрет прерывания по переполнению TMR0
      RC3 = T0IE;
        if(cnt_pause)   cnt_pause--;

   }            // конец ППОП TMR0
Кот гуляет сам по себе, но вблизи холодильника.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Програмирование pic на СИ.

Сообщение dosikus »

Ghost in shell писал(а): Этот код гарантированно рабочий.


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

if (T0IF && T0IE)  // ветка опроса флага прерывания по переполнению TMR0


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

RC3 = T0IE;



Это какой компилятор позволяет сей бред ?
Или это очень плохой компилятор, либо Вы не понимаете что пишете...
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Програмирование pic на СИ.

Сообщение Ghost in shell »

dosikus писал(а):Это какой компилятор позволяет сей бред ?
Или это очень плохой компилятор, либо Вы не понимаете что пишете...

Hi-Tech PIC C-compiler v9.60_std
а как правильнее?
Кот гуляет сам по себе, но вблизи холодильника.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Програмирование pic на СИ.

Сообщение dosikus »

Ghost in shell писал(а):а как правильнее?

А для начала смотреть хэдер , как прописаны сии дефайны .
Потом изучить листинг дизасемблера , где окажется что оперируем не битами в регистрах а символьными константами ...
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение urry »

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

#define F_MY 1000*2 // требуемая частота для выдачи 1000
#define F_IN  4000000 // частота на 0 таймер с учетом всех пределителей

#if F_IN/F_MY > 250
#error "увеличь чаcтоту на 0 таймер !!!"
#endif

#define CALC_TMR 256 - (F_IN/F_MY)


if (T0IF && T0IE)  // ветка опроса флага прерывания по переполнению TMR0
{
T0IF=0;
RC3^=1;
TMR0+= CALC_TMR;
}
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Програмирование pic на СИ.

Сообщение Ghost in shell »

urry
Спасибо. Но на RC3 получается частота в 2 раза меньше, чем расчетная на таймере.
Кот гуляет сам по себе, но вблизи холодильника.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение urry »

Ghost in shell, чудес не бывает. Даже в неисправном телевизоре работают законы физики (с) п/п-к Сухотский.
Код в студию.
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Програмирование pic на СИ.

Сообщение Ghost in shell »

urry писал(а):Код в студию.

Пожалуйста:
Спойлер

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

//pic16f72
#include   <pic.h>
__CONFIG (XT & WDTDIS & PWRTDIS & BOREN & UNPROTECT);
#define XTAL_FREQ 4000000      // задание частоты кварца для расчета частоты таймера
//Начало насторойки TMR1------------------------------------------------------------------
#define FTMR_IN XTAL_FREQ/4      // задание Fosc/4 (входная частота для таймера)
#define FTMR1_OUT  500          // частота после таймера (в данно случае, 500 Hz на индикаторы)
#define TMR1_ALL 65536 - (FTMR_IN/FTMR1_OUT)   // получение значения предделителя
#if TMR1_ALL > 65635
#error "слишком низкая частота ! измените значения пределителя !"// генерится при компиляции
#endif
//----------
#define TMR1_H TMR1_ALL>>8         // определение значения старшего байта предделителя TMR1 для 500 Hz
                           // сдвиг на 8 байт вправо? для 500Гц - F8
#define TMR1_L (int)TMR1_ALL&0x00FF   // определение значения младшего байта предделителя TMR1 для 500 Hz
                           // а как? 0x00FF в 16-рич = 255 в 10-тич - для 500Гц - 30
//Конец насторойки TMR1------------------------------------------------------------------
...
void interrupt isr(void) // обработчик прерываний
{
static char temp;
if (TMR1IF && TMR1IE) // опрос флага прерывания по переполнению TMR1.
 // TMR1 работает на динамическую индикацию. Частота 500 Гц.
{
 TMR1H = TMR1_H; //
 ///Важно !!!!  ----------
 TMR1L += TMR1_L; //
 // Приплюсовывая к младшему регистру таймера, мы компенсируем задержки,
 // вызванные сохранением контекста и пр - улучшаем точность счета
 TMR1IF = 0;  // сброс флага прерывания по переполнению TMR1
 // начало блока вывода на индикатор----------------------------------------------
...
// настройка TMR1------------------------------------------------------------------------
// регистр T1CON
T1CKPS1 = 0; // выбор коэфф. деления предделителя
T1CKPS0 = 0; // выбор коэфф. деления предделителя
T1OSCEN = 0; // выключить внутренний тактовый генератор модуля TMR1
TMR1CS  = 0; // 1 - выбран внешний (0 - внутренний, Fosk/4) источник тактового сигнала модуля TMR1
TMR1H = TMR1_H; // старший байт предзагрузки TMR1
TMR1L = TMR1_L; // младший байт предзагрузки TMR1 63536
TMR1IE = 1;  // Разрешение прерывания по переполнению TMR1
TMR1IF = 0;  // сброс флага прерывания по переполнению TMR1
TMR1ON = 1;  // включить TMR1
// конец настройки TMR1----------------------------------------------------------------
Кот гуляет сам по себе, но вблизи холодильника.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение urry »

не вижу криминала - вы настроили таймер на 500 Герц - при команде в прерывании RC3^=1; каждые 2 мс будет инвертироваться значение ножки - 2 мс уровень "0", 2 мс уровень "1". Итого частота с ножки будет 250 Герц.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Програмирование pic на СИ.

Сообщение uldemir »

Возникла задача, что нужно хранить и изредка изменять некоторые значения в неразрушаемой памяти контроллера pic18f45J11. Но у этого контроллера как таковой eeprom нету. Единственный выход хранить в памяти программ. Как это на microchip C18 такое организовать? про волшебное слово rom я знаю и использую. Т.е. я могу так просто взять

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

rom unsigned int calibrat;

TBLPTR = &calibrat;
TBLLAT = new_calibr_value;

И запускать последовательность записи? Или есть нюансы? Или еще, не нужно ли эту "переменную" вынести в какой отдельный блок от остальных констант? И как это сделать?
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение urry »

никто ничего нового не выдумал - размазывать содержание переменной по странице , чтобы увеличить количество перезаписей (гарантировано во флеш около 2000, кажется) - каждая новая запись по следующему адресу и так по кругу.
http://ww1.microchip.com/downloads/en/A ... lation.zip
electronik_tver
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн авг 05, 2013 12:18:46

Re: Програмирование pic на СИ.

Сообщение electronik_tver »

1. помогите пож ,

#define PORDDALLAS PORTD
#define TRISDALLAS TRISD
void Level_HIGH (unsigned char bitno) // номер пина передаем из другой функции, каждый раз разный напр 2
{
PORDDALLAS ( бла бла тут чтото написать нужно ) bitno =1; // должно быть эквивалентно RD2=1
TRISDALLAS (бла бла тут чтото написать нужно ) bitno =1; // должно быть эквивалентно TRISD2=1
}

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


и еще
2. не могу разобраться в синтаксисе, что реально это означает:

//----------
#define BITSET(var,bitno) ((var) |= 1 << (bitno))
#define BITCLR(var,bitno) ((var) &= ~(1 << (bitno)))
#define BITTST1(var,bitno) ((var) & (1 << (bitno)))
#define BITTST0(var,bitno) (!((var) & (1 << (bitno))))
#define BITINV(var,bitno) var=(var^(1 << (bitno)))
//----------
#define GR0 0
#define GR0_READ BITTST1(PORTA,GR0)
#define GR0_Off() {BITCLR(PORTA, GR0);}
#define GR0_IN() {BITSET(TRISA, GR0);}
#define GR0_OUT() {BITCLR(TRISA, GR0);}

часть разшифровал: GR0 = эт номер пина,

#define GR0_READ BITTST1(PORTA,GR0)
#define GR0_Off() {BITCLR(PORTA, GR0);}
#define GR0_IN() {BITSET(TRISA, GR0);}
#define GR0_OUT() {BITCLR(TRISA, GR0);}

=этим мы описываем что именно передаем в выражение PORTA или TRISA и GRO
осталось выяснить

1 (var) |= 1 << (bitno)
2 (var) &= ~(1 << (bitno))
3 (var) & (1 << (bitno))
4 !((var) & (1 << (bitno)))
5 var=(var^(1 << (bitno))

что это означает, Urry конечно вы узнали часть своего кода, можете разжевать пожалуйста? это все та же подпрограмма опроса DS1820, все поидее решение первого опроса и это отлично работало пока мне не потребовалось одной процедурой опрашивать последователно два датчика температуры на разных ножках
Поясните пожалуйста ))
electronik_tver
Открыл глаза
Сообщения: 54
Зарегистрирован: Пн авг 05, 2013 12:18:46

Re: Програмирование pic на СИ.

Сообщение electronik_tver »

Извините за беспокойство разобрался сам
http://eugenemcu.ru/publ/2-1-0-53
вот статейка хорошая если кому нужно
Ответить

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