Перейти к содержанию

Общие вопросы по PIC-микроконтроллерам


NebsteR

Рекомендуемые сообщения

Если вы подключете внешний делитель, 100 К, то ток через делитель 50 мкА будет постояно. При использовании внутреннего ИОН, вы можете включать его только на время использования.

Если вы компаратором проверяете напряжение батарейки, то это можно делать 1 раз в минуту.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Для измерения батарейки лучше вообще питать МК без стабилизатора, а измерять опорное напряжение. Но я так понял, что товарисчу нужен компаратор для иных целей....

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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кОм

Ссылка на комментарий
Поделиться на другие сайты

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

  • 7 месяцев спустя...

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Товарищи! подскажите? в протеусе на команде 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

 

Ссылка на комментарий
Поделиться на другие сайты

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

  • 1 месяц спустя...

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Здравствуйте, недавно начал писать проект в 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. Может кто сталкивался с этим, в чем может быть косяк.

Ссылка на комментарий
Поделиться на другие сайты

В том, что в протеусе нет такого микроконтроллера. Во всяком случае в том, который у меня 8.6 SP2.

6 часов назад, serg123 сказал:

not supported

Не поддерживается

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Подскажите пожалуйста по энкодеру. Дребезг при повороте вала энкодера на контактах бывает? И если есть такой факт то можно ли организовать анти дребизг программно или лучьше в железе? 

Ссылка на комментарий
Поделиться на другие сайты

@солар в железе можно конденсаторами устранить звон а как программно?

 

разве что программно первое вхождение байта при повороте вала энкодера 

 

encoder_1.gif.64eac0eaec173a5f791dfd4cee16e007.gif

Только что, солар сказал:

Комплексный подход лучше всего. Но это с избытком.

Пусть с избытком зато точно не сбойнёт. 

У меня начало положено регистрировать положение вала через прерывание по изменению уровня на PORTB.B7 и B6. а уровни изменяются что при замыкании что при размыкании. Сложновато для моего пропитого мозга

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, UVV сказал:

можно ли организовать анти дребизг программно или лучьше в железе? 

лучше программно.

 

5 часов назад, UVV сказал:

 программно?

кейсами.

Ссылка на комментарий
Поделиться на другие сайты

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(); // момент размыкания

}

 

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

@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

Изменено пользователем UVV
Ссылка на комментарий
Поделиться на другие сайты

24 минуты назад, UVV сказал:

в цикле while задержка delay_ms(10); это очень много другие условия будут из за этого обрабатываться с задержкой.

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

я вообще не понимаю накой для обработки кнопки и энкодера использовать прерывания от ногадрыга это все делается по таймеру

Ссылка на комментарий
Поделиться на другие сайты

Всё верно.

2 часа назад, IMXO сказал:

чем меньше время таймера, тем выше качество обработки дребезга

Я б так не сказал. Ищем оптимальное.

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

я вел речь о приведенном выше коде обработке через кейсы. 

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

 

 

Ссылка на комментарий
Поделиться на другие сайты

Испробовал методы с кейсами не катит, в основном цикле проворонить обороты можно легко и свой метод тоже фигня. На ум пришло вот это. Правда не происходит полного цикла работы при повороте вала, а лишь на замыкание считывание порта Б в переменную размыкание и сравнение считанной переменной из порта Б и выполнение чего либо. За определение стороны вращения отвечают условия 

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;
}
}

5c5c58f0bfa58_.GIF.c74919d32e9828d92ea1a781560c59d1.GIF

И всё что потребляет по ресурсам
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%)

 

А так не как не могу догнать как считывать полный цикл щелчка энкодера если скорость вращения вала разная и при этом ещё убрать дребезг контактов при помощи таймера.

А да и щелчки не пропускал что бы код. Было бы здорово узнать и понять.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, UVV сказал:

Испробовал методы с кейсами не катит, в основном цикле проворонить обороты можно легко

вы вообще читаете что вам пишут или нет ? 

 

В 03.02.2019 в 11:38, IMXO сказал:

 код обработки просто вызывается каждые 10мс, и вызывается прерыванием  по таймеру

причем здесь основной цикл? код по ссылке опробован и в симе и в железе , при тике=1мс код спокойно держит до 20 Гц , для эндкодера 24/12 это 100обр/мин , попробуйте руками крутануть эндкодер с такой скоростью....

а то получается как в одесском анекдоте

Скрытый текст

судья: Рабинович почему вы решили развестись со своей женой

Р: Она таки не устраивает меня как женщина

Голос из зала: Посмотрите на этого поца . значит  всю Деребасовскую она  устраивает , а его видите ли нет...

 

Ссылка на комментарий
Поделиться на другие сайты

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 в третьем и четвертом бите. 

то есть к каким пинам по счёту энкодер подключен

 

Ссылка на комментарий
Поделиться на другие сайты

Откомпелировал этот код

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

как то не считывает он данные с энкодера

Изменено пользователем UVV
Ссылка на комментарий
Поделиться на другие сайты

29 минут назад, UVV сказал:

если энкодер подключен к двум входам порта Б то откуда берутся изменения в 0b00001101 в третьем и четвертом бите. 

Наверное отсюда :

5 минут назад, UVV сказал:

Enc_state <<= 2;

Или нет ?

Ссылка на комментарий
Поделиться на другие сайты

Так как я тупой и не смог сам осилить программу обработки команд энкодера я спиз... у кого то

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;
}
}
}
}

да и не надо не какой дребезг устранять у энкодера и так работает в железе проверенно 

5c5dc2dbc0177_.GIF.18c4d315b706b24213f498892c08c4e6.GIF

тут в архиве всё для протеуса и MikroC encoder.rar 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...