Jump to content
NebsteR

Pic. Общие Вопросы

Recommended Posts

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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кОм

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

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

максимум 10кОм

Да, да, я это уже видел, спасибо. Придется смириться с током, потребляемым U reference.

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites
                     

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

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

 оно и в протеусе работает нормально , вы просто не умеете с ним работать.

брейкпоинты в протезе поставить никак?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

not supported

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

Share this post


Link to post
Share on other sites

8.7 и 8.8 он уже присутствует и даже работает, а вот mplab ругается, недавно проверил pic18f2515, такая же фигня

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Бывает, т.к. там механические контакты.

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

Share this post


Link to post
Share on other sites

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

 

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

 

encoder_1.gif.64eac0eaec173a5f791dfd4cee16e007.gif

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

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

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

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

Share this post


Link to post
Share on other sites
5 часов назад, UVV сказал:

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

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

 

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

 программно?

кейсами.

Share this post


Link to post
Share on other sites
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(); // момент размыкания

}

 

Share this post


Link to post
Share on other sites

@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

Edited by UVV

Share this post


Link to post
Share on other sites
24 минуты назад, UVV сказал:

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

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

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

Share this post


Link to post
Share on other sites

Всё верно.

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

 

Share this post


Link to post
Share on other sites

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

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%)

 

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

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

Share this post


Link to post
Share on other sites
1 час назад, UVV сказал:

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

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

 

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

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

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

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

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

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

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

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

 

Share this post


Link to post
Share on other sites
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 в третьем и четвертом бите. 

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

 

Share this post


Link to post
Share on other sites

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

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

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

Edited by UVV

Share this post


Link to post
Share on other sites
29 минут назад, UVV сказал:

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

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

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

Enc_state <<= 2;

Или нет ?

Share this post


