Visualizza messaggio singolo
Vecchio 07 luglio 07, 15:03   #45 (permalink)  Top
rivp6
User
 
L'avatar di rivp6
 
Data registr.: 11-10-2004
Residenza: out of Verona
Messaggi: 573
Della serie la pappa pronta...
MANCA SOLO LA CONFIGURAZIONE DEL TIMER E IL CALCOLO TON/TOFF

#define MAXCH 8 // tx channels
#define SIMU 1 // for simulator IDE
#define TXON 0 // transmit High
#define TXOFF 1 // transmit Low
#define TXSYNC 3 // transmit Sync
#define TXPIN PORTB.F0 // out pin
#define TICK 96 // definition time
#define FRAMELEN 18000 // 18 mS frame len

unsigned int Channels[MAXCH] ; // stick position
unsigned int TOnCh[MAXCH] ; // for calc
unsigned int TOffCh[MAXCH] ; // for calc
unsigned int TOnChTX[MAXCH] ; // for tx
unsigned int TOffChTX[MAXCH] ; // for tx
unsigned char Ch,i,t ;
unsigned char RadioMenu=0 ; // radio menu
unsigned char LastButton=0 ;
unsigned int TOn,TOff,SyncAD,SyncTX,Duration ;
unsigned int Counter=0 ;
unsigned char State=TXON ; // tx pin status

//TX interrupt
// 17 uS min duration
// 32 uS max duration (8Ch)
void interrupt()
{
if (INTCON.TMR0IF)
{
Counter++;
switch (State)
{
case TXON : if (Counter<TOn) TXPIN=1 ;
else
{
Counter=0 ;
State=TXOFF ;
**
break ;
case TXOFF : if (Counter<TOn) TXPIN=0 ;
else
{
Counter=0 ;
if (Ch==MAXCH) State=TXSYNC ;
else
{
Ch++ ;
TOn=TOnChTX[Ch] ; // for efficency
TOff=TOffChTX[Ch] ;
State=TXON ;
**
**
break ;
case TXSYNC : if (Counter<SyncTX) TXPIN=0 ;
else
{
Counter=0 ;
// protected TX data no memcpy o for cicle for efficency
TOnChTX[0]=TOnCh[0] ; TOffChTX[0]=TOffCh[0] ;
TOnChTX[1]=TOnCh[1] ; TOffChTX[1]=TOffCh[1] ;
TOnChTX[2]=TOnCh[2] ; TOffChTX[2]=TOffCh[2] ;
TOnChTX[3]=TOnCh[3] ; TOffChTX[3]=TOffCh[3] ;
TOnChTX[4]=TOnCh[4] ; TOffChTX[4]=TOffCh[4] ;
TOnChTX[5]=TOnCh[5] ; TOffChTX[5]=TOffCh[5] ;
TOnChTX[6]=TOnCh[6] ; TOffChTX[6]=TOffCh[6] ;
TOnChTX[7]=TOnCh[7] ; TOffChTX[7]=TOffCh[7] ;
Ch=0 ; // next frame
TOn=TOnChTX[0] ;
TOff=TOffChTX[0] ;
State=TXON ;
SyncTX=Sync ;
**
break ;
**
TMR0 = TICK;
// INTCON.TMR0F = 0;
**
INTCON = 0x20;
**

// init hardware card
void InitHW(void)
{
TRISB=0x00 ;
TRISA=0xFF ;
// set analog input...
Lcd_Init(&PORT;
Lcd_Cmd(Lcd_Clear) ;
**
// init interrupts
void InitInt(void)
{
TMR0=TICK ; // set interrupt time
INTCON = 0x20; // enable interrupt
**
// read n channels and calc TOn/TOff
void ReadADC(void)
{
int Ad ;
Duration=0 ;
for (i=0;I<MAXCH;i++)
{
Ad=Adc_Read(Ch);
Channels[i]=Ad ;
Ad+=1000 ; // min 1 mS
TOffCh[i]=Ad ; // NEGATIVE!
TOnCh[i]=2023-Ad ;
Duration+=2000 ;
**
SyncAD=FRAMELEN-Duration ;
**
// read keyboard
unsigned char ReadButton(void)
{
LastButton=0 ;
return LastButton ;
**
// display informations on LCD
void Display(void)
{
**
//------------------------------------------------------------------------------
void main(void)
{
InitHW() ;
ReadADC() ;
memcpy(&TOnChTX,&TOnCh,sizeof(TOnCh)) ;
memcpy(&TOffChTX,&TOffCh,sizeof(TOffCh)) ;
SyncTX=Sync ;
Ch=0 ;
TOn=TOnChTX[Ch] ;
TOff=TOffChTX[Ch] ;
InitInt() ;

for (;;)
{
switch (ReadButton()) // act for button pressed
{
case 0 : // no key pressed
break ;
**
Display() ;
ReadADC() ;
**
**
rivp6 non รจ collegato   Rispondi citando