ChipKiller писал(а):... прочитать порт можно и проще, зачем так все усложнять?
в этом и вопрос,я догадался что делаю все через ж...... -поэтому просьба подскажите как,сам пока догнать не могу!
ChipKiller писал(а):... прочитать порт можно и проще, зачем так все усложнять?
... дело не в этомSSERG писал(а):в этом и вопрос,я догадался что делаю все через ж..
... любая программа начинается с задачи и понимания того, что Вам нужно получить.... угадать тяжело и помочь тожеSSERG писал(а):Подскажите как можно проще опрашивать много портов и сравнивать значения с другими портами
koldune писал(а):Товарищи, помогите![]()
Алексей, доброго здоровья!aleksey_gregul писал(а):koldune писал(а):Товарищи, помогите![]()
Зачем так делаете?
Почитайте про input capture.
Специально для этого случая.
Код: Выделить всё
OCR1A += OCR1A_PERIOD;Ага, вот что значит переэкономить аппаратные ресурсы. В реальном проекте у меня было немного не так (об этом ниже), а тут я на ходу решил сэкономить ещё один канал захвата и в результате не всегда будет правильно.avreal писал(а):Если счётчик защиты меньше или равен 1, то вычисляется delta = icp1_new - icp1_prev (содержимое будет правильным даже если было переполнение таймера!). Если нужно, delta дальше идёт в фильтрацию, чтобы сгладить колебания.
Код: Выделить всё
ISR(TIMER1_CAPT_vect) {
uint16_t icr1_new = ICR1;
// отодвигаем прерывание TIMER1_COMPA_vect максимально далеко от момента захвата
OCR1A = icr1_new - 1;
TIFR1 = 1 << OCF1A; сбрасываем на всякий случай, вдруг как раз на предыдущих командах поднялся
// Обрабатываем icr1_new как описано выше, только как признак "предыдущего импульса не было"
// используем флаг, поднимаемый в TIMER1_COMPA_vect. Тут его сбрасываем.
// ...
}Код: Выделить всё
//----------
// Global Constants
//----------
extern int mas[]={0x36,0x2E,0x1E,0x35,0x2D,0x1D,0x33,0x2B,0x1B}; // ìàññèâ ñîñòîÿíèé êëàâèàòóðû
extern int alfa,betta,nfreq,timer_lo,timer_hi;
extern int flag_1=0;
extern char mean_time=0,
St_M2=0;
FREV=0; // Ôëàã ðåâåðñà. FREV=0 - ðåâåðñà íåò
REV=0;
COLS=0; // ñ÷åò÷èê äëÿ âûâîäà çíà÷åíèé íà èíëèêàòîð äëÿ øòàíãè
COLL=0; // ñ÷åò÷èê äëÿ âûâîäà çíà÷åíèé íà èíëèêàòîð äëÿ ëåíòû
COLL_1=0;
mas2[]={0,1,2,3,4,5,6,7,8,9};
i=0;
extern char freq []={0xD8,0xDC,0xDF,0xE1,0xE3,0xE5,0xE7,0xE8,0xEA,0xEB,0xEC}; // means of freq from 50 to 100 Hz step 5
static int counter = 0;
extern void delay_ms (unsigned int delay);
Код: Выделить всё
extern int mas[]={};
Код: Выделить всё
int mas[]={0x36,0x2E,0x1E,0x35,0x2D,0x1D,0x33,0x2B,0x1B};
Код: Выделить всё
extern int mas[]Код: Выделить всё
interrupt [TIM2_COMP] void timer2_comp_isr(void) // прерывание Т2 по совпадению
{
OCR2++;
********ОБРАБОТЧИК ПРЕРЫВАНИЯ***********
}Код: Выделить всё
unsigned char cmd_RESET[5] = {0xE3, 0x10, 0x00, 0x30, 0x00};
unsigned char const cmd_PPWM[5] = {0xE3, 0x10, 0x00, 0x50, 0x00};
unsigned char const cmd_DEADT[5] = {0xE3, 0x00, 0x36, 0x24, 0x00}; // 4.5 мкс мертвое время 24
unsigned char const cmd_ACB[5] = {0xE3, 0x10, 0x00, 0x61, 0x00}; // 50 Гц базовая частота
unsigned char const cmd_ACC[5] = {0xE4, 0x00, 0x60, 0x05, 0x00}; // ускорение
unsigned char const cmd_F[5] = {0xE4, 0x00, 0x62, 0x3C, 0x99}; // задание синусоидальной частоты
unsigned char const cmd_FPWM[5] = {0xE3, 0x10, 0x00, 0x42, 0x00}; //10.6 кГц частота ШИМ
unsigned char const cmd_VBOOST[5] = {0xE3, 0x00, 0x6C, 0x00, 0x00}; // 0 % амплитуда синуса при нулевой синусоидальной частоте
unsigned char const cmd_MODIN[5] = {0xE3, 0x00, 0x75, 0xFE, 0x00}; // 99 % индекс модуляции синуса (амплитуда)
unsigned char const cmd_FTOUT[5] = {0xE4, 0x00, 0x6A, 0x00, 0x08}; // таймаут после аварии
unsigned char const cmd_VBDEC[5] = {0xE4, 0x00, 0xC9, 0x03, 0x55}; // 119 % значение Vbus при котором начинается снижение скорости торможения
unsigned char const cmd_VBRAKE[5] = {0xE4, 0x00, 0x64, 0x03, 0x55}; // 119 % значение Vbus при котором появляется сигнал вкл. тормозного VT
unsigned char const cmd_VBROWN[5] = {0xE4, 0x00, 0x66, 0x80, 0x00}; // 50 % нижнее значение Vbus при откл. ШИМ и появляется сигнал аварии
unsigned char const cmd_VBOVR[5] = {0xE4, 0x00, 0x68, 0x03, 0x71}; // 123 % верхнее значение Vbus при откл. ШИМ и появляется сигнал аварии
unsigned char const cmd_FORW[5] = {0xE3, 0x10, 0x00, 0x10, 0x00}; // "вперед"
unsigned char const cmd_REW[5] = {0xE3, 0x10, 0x00, 0x11, 0x00}; // "назад"
unsigned char const cmd_STOP[5] = {0xE3, 0x10, 0x00, 0x20, 0x00}; // "стоп"
unsigned char const read_ACTF[3] = {0xD1, 0x00, 0x85}; // прочитать текущюю синусоидальную частоту
unsigned char const read_SETUP[3] = {0xD0, 0x00, 0xAE}; // прочитать регистр установок
unsigned char const read_VBUS[3] = {0xD1, 0x00, 0x79}; // прочитать напряжение питания инвертора (DC_bus)
unsigned char const read_F[3] = {0xD1, 0x00, 0x62}; // прочитать задание на синусоидальную частоту
unsigned char const read_STATUS[3] = {0xD0, 0x00, 0xC8}; // прочитать регистр статусаmd5sum писал(а):Можно константы объявить с префиксом PROGMEM, не забыв #include <avr/pgmspace.h>
И при необходимости использовать функции описанные в указанном pgmspace.h
unsigned char const code cmd_PPWM[5] = {0xE3, 0x10, 0x00, 0x50, 0x00};
bit process_command(unsigned char const code *pcmd);