Comunicazione seriale con bit di start anomalo

Buongiorno, provo ad esporvi il mio problema. Vorrei utilizzare Arduino per leggere i dati provenienti da una pista Scx digitale (pista per auto) e inviare il numero di giri effettuati da ogni macchina su un display. I dati che ottengo dal binario della pista (18 volt) sono dati seriali, 9 byte che però hanno un bit di start di 1,5 bit. Queste informazioni le ho ottenute da un forum dedicato dove qualcuno è riuscito ad analizzare e decodificare questi dati creando un circuito che allego per normalizzare la trasmissione seriale. Ho letto parecchi forum e ho visto che è facile con Arduino leggere dati seriali e comunicare con un display lcd. Però non riesco a capire come risolvere il problema del bit di start anomalo.
Vi ringrazio anticipatamente.
Scusate se forse non mi sono spiegato in modo molto chiaro .

scxdtopcbysebqt4.png

angelaxel: però hanno un bit di start di 1,5 bit.

il atmega328 non puo' essere settato ad 1.5.

Una strada che pero' potresti percorrere e' il contrario del bitbanging ttp://en.wikipedia.org/wiki/Bit-banging. Quindi usi il pin2 o 3 per ricevere i dati ed analizzi quel che arriva in un interrupt attacato misurando il tempo tra cambi di stato del pin. un algoritmo per questo metodo trovi qui: http://stud3.tuwien.ac.at/~e9725348/Theses/thesis_hvriedel_swuarts_a4_twosided.pdf.

Ovviamente richiede un po' di lavoro... HTH

Innanzitutto grazie per la risposta, ma credo che questa strada per me sia troppo complicata. Ora ti chiedo se io realizzo il circuito in allegato ed elimino il max232 secondo te posso collegare l'uscita ai pin seriali di Arduino. Probabilmente dovrò cambiare il partitore, in quanto la tensione in ingresso è 18 volt e quella in uscita 12 volt. Però avrei già i dati seriali ripuliti dal mezzo bit in più. Ciao

Ora ti chiedo se io realizzo il circuito in allegato ed elimino il max232 secondo te posso collegare l'uscita ai pin seriali di Arduino.

Quale allegato? ;-)

Cmq. il 1.5 bit e' una misura di tempo. Cambiando la tensione non cambi il rapporto di tempo tra i vari bit.

Ho messo un file con un schema che ho trovato in rete, come mai non riesci a vederlo, ho sbagliato qualcosa.
Ciao

scjurgen: Quale allegato? ;-)

Quello del 1° post

leo72:

scjurgen: Quale allegato? ;-)

Quello del 1° post

Azz... ora e' chiaro, premendo reply non si vedono piu' allegati!!

In effetti, usando dei gate con i due timer il bit verra' troncato, quindi la risposta e si, togliendo il max dovrebbe andare, e la uscita nr. 12 del MC14258B va nel rx del arduino (senza partitore, dato che il MC ed il NAND dovrebbe essere logica TTL). Anche la parte del power supply ricavato dalla seriale potresti togliere ed attaccare il VDD al Arduino 5V

Comincio a vedere la luce. Ricapitoliamo (tenendo presente che partiamo dall'ingresso LIVE/GND a 18V) troviamo un partitore che va al circuito MC14528B + U4093, esco dal piedino 11 del U4093 e vado al RX di Arduino (così ho un segnale ttl pulito). Utilizzo i 5 volt di Arduino per alimentare i componenti MC14528B+U4093 (quindi elimino anche la parte power a 5v condensatori D1, C8, C9, C10, 7805 ecc.) L'unico dubbio è dal piedino 11 del U4093 il segnale sarà TTL 5V?

Comunque mi sei stato di grande aiuto. Grazie

angelaxel: Comincio a vedere la luce. Ricapitoliamo (tenendo presente che partiamo dall'ingresso LIVE/GND a 18V) troviamo un partitore che va al circuito MC14528B + U4093, esco dal piedino 11 del U4093 e vado al RX di Arduino (così ho un segnale ttl pulito). Utilizzo i 5 volt di Arduino per alimentare i componenti MC14528B+U4093 (quindi elimino anche la parte power a 5v condensatori D1, C8, C9, C10, 7805 ecc.) L'unico dubbio è dal piedino 11 del U4093 il segnale sarà TTL 5V?

Se leggi il suo datasheet vedi che con VDD=5V le uscite del NAND saranno a circa 4.95V: http://www.national.com/ds/CD/CD4093BC.pdf.

Sono nuovamente qui, intanto se a qualcuno interessa posto due link per capire meglio l’argomento trattato.
http://eng.slotbaer.de/SCX/PhyProt.html
http://eng.slotbaer.de/SCX/DatProt.html
Nel secondo link l’autore dice che è possibile sopperire all’anomalia del bit di start da 1,5 bit applicando questo codice:

static unsigned char crcTable[256];

void buildTable (void) {

	int i;
	unsigned char table[8];

	table[0] = 0x31;
	
	for (i = 1; i < 8; i++) {
		int n = 2 * table[i - 1];
		
		table[i] = (n >= 256) ?	n ^ 0x31 : n;
	}
	
	for (i = 0; i < 256; i++) {
	
		crcTable[i] = 0;
		if (i & 1) crcTable[i] ^= table[0];
		if (i & 2) crcTable[i] ^= table[1];
		if (i & 4) crcTable[i] ^= table[2];
		if (i & 8) crcTable[i] ^= table[3];
		if (i & 16) crcTable[i] ^= table[4];
		if (i & 32) crcTable[i] ^= table[5];
		if (i & 64) crcTable[i] ^= table[6];
		if (i & 128) crcTable[i] ^= table[7];
	}
}

unsigned char crc (unsigned char* buffer, int count) {

	int i;
	unsigned char result = 0;
	
	for (i = 0; i < count - 1; i++) {
		unsigned char idx = buffer[i] ^ result;
		
		result = crcTable[idx];
	}
	
	return result ^ 0xBB;
}

Secondo voi (secondo te scjurgen) sarebbe possibile applicare il codice sopra per evitare di creare il circuito che ho postato nel primo post.
Come sempre grazie per la collaborazione.
Ciao a presto