Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 06 luglio 07, 22:20   #41 (permalink)  Top
User
 
L'avatar di MSchiepp
 
Data registr.: 21-01-2004
Residenza: Milano
Messaggi: 989
Citazione:
Originalmente inviato da Mrk89
...Nel "main" si leggono gli ADC e si pilotano altri dispositivi ( lettura pulsanti vari, pilotaggio display) e con l'interrupt si genera la trama degli 8 canali...quindi il timer interno deve dare un'interrupt ogni 20ms...giusto??
Dato che mi sembra tu non abbia particolare dimestichezza con le macchine a stati, che come ha consigliato RIVP6, sono la Soluzione (con la S maiuscola...) puoi incominciare con una semplificazione che puoi far evolvere in modo semplice e che non usa interrupt. Dato che mi sembra che tu stia usando un PIC supponiamo di avere un PIC a 4Mhz (è sufficiente per fare tutto, se poi vai più veloce, meglio).
All'inizio del ciclo di main carichi il timer0 (con prescaler /128) a 99d e azzeri il bit T0IF; il timer scatterà dopo 20 mS. Nel frattempo leggi i convertitori ed i tasti; se vedi che facendo tutto quello che devi fare rischi di superare i 20mS, dividi le operazioni in due: ad ogni giro di main fai una volta la lettura dei convertitori e la volta dopo la lettura dei tasti. Alla fine di ogni ciclo aspetti che il T0IF vada ad uno, il che segnala che sono passati i 20mS; ricarichi il timer a 99d, azzeri T0IF e generi gli otto impulsi usando il timer1 a 16 bit con risoluzione 1uS: azzeri il bit TMR1IF e carichi il timer con 65535-il valore in uS del ritardo che vuoi ottenere, setti il bit di uscita e aspetti che TMR1IF vada ad 1: nel caso peggiore hai un errore di 2 uS; quando hai finito di inviare i dati di ogni canale riprendi il loop principale e ti ritroverai ad aspettare il timer0 che segnala la fine dei 20mS... e così via.

Alla prossima puntata (se ci sarà) come trasformare questa struttura in una macchina a stati.

Michele
__________________
__________________________________________________
The worst day flying is better than the best day working.
MSchiepp non è collegato   Rispondi citando
Vecchio 06 luglio 07, 23:14   #42 (permalink)  Top
User
 
L'avatar di Mrk89
 
Data registr.: 29-05-2006
Residenza: Catania
Messaggi: 2.933
Citazione:
Originalmente inviato da MSchiepp
Dato che mi sembra tu non abbia particolare dimestichezza con le macchine a stati, che come ha consigliato RIVP6, sono la Soluzione (con la S maiuscola...) puoi incominciare con una semplificazione che puoi far evolvere in modo semplice e che non usa interrupt. Dato che mi sembra che tu stia usando un PIC supponiamo di avere un PIC a 4Mhz (è sufficiente per fare tutto, se poi vai più veloce, meglio).
All'inizio del ciclo di main carichi il timer0 (con prescaler /128) a 99d e azzeri il bit T0IF; il timer scatterà dopo 20 mS. Nel frattempo leggi i convertitori ed i tasti; se vedi che facendo tutto quello che devi fare rischi di superare i 20mS, dividi le operazioni in due: ad ogni giro di main fai una volta la lettura dei convertitori e la volta dopo la lettura dei tasti. Alla fine di ogni ciclo aspetti che il T0IF vada ad uno, il che segnala che sono passati i 20mS; ricarichi il timer a 99d, azzeri T0IF e generi gli otto impulsi usando il timer1 a 16 bit con risoluzione 1uS: azzeri il bit TMR1IF e carichi il timer con 65535-il valore in uS del ritardo che vuoi ottenere, setti il bit di uscita e aspetti che TMR1IF vada ad 1: nel caso peggiore hai un errore di 2 uS; quando hai finito di inviare i dati di ogni canale riprendi il loop principale e ti ritroverai ad aspettare il timer0 che segnala la fine dei 20mS... e così via.

Alla prossima puntata (se ci sarà) come trasformare questa struttura in una macchina a stati.

Michele
Ok ora è chiaro...
Il fatto è che non ho mai utilizzato interrupts software, ma ho usato sempre e solo quelli hardware provenienti dall'esterno del PIC...
Grazie per le dritte!!
__________________
Il filo attaccato all'antenna non mente mai....Troppo vento, si torna a casa....
I miei circuiti elettronici autocostruiti: Postbruciatore per ventole intubate ; Circuito luci per aeromodello-elimodello ; Rallenta servo con protezione da corto circuito
Mrk89 non è collegato   Rispondi citando
Vecchio 07 luglio 07, 00:18   #43 (permalink)  Top
User
 
L'avatar di rivp6
 
Data registr.: 11-10-2004
Residenza: out of Verona
Messaggi: 573
OT ON

il tempo è sempre tiranno... se:

- la topa non me la dà nel weekend
- se non si incastra qualche impianto dove lavoro
- se non trovo altro da fare

vedo di buttare giù due righe... magra consolazione

OT OFF
rivp6 non è collegato   Rispondi citando
Vecchio 07 luglio 07, 09:04   #44 (permalink)  Top
User
 
L'avatar di MSchiepp
 
Data registr.: 21-01-2004
Residenza: Milano
Messaggi: 989
Citazione:
Originalmente inviato da rivp6
vedo di buttare giù due righe... magra consolazione
Escludendo la 2, spero (per te) di non vedere le tue due righe...

Michele
__________________
__________________________________________________
The worst day flying is better than the best day working.
MSchiepp non è collegato   Rispondi citando
Vecchio 07 luglio 07, 15:03   #45 (permalink)  Top
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
Vecchio 07 luglio 07, 15:07   #46 (permalink)  Top
User
 
L'avatar di rivp6
 
Data registr.: 11-10-2004
Residenza: out of Verona
Messaggi: 573
Accidenti con il copia incolla sul forum si perdono i pezzi. meglio allegare.
Files allegati
Tipo file: txt TX.c.txt‎ (4,7 KB, 114 visite)
rivp6 non è collegato   Rispondi citando
Vecchio 07 luglio 07, 23:41   #47 (permalink)  Top
UserPlus
 
L'avatar di protomax
 
Data registr.: 21-02-2005
Residenza: TURIN 45N 7E
Messaggi: 1.951
Invia un messaggio via MSN a protomax
Mannaggia non pensavo di destare tutto questo interesse ...bravi ragazzi ..avanti cosi'
__________________
C'e' chi vola con l'elettronica e chi fa volare l'elettronica ... entrambi volano.
________________________________________________
ProtoMax proudly present: ProtoMeter 2
32bit ARM core + ZigBee Radio all in one Telemetry system
... Next on this forum
protomax non è collegato   Rispondi citando
Rispondi

Bookmarks




Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


Discussioni simili
Discussione Autore discussione Forum Commenti Ultimo Commento
Costruzione F3j zedona Aeromodellismo Progettazione e Costruzione 138 01 aprile 08 14:10
trasformare un vecchio radiocomando rc in disuso in un radiocomando per simulatori rc maxpresident Simulatori 2 09 giugno 07 17:53
radiocomando G3 con Reflex o radiocomando esky... squalofly Simulatori 2 07 gennaio 06 18:19
quindi.. PURCHE SIA OMOLOGATo... sozi Elimodellismo Principianti 6 22 novembre 05 16:44
costruzione jnfarin Aeromodellismo 3 07 novembre 01 13:40



Tutti gli orari sono GMT +2. Adesso sono le 19:19.


Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002