snn_krs Опубликовано 2 мая, 2018 Поделиться Опубликовано 2 мая, 2018 Если вы подключете внешний делитель, 100 К, то ток через делитель 50 мкА будет постояно. При использовании внутреннего ИОН, вы можете включать его только на время использования. Если вы компаратором проверяете напряжение батарейки, то это можно делать 1 раз в минуту. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
my504 Опубликовано 2 мая, 2018 Поделиться Опубликовано 2 мая, 2018 Для измерения батарейки лучше вообще питать МК без стабилизатора, а измерять опорное напряжение. Но я так понял, что товарисчу нужен компаратор для иных целей.... 0 戦う前に相手のベルトの色に注目 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
IMXO Опубликовано 2 мая, 2018 Поделиться Опубликовано 2 мая, 2018 6 часов назад, Aleksandr1111 сказал: Что если в качестве ИОН использовать просто делитель из 2 резисторов около 68 и 100 кОм? Тогда и ток будет поменьше а даташит почитать? Цитата 6.3 Analog Input Connection Considerations A simplified circuit for an analog input is shown in Figure 6-3. Since the analog pins are connected to a digital output, they have reverse biased diodes to VDD and VSS. The analog input, therefore, must be between VSS and VDD. If the input voltage deviates from this range by more than 0.6V in either direction, one of the diodes is forward biased and a latchup may occur. A maximum source impedance of 10 kΩ is recommended for the analog sources. Any external component connected to an analog input pin, such as a capacitor or a Zener diode, should have very little leakage current. внутренние сопротивление источника аналогового сигнала максимум 10кОм 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторовОбязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Aleksandr1111 Опубликовано 2 мая, 2018 Поделиться Опубликовано 2 мая, 2018 3 часа назад, IMXO сказал: максимум 10кОм Да, да, я это уже видел, спасибо. Придется смириться с током, потребляемым U reference. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Paul Mort Опубликовано 19 декабря, 2018 Поделиться Опубликовано 19 декабря, 2018 Товарищи! подскажите? в протеусе на команде GOTO MAIN он переходит на GOTO D1 (в подпрограмме задержки), всё перекопал, всё равно туда уходит постоянно, даже если задержку делать не таймером, а циклами в mplab при отладке всё работает как надо LIST p=16f873 __CONFIG 03FF1H STATUS EQU 03H PORTB EQU 06H TRISB EQU 86H TMR1L EQU 0EH ;младший байт таймера TMR1H EQU 0FH ;старший байт таймера PIR1 EQU 0CH ;тут флаг переполнения таймера TMRN EQU 21H T1CON EQU 10H ORG 0x0000 GOTO MAIN ORG 0x0100 MAIN CLRF PORTB BCF STATUS, 0 ;убираем С BCF STATUS, 2 ;убираем Z BSF STATUS, 5 CLRF TRISB ;portb выход BCF STATUS, 5 BSF T1CON,4 ;предделитель 1/8 BSF T1CON,5 RIGHT BTFSC STATUS,0 ;проверка флага С GOTO LEFT ;С поднят BSF PORTB,0 CALL DELAY MOVF PORTB, 0 ;значение огоньков в акум CLRF PORTB ;огоньки пропадают CALL DELAY ;вызов задержки MOVWF PORTB ;возвращаем сохранённое значение огоньков RLF PORTB ;вращаем порт GOTO RIGHT LEFT BCF STATUS, 0 ;очистка С MOVF PORTB,0 ;знакомая уже процедура CLRF PORTB CALL DELAY MOVWF PORTB RLF PORTB CALL DELAY MOVF PORTB,1 ;здесь проверяем порт на 0, сохраняем самого в себя BTFSS STATUS, 2 ;если portb = 0, поднимается флаг Z, проверяем его GOTO LEFT BCF STATUS, 0 ;после вращения еденичка из 7го бита уходит в бит С, очищаем его GOTO RIGHT ;всё заново DELAY MOVLW 02H ;переполнения ожидаем 2 раза MOVWF TMRN D2 CLRF TMR1L CLRF TMR1H BSF T1CON,0 ;запуск таймера D1 BTFSS PIR1, 0 ;ждём флаг переполнения GOTO D1 BCF T1CON,0 ;остановка таймера BCF PIR1, 0 ;очистка флага DECFSZ TMRN ;декрементируем счётчик, если 0 пропускаем след ком GOTO D2 RETURN END 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 19 декабря, 2018 Поделиться Опубликовано 19 декабря, 2018 оно и в протеусе работает нормально , вы просто не умеете с ним работать. брейкпоинты в протезе поставить никак? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
serg123 Опубликовано 19 января, 2019 Поделиться Опубликовано 19 января, 2019 Здравствуйте, недавно начал писать проект в MPLAB X 5.0 под pic16f1788 и столкнулся с такой проблемой. Прога компилируется, Proteus с ней работает, но вот при попытки запустить симуляцию в proteus из под mplab x выскакивает такое сообщение. Selected microcontroller is not supported by Proteus VSM. В консоле дебугера такое сообщение Initializing simulator ValidateControlPoints() - Assembly lookup of ControlPointMediator Failed! The debugger could not be started. Terminating debug session.User program finished. Может кто сталкивался с этим, в чем может быть косяк. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
солар Опубликовано 20 января, 2019 Поделиться Опубликовано 20 января, 2019 В том, что в протеусе нет такого микроконтроллера. Во всяком случае в том, который у меня 8.6 SP2. 6 часов назад, serg123 сказал: not supported Не поддерживается 0 Я не раздаю удочки. Я продаю рыбу. Ссылка на комментарий Поделиться на другие сайты Поделиться
serg123 Опубликовано 20 января, 2019 Поделиться Опубликовано 20 января, 2019 8.7 и 8.8 он уже присутствует и даже работает, а вот mplab ругается, недавно проверил pic18f2515, такая же фигня 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
UVV Опубликовано 2 февраля, 2019 Поделиться Опубликовано 2 февраля, 2019 Подскажите пожалуйста по энкодеру. Дребезг при повороте вала энкодера на контактах бывает? И если есть такой факт то можно ли организовать анти дребизг программно или лучьше в железе? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
солар Опубликовано 2 февраля, 2019 Поделиться Опубликовано 2 февраля, 2019 Бывает, т.к. там механические контакты. Комплексный подход лучше всего. Но это с избытком. 0 Я не раздаю удочки. Я продаю рыбу. Ссылка на комментарий Поделиться на другие сайты Поделиться
UVV Опубликовано 2 февраля, 2019 Поделиться Опубликовано 2 февраля, 2019 @солар в железе можно конденсаторами устранить звон а как программно? разве что программно первое вхождение байта при повороте вала энкодера Только что, солар сказал: Комплексный подход лучше всего. Но это с избытком. Пусть с избытком зато точно не сбойнёт. У меня начало положено регистрировать положение вала через прерывание по изменению уровня на PORTB.B7 и B6. а уровни изменяются что при замыкании что при размыкании. Сложновато для моего пропитого мозга 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 2 февраля, 2019 Поделиться Опубликовано 2 февраля, 2019 5 часов назад, UVV сказал: можно ли организовать анти дребизг программно или лучьше в железе? лучше программно. 5 часов назад, UVV сказал: программно? кейсами. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
солар Опубликовано 3 февраля, 2019 Поделиться Опубликовано 3 февраля, 2019 10 часов назад, UVV сказал: точно не сбойнёт Этт как организовать. Задумка в чём - если есть возможность обработать программно, то нафига не нужно лишнее железо. (Ради чего всё и задумывалось N десятков лет назад.) 10 часов назад, UVV сказал: через прерывание по изменению уровня Покрась и выбрось эту затею и больше никогда к ней не возвращайся. Используй поллинг. IMXO уже показал суть. Моё исполнение несколько проще: Button= PINx; while(1) { delay_ms(10); oldButton= Button; Button= PINx; if(oldButton && !Button) itsPressed(); // момент замыкания if(!oldButton && Button) itsUnPressed(); // момент размыкания } 1 Я не раздаю удочки. Я продаю рыбу. Ссылка на комментарий Поделиться на другие сайты Поделиться
UVV Опубликовано 3 февраля, 2019 Поделиться Опубликовано 3 февраля, 2019 (изменено) @IMXO @солар спасибо что отозвались. К сожалению не смогу коней на переправе поменять много проделано.@солар в цикле while задержка delay_ms(10); это очень много другие условия будут из за этого обрабатываться с задержкой. Попробую с начало в железе конденсаторами сделать если выйдет то оставлю как есть. union un { unsigned long t; unsigned short x[4]; }un; //============================================================================== unsigned short k=0, i=0, m_0=0, m_1=0, m_2=0, m_3=0; unsigned short b_0=0, b_1=0; unsigned int kk=0; char txt[4]; //============================================================================== sbit LCD_RS at RC0_bit; sbit LCD_EN at RC1_bit; sbit LCD_D7 at RA3_bit; sbit LCD_D6 at RA2_bit; sbit LCD_D5 at RA1_bit; sbit LCD_D4 at RA0_bit; sbit LCD_RS_Direction at TRISC0_bit; sbit LCD_EN_Direction at TRISC1_bit; sbit LCD_D7_Direction at TRISA3_bit; sbit LCD_D6_Direction at TRISA2_bit; sbit LCD_D5_Direction at TRISA1_bit; sbit LCD_D4_Direction at TRISA0_bit; //============================================================================== void main() { un.t=0; ADCON1=0b00000111; PORTC=0b01000000; TRISC=0b00010000; TRISB=0b11111001; PORTB=0; OPTION_REG=0b00010111; INTCON=0b11010000; SSPCON=0b00100000; Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); //============================================================================== while(1) { ByteToStr(m_0, txt); Lcd_Out(1,1,txt); //============================================================================== if(b_0==1) //выбор 0 канала потенциометра и записи показаниу в потенциометр { PORTB.F1=1; PORTB.F2=0; if(m_0!=m_1) { PORTC.F6=0; Delay_ms(1); SSPBUF=0b00000000; Delay_ms(1); SSPBUF=m_1=m_0; Delay_ms(1); PORTC.F6=1; INTCON.RBIE=1; } } //============================================================================== if(b_0==2) //выбор 1 канала потенциометра и записи показаниу в потенциометр { PORTB.F1=0; PORTB.F2=1; if(m_0!=m_1) { PORTC.F6=0; Delay_ms(1); SSPBUF=0b00010000; Delay_ms(1); SSPBUF=m_1=m_0; Delay_ms(1); PORTC.F6=1; INTCON.RBIE=1; } } //============================================================================== if(b_0==3) { b_0=0; PORTB.F1=0; PORTB.F2=0; m_1=m_0; } } } //============================================================================== void interrupt(void) { if(INTCON.INTF&&!INTCON.T0IE) //нажатие кнопки энкодера { INTCON.INTF=0; INTCON.INTE=0; INTCON.T0IE=1; //запуск таймера кнопки энкодера для избежания дребезга TMR0=0; } if(INTCON.T0IF&&PORTB.F0&&!INTCON.RBIF) { INTCON.T0IF=0; INTCON.T0IE=0; INTCON.INTE=1; b_1=0; } if(INTCON.T0IF&&!PORTB.F0&&!INTCON.RBIF) //если не было дребизга переключаем //каналы на цифровом потенциометре { INTCON.T0IF=0; if(b_1>3) { INTCON.T0IE=0; INTCON.INTE=1; b_0++; b_1=0; i=0; INTCON.RBIE=1; } b_1++; } //============================================================================== if(INTCON.RBIF) //обрабодчик поворота вала энкодера через прерывание по //изменению уровня на портах RB6 и RB7 { k=PORTB; INTCON.RBIF=0; un.x[i++]=k>>6; if(i>3) { i=0; kk=un.t>>16; if(kk==0x203 || kk==0x301 || kk==0x100 || kk==0x2) //поворот завершён туда { INTCON.RBIE=0; kk=un.t=0; m_0++; //инкремент для передачи в буфер SPI } if(kk==0x200 || kk==0x001 || kk==0x103 || kk==0x302) //поворот завершён сюда { INTCON.RBIE=0; kk=un.t=0; m_0--; //дикремент для передачи в буфер SPI } } } } https://youtu.be/MXu0CmvcDQ0 Изменено 3 февраля, 2019 пользователем UVV 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 3 февраля, 2019 Поделиться Опубликовано 3 февраля, 2019 24 минуты назад, UVV сказал: в цикле while задержка delay_ms(10); это очень много другие условия будут из за этого обрабатываться с задержкой. ну неужто не понятно , что это сокращенный указатель на то, что код обработки просто вызывается каждые 10мс , и вызывается прерыванием по таймеру, причем чем меньше время таймера, тем выше качество обработки дребезга. я вообще не понимаю накой для обработки кнопки и энкодера использовать прерывания от ногадрыга это все делается по таймеру 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
солар Опубликовано 3 февраля, 2019 Поделиться Опубликовано 3 февраля, 2019 Всё верно. 2 часа назад, IMXO сказал: чем меньше время таймера, тем выше качество обработки дребезга Я б так не сказал. Ищем оптимальное. 0 Я не раздаю удочки. Я продаю рыбу. Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 3 февраля, 2019 Поделиться Опубликовано 3 февраля, 2019 я вел речь о приведенном выше коде обработке через кейсы. поиск оптимального в нем как раз не нужен , шаг энкодера формируется по четырем фронтам , что по сути есть подавление дребезга контактов, как-то в протезе даже крутил железную модель самого кейса на проверку дребезга , фронты дребезга всегда формируют нечетное кол-во импульсов и чем выше скорость опроса тем точнее обработка. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
UVV Опубликовано 7 февраля, 2019 Поделиться Опубликовано 7 февраля, 2019 Испробовал методы с кейсами не катит, в основном цикле проворонить обороты можно легко и свой метод тоже фигня. На ум пришло вот это. Правда не происходит полного цикла работы при повороте вала, а лишь на замыкание считывание порта Б в переменную размыкание и сравнение считанной переменной из порта Б и выполнение чего либо. За определение стороны вращения отвечают условия if(64==t_1) { t_0++; } if(128==t_1) { t_0--; } в общем изменение t_0 происходит после полного прохождения щелчка энкодера. В железе очень стабильно работает sbit LCD_RS at RD2_bit; sbit LCD_EN at RD3_bit; sbit LCD_D7 at RD7_bit; sbit LCD_D6 at RD6_bit; sbit LCD_D5 at RD5_bit; sbit LCD_D4 at RD4_bit; sbit LCD_RS_Direction at TRISD2_bit; sbit LCD_EN_Direction at TRISD3_bit; sbit LCD_D7_Direction at TRISD7_bit; sbit LCD_D6_Direction at TRISD6_bit; sbit LCD_D5_Direction at TRISD5_bit; sbit LCD_D4_Direction at TRISD4_bit; char txt[4]; unsigned short t_0=0, t_1=0; void main() { TRISA=TRISC=TRISD=TRISE=0; PORTA=PORTC=PORTD=PORTE=0; TRISB=0XFF; OPTION_REG=0B00010011; INTCON=0B11010000; ADCON1=0B0000110; Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); //============================================================================== while(1) { ByteToStr(t_0, txt); Lcd_Out(1,6,txt); } } //============================================================================== void interrupt(void) { if(INTCON.INTF&&!PORTB.F0&&INTCON.INTE&&!OPTION_REG.INTEDG&&!INTCON.T0IE) { INTCON.INTF=0; INTCON.INTE=0; INTCON.T0IE=1; TMR0=0; } //============================================================================== if(INTCON.T0IF&&!PORTB.F0&&!INTCON.INTE&&!OPTION_REG.INTEDG&&INTCON.T0IE) { INTCON.T0IF=0; INTCON.T0IE=0; OPTION_REG.INTEDG=1; INTCON.INTE=1; t_1=PORTB<<5; } //============================================================================== if(INTCON.T0IF&&PORTB.F0&&!INTCON.INTE&&!OPTION_REG.INTEDG&&INTCON.T0IE) { INTCON.T0IF=0; INTCON.T0IE=0; INTCON.INTE=1; } //============================================================================== if(INTCON.INTF&&PORTB.F0&&INTCON.INTE&&OPTION_REG.INTEDG&&!INTCON.T0IE) { INTCON.INTF=0; INTCON.INTE=0; INTCON.T0IE=1; TMR0=0; } //============================================================================== if(INTCON.T0IF&&PORTB.F0&&!INTCON.INTE&&OPTION_REG.INTEDG&&INTCON.T0IE) { INTCON.T0IF=0; INTCON.T0IE=0; if(64==t_1) { t_0++; } if(128==t_1) { t_0--; } OPTION_REG.INTEDG=0; INTCON.INTE=1; } //============================================================================== if(INTCON.T0IF&&!PORTB.F0&&!INTCON.INTE&&OPTION_REG.INTEDG&&INTCON.T0IE) { INTCON.T0IF=0; INTCON.T0IE=0; INTCON.INTE=1; } } И всё что потребляет по ресурсам 0 1144 Used RAM (bytes): 7 (2%) Free RAM (bytes): 345 (98%) Used RAM (bytes): 7 (2%) Free RAM (bytes): 345 (98%) 0 1144 Used ROM (program words): 184 (2%) Free ROM (program words): 8008 (98%) Used ROM (program words): 184 (2%) Free ROM (program words): 8008 (98%) А так не как не могу догнать как считывать полный цикл щелчка энкодера если скорость вращения вала разная и при этом ещё убрать дребезг контактов при помощи таймера. А да и щелчки не пропускал что бы код. Было бы здорово узнать и понять. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 7 февраля, 2019 Поделиться Опубликовано 7 февраля, 2019 1 час назад, UVV сказал: Испробовал методы с кейсами не катит, в основном цикле проворонить обороты можно легко вы вообще читаете что вам пишут или нет ? В 03.02.2019 в 11:38, IMXO сказал: код обработки просто вызывается каждые 10мс, и вызывается прерыванием по таймеру причем здесь основной цикл? код по ссылке опробован и в симе и в железе , при тике=1мс код спокойно держит до 20 Гц , для эндкодера 24/12 это 100обр/мин , попробуйте руками крутануть эндкодер с такой скоростью.... а то получается как в одесском анекдоте Скрытый текст судья: Рабинович почему вы решили развестись со своей женой Р: Она таки не устраивает меня как женщина Голос из зала: Посмотрите на этого поца . значит всю Деребасовскую она устраивает , а его видите ли нет... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
солар Опубликовано 8 февраля, 2019 Поделиться Опубликовано 8 февраля, 2019 + 0 Я не раздаю удочки. Я продаю рыбу. Ссылка на комментарий Поделиться на другие сайты Поделиться
UVV Опубликовано 8 февраля, 2019 Поделиться Опубликовано 8 февраля, 2019 Enc_state <<= 2; //Помещаем новое в старое Enc_state |= PORTB; //Проверяем входные линии switch (Enc_state & 0x0F) { case 0b00000000 : break; //не изменилось case 0b00000001 : Count--; break; case 0b00000011 : Err_c = Err_c + 1; //запрещенное состояние break; case 0b00000010 : Count++; break; case 0b00000110 : Err_c = Err_c + 1; //запрещенное состояние break; case 0b00000111 : Count--; break; case 0b00000101 : break; //не изменилось case 0b00000100 : Count++; break; case 0b00001100 : Err_c = Err_c + 1; //запрещенное состояние break; case 0b00001101 : Count++; case 0b00001111 : break; //не изменилось case 0b00001110 : Count--; break; case 0b00001010 : break; //не изменилось case 0b00001011 : Count++; break; case 0b00001001 : Err_c = Err_c + 1; //запрещенное состояние break; case 0b00001000 : Count--; break; } if (Count == 8) // Если был шаг энкодера влево { .............. // то действие А Count = 4; } else if (Count == 0) // Если был шаг энкодера вправо { .............. // то действие Б Count = 4; } Err_c = Err_c + 1; //запрещенное состояние Err_c это переменная или нет если переменная то где что дальше с ней делается за циклом switch? если энкодер подключен к двум входам порта Б то откуда берутся изменения в 0b00001101 в третьем и четвертом бите. то есть к каким пинам по счёту энкодер подключен 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
UVV Опубликовано 8 февраля, 2019 Поделиться Опубликовано 8 февраля, 2019 (изменено) Откомпелировал этот код sbit LCD_RS at RD2_bit; sbit LCD_EN at RD3_bit; sbit LCD_D7 at RD7_bit; sbit LCD_D6 at RD6_bit; sbit LCD_D5 at RD5_bit; sbit LCD_D4 at RD4_bit; sbit LCD_RS_Direction at TRISD2_bit; sbit LCD_EN_Direction at TRISD3_bit; sbit LCD_D7_Direction at TRISD7_bit; sbit LCD_D6_Direction at TRISD6_bit; sbit LCD_D5_Direction at TRISD5_bit; sbit LCD_D4_Direction at TRISD4_bit; char txt[4]; unsigned short Count=0, Err_c=0, Enc_state=0, t=0; void main() { TRISA=TRISC=TRISD=TRISE=0; PORTA=PORTC=PORTD=PORTE=0; TRISB=0XFF; OPTION_REG=0B01111111; ADCON1=0B0000110; Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); //============================================================================== while(1) { ByteToStr(t, txt); Lcd_Out(1,6,txt); /*if((t_0=PORTB>>6)^ 0x03) { }*/ Enc_state <<= 2; //Ïîìåùàåì íîâîå â ñòàðîå Enc_state |= PORTB; switch (Enc_state & 0x0F) { case 0b00000000 : break; //íå èçìåíèëîñü case 0b00000001 : Count--; break; case 0b00000011 : Err_c = Err_c + 1; //çàïðåùåííîå ñîñòîÿíèå break; case 0b00000010 : Count++; break; case 0b00000110 : Err_c = Err_c + 1; //çàïðåùåííîå ñîñòîÿíèå break; case 0b00000111 : Count--; break; case 0b00000101 : break; //íå èçìåíèëîñü case 0b00000100 : Count++; break; case 0b00001100 : Err_c = Err_c + 1; //çàïðåùåííîå ñîñòîÿíèå break; case 0b00001101 : Count++; case 0b00001111 : break; //íå èçìåíèëîñü case 0b00001110 : Count--; break; case 0b00001010 : break; //íå èçìåíèëîñü case 0b00001011 : Count++; break; case 0b00001001 : Err_c = Err_c + 1; //çàïðåùåííîå ñîñòîÿíèå break; case 0b00001000 : Count--; break; } if (Count == 8) // Åñëè áûë øàã ýíêîäåðà âëåâî { t--; Count = 4; } else if (Count == 0) // Åñëè áûë øàã ýíêîäåðà âïðàâî { t++; Count = 4; } } } https://youtu.be/vQyoYVcd4A0 как то не считывает он данные с энкодера Изменено 8 февраля, 2019 пользователем UVV 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 8 февраля, 2019 Поделиться Опубликовано 8 февраля, 2019 29 минут назад, UVV сказал: если энкодер подключен к двум входам порта Б то откуда берутся изменения в 0b00001101 в третьем и четвертом бите. Наверное отсюда : 5 минут назад, UVV сказал: Enc_state <<= 2; Или нет ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
UVV Опубликовано 8 февраля, 2019 Поделиться Опубликовано 8 февраля, 2019 Так как я тупой и не смог сам осилить программу обработки команд энкодера я спиз... у кого то sbit LCD_RS at RD2_bit; sbit LCD_EN at RD3_bit; sbit LCD_D7 at RD7_bit; sbit LCD_D6 at RD6_bit; sbit LCD_D5 at RD5_bit; sbit LCD_D4 at RD4_bit; sbit LCD_RS_Direction at TRISD2_bit; sbit LCD_EN_Direction at TRISD3_bit; sbit LCD_D7_Direction at TRISD7_bit; sbit LCD_D6_Direction at TRISD6_bit; sbit LCD_D5_Direction at TRISD5_bit; sbit LCD_D4_Direction at TRISD4_bit; char txt[4]; unsigned short New=0, EncState=0, EncData=0, t_0=0, New_0=0; void main() { TRISA=TRISC=TRISD=TRISE=0; PORTA=PORTC=PORTD=PORTE=0; TRISB=0XFF; OPTION_REG=0B0111111; ADCON1=0B0000110; Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); while(1) { ByteToStr(t_0, txt); Lcd_Out(1,1,txt); if((New = PORTB >>6)!=New_0) { New_0=PORTB>>6; switch(EncState) { case 2: { if(New == 3) EncData++; if(New == 0) EncData--; break; } case 0: { if(New == 2) EncData++; if(New == 1) EncData--; break; } case 1: { if(New == 0) EncData++; if(New == 3) EncData--; break; } case 3: { if(New == 1) EncData++; if(New == 2) EncData--; break; } } EncState = New; if(EncData==252) { t_0++; //сюда пихать что надо выполнить при повороте вала туда энкодера EncData=0; } if(EncData==4) { t_0--; //сюда пихать что надо выполнить при повороте вала сюда энкодера EncData=0; } } } } да и не надо не какой дребезг устранять у энкодера и так работает в железе проверенно тут в архиве всё для протеуса и MikroC encoder.rar 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.