Mi spiego vorrei usare arduino per interfacciare il mio pc a un vecchio apparato che usa questo protocollo:
8bit dati
1bti mode
1 stop
e la linea alla fine deve rimanere livello basso.
magari usando le librerie softwareserial, ma non conoscendo bene il c/c++ non vorrei vare casini.
Ho aperto il file SostwareSerial.cpp ho modificano aggiungendo il metodo:
SoftwareSerial::write_9(uint8_t b,bool b9)
{
if (_tx_delay == 0) {
setWriteError();
return 0;
}
uint8_t oldSREG = SREG;
cli(); // turn off interrupts for a clean txmit
// Write the start bit
tx_pin_write(_inverse_logic ? HIGH : LOW);
tunedDelay(_tx_delay + XMIT_START_ADJUSTMENT);
// Write each of the 8 bits
if (_inverse_logic)
{
for (byte mask = 0x01; mask; mask <<= 1)
{
if (b & mask) // choose bit
tx_pin_write(LOW); // send 1
else
tx_pin_write(HIGH); // send 0
tunedDelay(_tx_delay);
}
if (b9){
tx_pin_write(LOW); // send 1
} else{
tx_pin_write(HIGH); // send 0
}
tx_pin_write(LOW); // restore pin to natural state
}
else
{
for (byte mask = 0x01; mask; mask <<= 1)
{
if (b & mask) // choose bit
tx_pin_write(HIGH); // send 1
else
tx_pin_write(LOW); // send 0
tunedDelay(_tx_delay);
}
tx_pin_write(HIGH); // restore pin to natural state
if (b9){
tx_pin_write(HIGH); // send 1
} else{
tx_pin_write(LOW); // send 0
}
}
SREG = oldSREG; // turn interrupts back on
tunedDelay(_tx_delay);
return 1;
}
alla fine del metodo in modo da inviare un altro bit prima del bit di stop.
Secondo voi è giusto?
Come posso modificare in modo analogo il metodo read?
int SoftwareSerial::read()
{
if (!isListening())
return -1;
// Empty buffer?
if (_receive_buffer_head == _receive_buffer_tail)
return -1;
// Read from "head"
uint8_t d = _receive_buffer[_receive_buffer_head]; // grab next byte
_receive_buffer_head = (_receive_buffer_head + 1) % _SS_MAX_RX_BUFF;
return d;
}
da quello che ho capito dopo aver letto un byte dal buffer lo cancella tramite questa stringa:
_receive_buffer_head = (_receive_buffer_head + 1) % _SS_MAX_RX_BUFF;
dovrei dirgli di conservare il 9bit da qualche parte in modo da porterlo leggere con un altro metodo, come faccio?
Inoltre mi spiegate come la libreria fa a temporizzare i dati della seriale a 9600?
Grazie in anticipo a tutti coloro che vorranno darmi una mano o un consiglio
Massimo
massimotriggiano76:
Mi spiego vorrei usare arduino per interfacciare il mio pc a un vecchio apparato che usa questo protocollo:
8bit dati
1bti mode
1 stop
Lascia perdere la software serial che ti crea solo problemi, l'UART dei 328 supporta anche la modalità a 9 bit, solitamente il nono bit si usa sulla RS485 per discriminare tra address e data, fai riferimento al data sheet del 328, sezione UART, per vedere come settare il micro per il modo 9 bit e come settare il bit stesso
C'è una cosa che non torna, la condizione di idle della UART, vale per tutte indipendentemente dal produttore/modello, è 1 logico e non 0 logico.
che non sia supportato dall'HW? dovresti controllare il datashett... sicuramente vederndo come passare da 7n1 a 8n1 ti aiusta a capire cosa cambiare, una volta che sai che lamodalitàè supportata
Non credo basti inserire una #define relativa alla modalità a 9 bit scelta perché il core di Arduino sia in grado di gestire la trasmissione di pacchetti a 9 bit.
Leggendo il datasheet si vede come il 9° bit risieda in un registro differente e che questo bit vada letto prima di leggere il registro che contiene gli altri 8 bit. Penso quindi che sia da seguire la strada di Astrobeed, ossia quella di scrivere una funzione ad hoc (non in assembly ma in C) che faccia questo lavoro.