Link to post
Share on other sites

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

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 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
    • By Reptile
      Доброго времени суток. Пытаюсь восстановить работоспособность колонок Top Device TDE 261/2.1. Колонки не раз ремонтировалась по части УНЧ, при очередном ремонте по ошибке (одинаковые разъемы) с трансформатора было подано переменное питающее напряжение на входы (разъем AUX/MP3) аудиопроцессора PT2313L  (3,10,14 ноги - AGND, R_IN2 L_IN2). В результате чего выгорел сам аудиопроцессор PT2313L. PT2313L был заменен. Но колонка по прежнему не запускается. Как я понял, не запускается сам PT2313L, на его аудиовыходах (ноги 24, 25) сигнала нет. Передняя панель работает: индикация, кнопки, енкодер. Имеется подозрение, что вместе с процессором выгорели линии DATA и/или CLK на MCU, так как MCU и PT2313L соединены по этим линиям напрямую друг с другом. В МК и всей этой цифровой штуке не очень шарю, не знаю, как грамотно проверить работоспособность этой цифровой части, поэтому прошу помощи - Возможно ли какими-либо способами восстановить колонку или уже всё... 
      Из приборов, к сожалению, только мультиметр, осциллограф отсутствует.
      Ниже немного измерений.
      Напряжения на линиях: STD-BY-ждущий режим (в скобках рабочий режим):
      DATA - 2.31В (1.9В).
      CLK - 0.125В (0.135В).
      Сопротивление между выводами:
      CLK_MCU-DATA_MCU - 47 Ом. 
      CLK_MCU/DATA_MCU-GND - около 0.22 Ом и там и там. Звонится в обе стороны.
      Питание MCU 5В, (4.6В STD-BY-ждущий режим, 4.0В рабочий режим и со временем также почему-то может падать до 3.6В)
      MCU - не известен, нет маркировки. 18 Выводов, DIP.
      Ноги MCU, которые удалось опознать:
      1 - DATA
      18 - CLK
      3 - GND (?)
      5 - GND (?)
      ? - они соединены вместе
      14 - VCC
      17 - not used (n/a)
      15, 16 - OSC
      ET6202 - управление индикатором, Control LED drive circuit
      Фото плат (под сполером) и даташиты прилагаются.
      Схемы данных колонок не имеется. Все что удалось найти это схема чуть более старшей модели TDE280/2.1, с данными колонками она мало что общего имеет, лишь общий принцип, узлы довольно сильно отличаются, но прикреплю на всякий, для общей информации.
      PT2313L
      ET6202
      TDE280
       
    • By Илья Говжеев
      Поделитесь опытом , кто уже пробывал из arduino сделать программатор pic? 

    • By Терентенко Андрей
      Добрый день! Имею следующую ситуацию : на базе  PIC16f676  создал приблуду для "управления нештатной магнитолой с руля", а именно  сигнал с руля это 4,8в и в зависимости от нажатой кнопки падает дискретной до 0.8в мк с помощью АЦП отслеживает  на магнитолу паралельно кнопкам кинул оптрони которыми управляет МК. Питание от LM с фильтрующими конденсаторами. При тестових прогонах всё работало как надо (программно реализовано защиту от дребезга аж на 0.1 сек в поисках решений) и в машине  и от штатного БП . Но заметил закономерность сейчас на улице - 2 и при первом запуске минут 5, МК "шумит" несоотвецтвует нажатия на руле кнопке  на магнитоле ! Сигнал с руля смотрел стабильный без дребезга , притом когда тестил вынес магнитолу подключил всё работало гуд но пока устанавливал закручивал она остыла и начинались эти тацы . Кто что подскажет? МК или ЛМ могут так реагировать на температуру ? Прошу прощения у модераторов за повторение теми (может в этом разделе будет актуальней)
    • By Splav
      Речь пойдет о таймере цикличного включения вентиляции гаража.
      Стояла задача обеспечить принудительную вентиляцию гаража.
      Оставлять включенным вентилятор круглые сутки - неоправданно.
      Включать его периодически вручную... Неудобно и лишено смысла.
      Поэтому было решено включать его на определенное время через разные интервалы времени, в зависимости от субъективного восприятия наличия сырости в гараже.
      Вменяемых вариантов в продаже я не нашел.
      Можно, конечно, приобрести на Али программируемый суточный таймер или что-то подобное...
      Да, можно, но мне кажется, что собрать из подручных деталей тоже можно, ну и мозги потренировать.
      За основу был выбран PIC12F675, потому что он у меня был.
      По уму здесь должен стоять PIC12F629, он дешевле, в нем нет АЦП, который в конструкции не используется и отключен.
      Итак.
      Время работы выбрано фиксированным и неизменным - 1 час.
      Время простоя - в зависимости от режима.
      1 час - 2 часа - 3 часа.
      (Изначально я планировал другие задержки: 2-3-5 часов. На практике в моих гаражных условиях эти интервалы оказались слишком большими)
      Индикация осуществляется всего 1 светодиодом.
      Переключение режимов и управление - всего 1 кнопкой.
      Схема:

      Коротко о работе:
      Кнопка.
      Опрос кнопки 10 раз в секунду. Антидребезг и подавление помех 0,3с - 3 опроса подряд кнопка нажата.
      Короткое нажатие на кнопку(от 0,3 до 2 с) - переключение режимов по кругу. 1 - 2 - 3 - OFF - 1 - 2 -  ....
      Длинное нажатие на кнопку (дольше 2 с) - смена состояния реле.
      Если оно было включено - выключается.
      Если было выключено - включается. Интервалы работы реле при этом соответствуют режиму.
      В режиме OFF длинное нажатие ничего не меняет.
      Переключение режима или смена состояния реле происходят при отпускании кнопки.
      Светодиод.
      Индикация режимов светодиодом:
      1 - 1 раз в 2 секунды загорается, если реле не включено. Проблеск света.
            1 раз в 2 секунды гаснет, если реле включено. Проблеск тени.
      2 - 1 раз в секунду загорается, если реле не включено.
            1 раз в секунду гаснет, если реле включено.
      3 - 2 раза в секунду загорается, если реле не включено.
            2 раза в секунду гаснет, если реле включено.
      OFF - загорается раз в 5 секунд. Контроль того, что МК не завис.
      Режимы работы.
      Время работы циклического таймера по режимам:
      1 - 1 час работы / 3 часов отдых. 6/24
      2 - 1 час работы / 2 часа отдых.  8/24
      3 - 1 час работы / 1 часа отдых.  12/24
      Работа.
      При отключении питания, пока не разрядились конденсаторы фильтра, МК отключает все выходы, сохраняет текущие данные в память, ждет 15 сек в таком состоянии и возобновляет работу, если отключение было кратковременным и емкостей фильтра питания хватило.
      Если отключение питания было длительным то, при возобновлении питания, загружает сохраненные данные из памяти и продолжает работу.
      При первом включении, после программирования МК, устройство работает в 1-ом режиме.
      Программа писалась в MPLab X IDE v4.05.
      Прошивка:fan_cycle_timer.hex

      Плата для устройства не разрабатывалась. Все было собрано на макетке.
      В блоке питания использован стандартный трансформатор для монтажа на плату ТПК 2х9V с 2-мя вторичными обмотками на 9В.
      Использовал только одну из них. Вторая - не подключена, в "воздухе"
      Реле - HLS-14F1D-DC12V-C. С обмотка на 12В, и одной группой переключающих контактов на 10А/240VAC.
      Устройство собрано в корпусе щитка для автоматов на 8 модулей. Производитель VIKO.
      Закреплена плата на щиток через резьбовые дистанционные втулки с резьбой М3.
      В качестве вентилятора - вытяжной вентилятор диаметром 125мм ВЕНТС 125С
      Устройство на данный момент отработало в гараже все лето, температура воздуха в тени доходила до 32 градусов.
      Перегревов элементов и зависаний контроллера пока не было.
       
      Несколько фото для общего представления о конструкции.

  • Сообщения

    • Согласен, этот совет пожалуй самый полезный в данном разделе. Как бы не хотели вам сделать приятный сюрприз, получится только ерунда. Я свою жену кое-как приучил, лучше говорю дай денег. Я какой надо паяльник себе сам куплю, а если не куплю - значит не очень и нужен был. Уж тот возраст, когда был рад любым носкам на 23 февраля прошел.  И если эти вот красивые и модные станки для бритья можно терпеть (хотя что их менять, если привык годами), то инструмент не удобный терпеть это ни куда не годиться.   И то что, к сожалению, даже самое лучшее на вид приспособление из магазина всё равно нужно под себя "колхозить" - тоже соглашусь. 
    • Кто против щитов,их мнение и так понятно. Я,например,против сабвуферов и всей акустики в ЗЯ и с ФИ..и естественно против подобных АС,роликов и мнений их авторов. К Вам вопрос.Зачем Вы здесь критикуете щиты ГИ,это цель такая или от нечего делать? Вот как раз бас-гитару от контрабаса на щите ГИ очень даже можно отличить! Чего не скажешь про АС с ФИ и в ЗЯ - сплошная каша гудящая своими корпусами. Контрабас только на щитах и слышно. Возникает смутное сомнение,Вы наверное щиты ГИ не слышали никогда...или со слух подсел?
    • Организуйте отрицательное напряжение импульсным преобразователем. В Интернете схем на них как грязи осенью.
    • Насколько мне известно, 4-х пиновый вентилятор управляется скважностью. Частота не играет роли и выбирают 0,1 - 5 кГц. , напряжение импульсов 5В., можно и до напряжения питания вентилятора. Но у одних вентиляторов макс. обороты при постоянном 0, а у других мак. обороты при+5 В на управляющем пине. По номеру не определить, лучше попробовать.
  • Покупай!

×
×
  • Create New...