Bit Banging
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 :
In base a queste informazioni ho scritto e provato questa funzione :
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
TardoFreak, 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 !.
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 :
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
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 !.