Ср мар 10, 2010 00:09:31
ooogo писал(а):я сколько не мучался, пока кондюки по 0,1 мкФ не припоял к контактам энкодера, дребезг никак побороть не мог, но конечно при быстром вращении пропускает. Наверное самый хороший вариант - это валкодер из шаговика!
Ср мар 10, 2010 08:23:19
пробовал 0,01 визуально ориентируясь на ЖКИ чуть чуть хуже работает появляются глюки, при 0,1 мкФ глюков не видно, но видно пропуски при быстром вращении, наверное надо что-то среднее подбирать.0,1 мкФ - дофига, у меня 0,01 мкФ и все работает.
Сб янв 22, 2011 09:52:28
Сб янв 22, 2011 10:31:11
vovik15 писал(а):сделал опрос по перрыванию на RB6 (я пики програмирую)
if ( RBIF ==1 ) { RBIF = 0;
Сб янв 22, 2011 10:41:12
Сб янв 22, 2011 14:17:06
ooogo писал(а):vovik15 писал(а):сделал опрос по перрыванию на RB6 (я пики програмирую)
А прерывание по какому событию? должно быть на смену уровней
вот эта строчка что делает?
- Код:
if ( RBIF ==1 ) { RBIF = 0;
Сб янв 22, 2011 15:00:35
void interrupt isr (void){
//...
if ( RBIF && RBIE ) { //прерывание по RB4-RB7
if (!RB6){
enc_data++;
}
if (!RB7){
enc_data--;
}
RBIE = 0; //Запрет прерываний от энкодера
RBIF = 0;
}
//...
}
void main (void){
//...
while (!(RB7 && RB6)){} //Ожидание установки энкодера в "нейтраль"
__delay_ms(5);
RBIF = 0;
RBIE = 1; //Разрешение прерываний от энкодера
//...
}
void interrupt isr (void){
if ( RBIF && RBIE ){
Rb_Handler(); //Обработчик RB4:RB7
return;
}
if ( T0IF && T0IE ){
Tmr0_Handler(); //Обработчик TMR0
return;
}
//... и т.д.
}
Сб янв 22, 2011 15:22:55
INT_0:
in r16, SREG
push r16
sbic PinA, 6
rjmp DECREMENT
inc r17
pop r16
out SREG, r16
reti
DECREMENT:
dec r17
pop r16
out SREG, r16
reti
Сб янв 22, 2011 16:20:53
vovik15 писал(а):ooogo писал(а):vovik15 писал(а):сделал опрос по перрыванию на RB6 (я пики програмирую)
А прерывание по какому событию? должно быть на смену уровней
вот эта строчка что делает?
- Код:
if ( RBIF ==1 ) { RBIF = 0;
эта строчка сбрасавает флаг по прерыванию RB6
Сб янв 22, 2011 17:02:23
ooogo писал(а):разве в пиках флаг прерывания аппаратно не сбрасывается?
Сб янв 22, 2011 17:47:00
stas00n писал(а):vovik15, сделайте примерно так (пример для энкодера подключенного к RB6,RB7):
- Код:
void interrupt isr (void){
//...
if ( RBIF && RBIE ) { //прерывание по RB4-RB7
if (!RB6){
enc_data++;
}
if (!RB7){
enc_data--;
}
RBIE = 0; //Запрет прерываний от энкодера
RBIF = 0;
}
//...
}
void main (void){
//...
while (!(RB7 && RB6)){} //Ожидание установки энкодера в "нейтраль"
__delay_ms(5);
RBIF = 0;
RBIE = 1; //Разрешение прерываний от энкодера
//...
}
Прерывание должно быть настроено на отрицательный фронт.
В общем случае в прерывании всегда нужно проверять не только флаг прерывания, но и бит разрешения! Иначе, если у Вас используется более одного источника прерываний, и какое-то из них запрещено, оно все равно будет обработано, если возникнет прерывание от другого источника. Обычно в пиках для прерываний делают такую конструкцию:
- Код:
void interrupt isr (void){
if ( RBIF && RBIE ){
Rb_Handler(); //Обработчик RB4:RB7
return;
}
if ( T0IF && T0IE ){
Tmr0_Handler(); //Обработчик TMR0
return;
}
//... и т.д.
}
Сб янв 22, 2011 17:52:26
Сб янв 22, 2011 21:11:53
Сб янв 22, 2011 23:14:35
Вт янв 25, 2011 10:31:15
Не во всех PIC-ах.stas00n писал(а):ooogo писал(а):разве в пиках флаг прерывания аппаратно не сбрасывается?
Нет, не сбрасывается, т.к. вектор прерывания всего один, поэтому источник, вызвавший прерывание определяется программно, следовательно флаг прерывания тоже сбрасывать надо "вручную".
Чт янв 27, 2011 04:10:54
Чт янв 27, 2011 06:08:52
Чт янв 27, 2011 15:55:53
Чт янв 27, 2011 16:25:17
#include <htc.h>
#define _XTAL_FREQ 4000000
//...
__delay_ms(10); // Задержка 10 мс
__delay_us(250); // Задержка 250 мкс
Чт янв 27, 2011 16:36:49