Vai al contenuto
PLC Forum


Telecomando Rf A 12 Bit


mario8686

Messaggi consigliati

Salve,

ho bisogno ancora del vostro aiuto

sto tentando di progettare un circuitino con pic 16f84A in grado di generare in sequenza tutti le combinazioni di 12 bit ,

Il pic in questione dispone di 12 uscite ma ripartite in 8 su portB e 4 su portA

c'è un modo sempre in linguaggio c per unificare le 12 uscite su un unico registro?? unsure.gif

Link al commento
Condividi su altri siti


Crei un intero da 16 (long se non ricordo male con il "C" CSC), fai le tue operazioni sulla variabile e poi separi i 2 bytes e li butti sulle porte.

Però faresti prima lavorando direttamente in asm sui registri.

Link al commento
Condividi su altri siti

come si separano i due byte??

mah..sono alle prime armi con la programmazione in c

mi servirebbe qlk (=qualche) info piu dettagliata...

**

regolamento

j) Divieto d'usare le K al posto di CH o C (perkè, cosa...), non come non, xche' come perché, x come per...........

Modificato: da Livio Migliaresi
Link al commento
Condividi su altri siti

Un semplice modo è questo:

unsigned int dato; // variabile intera a 16 bit

portb = dato; // scrive il byte meno significativo su portb

porta = dato >> 8; // scrive il byte più significativo su porta

se usi il compilatore della CCS devi sostituire 'int' con 'long' o int16.

Ciao.

Link al commento
Condividi su altri siti

Grazie a tutti per le risposte ho trovato finalmente un pò di tempo per tentare di realizzare questo progetto che voglio condividere con tutti voi.

Allora scopo iniziale è quello di realizzare un circuito che, mediante un pic16F84A un integrato MM53200 (codifica) e un modulo aurel di trasmissione a 433.92Mhz, sia in grado di generare tutte le combinazioni ottenibili con 12 bit. La parte hardware è abbastanza semplice basterà collegare le 12 uscite del pic sugli ingressi del codificatore...ma ecco che mi sorge il primo dubbio wink.gif nel datasheet del MM53200 si vede che sugli ingressi del codificatore vanno normalmente collegati i dip switch per cui stato logico 0 corrisponde a interruttore chiuso a massa mentre stato logico 1 interrutore aperto...invece collegando su quegli ingressi le uscite del mio pic avrò che lo stato logico 1 corrisponde a 5V. Funzionerà comunque in queste condizioni il mio MM53200???

Per quanto riguarda il codice ho tentato di scriverlo in C ma anche qui non so se può effetivamente funzionare:

void main() {

int a;

int b;

int c;

TRISB = 0

TRISA = 0

PORTB = -1

PORTA = 0

for (b=0, b<255, b++) {

PORTB++;

Delay_ms(50);

}

for (a=0, a<15, a++) {

PORTA++;

PORTB= -1;

for (c=0, c<255, c++) {

PORTB++;

Delay_ms(50); //nella codifica MM53200 ogni pacchetto di 12 bit dura 11.52 ms e

//viene trasmesso per tre volte per una durata complessiva di

//11.52 x 3 = 34.56 ms per cui 50 ms sono piu che sufficienti.

} } }

che ne pensate di questo codice?

potrebbe funzionare??

Link al commento
Condividi su altri siti

Da un esame sommario non credo.

Devi innestare i due loop uno nell'altro

...................
PORTB = 0
PORTA = 0

..............

for (i=0, i=16, i++){
     for (b=0, b=255, b++) {
          PORTB++;
          Delay_ms(50);
     }
     PORTA++;
     Delay_ms(50);
} 

In questo modo passi da 0000.0000.0000 a 1111.1111.1111 senza soluzione di continuità

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

1 - non usare abbreviazioni da chat o SMS, son vietate dal regolamento perchè rendono i messaggi meno comprensibili ed irritano molto (nel mio caso moltissimo)

2 - i loops son solo 2, quello interno genera tutti i codici sulla porta B ed è ripetuto ad ogni variazione della porta A. Puoi usare l'istruzione While testando direttamente il valore delle porte A e B

Link al commento
Condividi su altri siti

Le chiedo le mie scuse per aver utilizzato inizialmente abbreviazioni da sms.

Nonostante seguo da un pò le interessanti discussioni del forum sono neo registrato e non ho fatto attenzione a leggere il regolamento quindi chiedo le mie scuse e mi complimento per la serietà e la professionalità con cui gestite il sito.

Ritornando al codice Livio mi conferma che il frammento di codice da lei postato è quello giusto vero?

Perchè ragionandoci sopra dovrebbe funzionare ma l'unico valore che i due cicli for non vanno a generare dovrebbe essere 0000.0000.0000.0000 perchè partirebbe direttamente incrementando di 1 PORTB che è inizializzata a 0. quindi di otterebbe come primo valore non 0000.0000.0000.0000 ma 0000.0000.0000.0001

sto sbagliando qlks nel ragionamento??

Link al commento
Condividi su altri siti

1 - Non c'è problema, l'importante è aver capito. Poi sul forum ci consideriamo tutti colleghi ed amici indipendentemente dall'età, professione, titoli di studio, etc., quindi il semplice ed amichevole "tu" va più che bene.

2 - Veniamo al problema tecnico.

Se tu, come fai, alla partenza poni PORTA = 0 e PORTA = 0 generi tutti i codici, anche 0000.0000.0000. L'unica precauzione è che quando ripeti i due loops devi ripetere anche l'azzeramento della porta.

A mo di esempio considera il tutto come una function o sub routine (che ho chiamato rollcode()) Ogni volta che la richiami questa parte dallo stato 0 e genera tutti i codici.

Controlla il codice e....togli i punti o sostituiscili con altre istruzioni


rollcode()
{
...................
  PORTB = 0
  PORTA = 0
  Delay_ms(50);
..............

  for (i=0, i=16, i++){
      for (b=0, b=255, b++) {
         PORTB++;
         Delay_ms(50);
      }
      PORTA++;
      Delay_ms(50);
  } 
}

Link al commento
Condividi su altri siti

ciao Livio. Avevo anche io pensato di aggiungere il delay dopo l'azzeramento di PORTA e PORTB. Adesso mi trovo con il ragionamento. Per ottimizzare ulteriormente potrei, alla fine del programma, impostare PORTA=1111 e PORTB=1111.1111 in modo da verificare la fine del programma con l'accensione fissa di eventuali led posti sulle dodici uscite.

comunque grazie mille per avermi assistito alla prima stesura de codice in C. E' sempre bello trovare persione appassionate di elettronica anche perchè siamo ormai pochi.

Saluti!! Alla prossima biggrin.gif

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...