Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Bit Banging

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] Bit Banging

Messaggioda Foto Utentefaberebaf » 1 nov 2012, 20:21

Salute a Tutti.

Vorrei impartire degli ordini ad un dispositivo di riproduzione sonora (SOMO-14D) attraverso un ATMEGA328.
Visto che non si tratta di un colloquio, eviterei di sprecare una SPI e quindi mi piacerebbe imparare a realizzare una connessione di tipo bit banging anche per usi futuri.
Nel datasheet del dispositivo si trovano queste informazioni :

forma_onda.png
forma_onda.png (27.82 KiB) Osservato 3873 volte
tempi.png
tempi.png (29.26 KiB) Osservato 3873 volte

In base a queste informazioni ho scritto e provato questa funzione :
Codice: Seleziona tutto
void invia_comando(uint16_t comando)
{
   PORTD |= (1 << CLK );       // tRESET
   _delay_ms(300);            
   PORTD &= ~( 1 << CLK );     // tSTART
   _delay_ms(2);            
                     
      for (uint8_t i=1; i <= 16; i++)
      {   
         if (comando & 0x8000)
            {PORTB |= (1 << DTA );}
            else
            PORTB &= ~( 1<<DTA );

         PORTD &= ~( 1 << CLK ); // tCL 
         _delay_us(100);         
         PORTD |= (1 << CLK );   // tCH
         _delay_us(100);
         comando <<= 1;         
      }
   PORTD |= (1 << CLK );       //
   _delay_ms(2);            // tSTOP
}

Per fortuna non funziona !.
Personalmente ho sempre diffidato dei programmi, non banali, che funzionano al primo colpo (ovviamente non banale per me e non, per esempio, per Foto UtenteTardoFreak, il concetto di banalità è soggettivo !).
Le connessioni fisiche dei dispositivi dovrebbero essere corrette e quindi parto dal codice.

La mia insicurezza nasce dalla trasposizione della grafica in codice.
In particolare, mentre mi è chiaro il concetto di "fronte di salita/discesa" (e cioè il tempo necessario per passare, stabilmente, da uno stato logico all'altro), non mi è chiaro come sia possibile intercettarlo attraverso il codice.
Inoltre, la somma di tDS(Time data setup) e tDH(time data hold) è di 51 us, mentre nella rappresentazione grafica sembra essere uguale al periodo totale di clock (200 us).

Insomma, come avrete capito, ho bisogno di tutto: consigli, correzioni, link ecc. ecc.

Un saluto a Tutti e grazie per la disponibilità.

Ps: in rete ho trovato del codice dedicato, ma sono sicuro di poter sbagliare da solo !.
Avatar utente
Foto Utentefaberebaf
66 3
New entry
New entry
 
Messaggi: 79
Iscritto il: 4 nov 2007, 19:51

0
voti

[2] Re: Bit Banging

Messaggioda Foto Utentesimo85 » 1 nov 2012, 20:42

Il codice non è molto chiaro..

Per usare un pin come funzione di CLK, non devi fare una OR, ma una XOR.
Esempio:
Codice: Seleziona tutto
CLK ^= 1;


Eviterei di usare la delay_ms usando invece i timer ed interrupt. Anzi, userei direttamente l'interfaccia seriale..
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: Bit Banging

Messaggioda Foto Utentefaberebaf » 2 nov 2012, 11:05

Grazie [user]gohan[/user] !

Non ho pubblicato tutto il codice, per non tediare ed anche perché il codice funziona, è "solo" la trasmissione che non avviene. :(
Il programma utilizza due pin in uscita, uno per il clock ed uno per i dati
Codice: Seleziona tutto
#define CLK PD7
#define DTA PB1

ed alla pressione di un pulsante modula le due uscite (come da funzione).
L'istruzione OR, per impostare a 1 il bit, è corretta ed è anche consigliata da Atmel nella nota AVR035.
Il consiglio di utilizzare un timer, al posto della "_delay.." lo seguirò sicuramente, tuttavia i dubbi espressi nella parte finale del messaggio rimarrebbero.
Penso che, capire il meccanismi di trasmissione, mi consentirà di apprezzare meglio le comode funzionalità HW e SW a mia disposizione.

Ancora grazie.

Ciao !!
Avatar utente
Foto Utentefaberebaf
66 3
New entry
New entry
 
Messaggi: 79
Iscritto il: 4 nov 2007, 19:51


Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 7 ospiti