Zdravim, neviem si rady s otacanim potenciometra (ALPS s motorcekom) suvisle. Motorcek poteniometra je zapojeny cez dva vystupne piny MCU cez H mostik. Program robi to ze vyskakuje z cyklu kde by mal cakat na koniec prichadzajucich sprav. Cize vysledne mi MCU robi to ze ledka zapojena na danom vystupe blika, a blika to vtedy kym neskonci vysielanie (to by bolo dobre az na to blikanie).
Chcel by som aby niekto pomohol vyriesit problem, a to dosiahnut stalu uroven 5V (log1) na vystupe RB2 alebo RB3, od vtedy a do vtedy kym prichadzaju spravy (VOLUME_UP alebo VOLUME_DOWN) od vysielaca.
Vysielac a jeho funkia vysielania hlasitosti VOLUME_DOWN:
case 0b00001000:
{
while (RB3_bit==0)
{
Octet (VOLUME_DOWN);
Octet (VOLUME_DOWN);
Octet (VOLUME_DOWN);
delay_ms(100);
}
break;
}
Funkcia VOLUME_UP je robena uplne rovnako az nato ze vysiela po dobeznej hrany na RB2. Vysielac vysiela min 3 byty s ktorych ked su aspon 2byty rovnake(receiveBTN()), prijimac vykona funkciu (switch). Sirka celej trojice oktetov je 26,1ms, a jedneho bytu je 8,67ms.
Kod prijimaca:
[code]
#define VOLUME_UP 0x87 //Kod prijaty pri stlaceni Volume UP
#define VOLUME_DOWN 0x9C //Kod prijaty pri stlaceni Volume DOWN
unsigned char receiveBTN();
unsigned char STANDBY();
unsigned char rcvd;
int VOLUME_STATE;
unsigned char oktet1;
unsigned char oktet2;
unsigned char oktet3;
unsigned char getch();
main()
{
OSCCON = 0b11101001; //Interny oscilator 4Mhz
OPTION_REG = 0b00000000;
//PORTA register
PORTA = 0b00000000;
TRISA = 0b00000000;
ANSELA = 0b00000000;
LATA = 0b00000000;
WPUA = 0b00000000;
//PORTB register
PORTB = 0b11100000;
TRISB = 0b11100010;
ANSELB = 0b00000000;
LATB = 0b00000000;
WPUB = 0b11100000;
//Periferie
RXDTSEL_bit = 0; //RX/DT funkcia na RB1
T1CON = 0xC0;
CM1CON0 = 0x00;
CM1CON1 = 0x00;
SPBRGL = 0b00110011;
SPBRGH = 0b00000000;
TXSTA = 0b00000000;
RCSTA = 0b10111000;
BAUDCON = 0x00;
INTCON = 0b00000000;
RCIF_bit= 0;
while(1)
{
delay_ms(10);
RCREG=0;
delay_ms(10);
while(RCIF_bit==0); //caka na prijatie spravy
rcvd=receiveBTN();
switch(rcvd)
{
case MUTE:
{
RA3_bit=!RA3_bit;
delay_ms(10);
break;
}
case VOLUME_UP:
{
RB2_bit=1;
delay_ms(10);
while(getch()!=0) //z cyklu vyskakuje, jedno aky velky ci maly delay je nadstaveny, v pripade ak je prilis velky tak cely program sa uplne zacykly
{
delay_ms(130);
if(RCIF_bit==0)break;
}
delay_ms(10);
RB2_bit=0;
break;
}
case VOLUME_DOWN:
{
RB3_bit=1;
while(getch()==VOLUME_DOWN) //funkguje rovnako ako VOLUME_UP, v inych intervaloch blikania :D, ;(
{
delay_ms(100);
}
delay_ms(10);
RB3_bit=0;
delay_ms(10);
break;
}
default:
{
break;
}
}
delay_ms(10);
RCREG=0;
delay_ms(10);
}
}
unsigned char getch() // prijme jeden oktet
{
int cnt;
cnt=0;
while(RCIF_bit==0)
{
cnt=cnt+1; //pocitadlo urcene nato by sa nezacyklil program pri funkcii hlasitosti
if(cnt>1000)return 0;
}
return RCREG;
}
unsigned char receiveBTN()
{
unsigned char oktet1;
unsigned char oktet2;
unsigned char oktet3;
oktet1 = getch(); // caka na odpoved od uzivatela
oktet2 = getch();
oktet3 = getch();
if((oktet1==oktet2)||(oktet2==oktet3)||(oktet1==oktet3))
{
if(oktet1==oktet2)return oktet1;
if(oktet2==oktet3)return oktet2;
if(oktet1==oktet3)return oktet3;
}
return 0;
}[/code]
Rozdiel medzi funkciami VOLUME_UP a DOWN v prijimacej casti je kvoli mojej testovacej metode. Dialkove ma viacej funkcii ktore som vymazal z prilozeneho kodu, vsetky ostatne funkcie mi pracuju podla ocakavani az na ovladania hlasitosti.
MCU s ktorym robim je PIC16F1827. Pracujem v prostredi MikroC Pro for PIC v6.4.0.
V programovani MCU som zaciatocnik.