Re: TavelDator
Postat: 3 augusti 2010, 02:12:01
Ska funka nu
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Kod: Markera allt
/*
Format från FTDI:
0bXQAA.AASS
X=Dont Care
Q=Fråga efter nuvarande state på addresen AAAA
AAAA=Addr, 0-15
S=State, 0=Av, 1=På, 2=Toggle
Exempel;
Slå på enhet 0:
0bX0000001
Toggla enhet 15:
0bX0111110
fråga efter läget på enhet 8:
0bX11000XX
X=Dont Care
*/
#define nexa_tx_pin GPIO.F2
#define Uart_Rx GPIO.F5
#define Uart_Tx GPIO.F4
const unsigned short nexa_house_code[28]={
2,2,2,2,2,1,2,2,2,2,3,1,2,3,2,1,2,2,3,2,2,1,2,3,1,3,2,0};
const unsigned short nexa_addr[16][5]={
{2,2,2,1,0},{2,2,1,2,0},{2,1,3,1,0},{2,1,2,2,0},
{1,3,2,1,0},{1,3,1,2,0},{1,2,3,1,0},{1,2,2,2,0},
{3,2,2,1,0},{3,2,1,2,0},{3,1,3,1,0},{3,1,2,2,0},
{2,3,2,1,0},{2,3,1,2,0},{2,2,3,1,0},{2,2,2,2,0}};
unsigned short uart_data;
unsigned int nexa_state=0;
void nexa_send_trit(unsigned short trit)
{
while(trit)
{
nexa_tx_pin=1;
delay_us(266);
nexa_tx_pin=0;
delay_us(266);
trit--;
}
delay_us(1280-266);
}
void nexa_send_start_bit()
{
nexa_tx_pin=1;
delay_us(266);
nexa_tx_pin=0;
delay_us(2640);
}
void nexa_send_command(unsigned short addr, unsigned short state)
{
unsigned short i,rep;
if(state==0)
nexa_state&=~(1<<addr);
else if(state==1)
nexa_state|=(1<<addr);
else if(state==2)
{
nexa_state^=(1<<addr);
state=(nexa_state>>addr)&1;
}
for(rep=0;rep<5;rep++)
{
nexa_send_start_bit();
i=0;
while(nexa_house_code[i])
nexa_send_trit(nexa_house_code[i++]);
if(state)
{
nexa_send_trit(1);
nexa_send_trit(3);
}
else
{
nexa_send_trit(2);
nexa_send_trit(2);
}
i=0;
while(nexa_addr[addr][i])
nexa_send_trit(nexa_addr[addr][i++]);
delay_us(10200);
}
}
unsigned short uart_get_byte()
{
uart_data=0;
if(Uart_Rx)return 0;delay_us(45);//(dly/2)
if(Uart_Rx)return 0;delay_us(100);
if(Uart_Rx)uart_data|=1;delay_us(100);
if(Uart_Rx)uart_data|=2;delay_us(100);
if(Uart_Rx)uart_data|=4;delay_us(100);
if(Uart_Rx)uart_data|=8;delay_us(100);
if(Uart_Rx)uart_data|=16;delay_us(100);
if(Uart_Rx)uart_data|=32;delay_us(100);
if(Uart_Rx)uart_data|=64;delay_us(100);
if(Uart_Rx)uart_data|=128;delay_us(100);
if(!Uart_Rx)return 0;delay_us(45);
return 1;
}
void uart_put_byte(unsigned short data)
{
Uart_Tx=0;delay_us(103);
if(data& 1) Uart_Tx=1; else Uart_Tx=0;delay_us(103);
if(data& 2) Uart_Tx=1; else Uart_Tx=0;delay_us(103);
if(data& 4) Uart_Tx=1; else Uart_Tx=0;delay_us(103);
if(data& 8) Uart_Tx=1; else Uart_Tx=0;delay_us(103);
if(data& 16) Uart_Tx=1; else Uart_Tx=0;delay_us(103);
if(data& 32) Uart_Tx=1; else Uart_Tx=0;delay_us(103);
if(data& 64) Uart_Tx=1; else Uart_Tx=0;delay_us(103);
if(data&128) Uart_Tx=1; else Uart_Tx=0;delay_us(103);
Uart_Tx=1;delay_us(103);
}
void main()
{
GPIO=0b010000; //Tx-pinnen ska vara 1
TRISIO=0b100000; //Ingång på Rx
CMCON0=7; //Ingen komparator
ANSEL=0; //Ingen ADC
OSCCON=0xFF; //8MHz
delay_ms(200);
while(1)
{
while(!uart_get_byte());
if(uart_data&0x40)
{
if((nexa_state>>((uart_data>>2)&0x0F))&1)
uart_put_byte(1);
else
uart_put_byte(0);
}
else
nexa_send_command((uart_data>>2)&0x0F,uart_data&3);
}
}