Pic Micro, Arduino, Atmel, Microchip, Freescale, Texas Instrument, ecc. Strumenti di sviluppo, firmware e progetti.
#3224
Ok sono riuscito a configurare tramite PPS i pin di Rx e Tx, ho impostato la seriale con i seguenti parametri
UART_EN
UART_RX_TX
UART_NO_PAR_8BIT
UART_1STOPBIT
UART_NORMAL_RX

a 9600 di Baude, con il clock esterno a 12MHz. Ho impostato quindi il valore del registro "BRG" a 311.
Non riesco a leggere correttamente i caratteri che mi sto inviando per prova. Il numero dei carateri ricevuto è corretto ma i caratteri sono sbagliati (anche osservando i valori dei byte ricevuti). Ho imostato correttamete la interfaccia a 8 bit +1 stop a 9600 senza parità.

Da che dipenderà?
#3226
Per fare una diagnosi plausibile avrei bisogno di conoscere altri particolari del problema.
Stai trasmettendo dalla tua scheda verso un PC (con un hardware accessorio in mezzo)?
Quali differenze osservi tra i bit dei caratteri che trasmetti e quelli dei caratteri che ricevi?
Noti che i caratteri ricevuti son sempre gli stessi?

Se stai ricevendo con un PC avrai di certo usato un traslatore di livello, per passare dai 5 (o 3) volt del micro ai + / - 12 teorici dello standard EIA232.
Se hai usato il classico chip che fa tutto da solo, con sigla MAX232 o similare, non dovresti avere problemi di natura hardware. Se invece hai scelto una soluzione a componenti discreti, tipo uno o due transistor con qualche resistore, tieni presente che il segnale dev'essere invertito.
In pratica, quando dal micro esce un livello logico alto, dal traslatore deve uscire un livello basso, di solito consistente in almeno 8 volt negativi rispetto a massa. Viceversa, quando il micro fornisce un livello basso, il traslatore sale ad almeno 8 volt positivi rispetto a massa. In assenza di tale inversione può verificarsi il fenomeno che riferirsci: il ricevitore non riconosce lo start bit vero, ma considera erroneamente start il primo bit uno che incontra nel flusso.
Gio55 ringraziano
#3227
Ieri sera non ho fatto in tempo a correggere (aggiornare) il post.
Si connetto verso PC tramite scheda di adattamento USB/Rs ttl (funziona gia testata, col null tandem)

Imponendo i parametri direttamente sui registri (invece di ricorrere alla funzione delle lib XC32) sembra andare ok:

Codice: Seleziona tuttoU1BRG = 20; // Set Baud rate
U1STA = 0;
U1MODE = 0x8000; // Enable UART for 8-bit data
// No Parity, 1 Stop bit
U1STASET = 0x1400; // Enable Transmit and Receive
#3228
Gio55 ha scritto:Si connetto verso PC tramite scheda di adattamento USB/Rs ttl (funziona gia testata, col null tandem)
Imponendo i parametri direttamente sui registri (invece di ricorrere alla funzione delle lib XC32) sembra andare ok:

E' un'ulteriore conferma di un mio vecchio convincimento: il software è l'arte di perder tempo dietro le sviste altrui. :)
Ce l'ha insegnato anche zio Bill: se sbaglia l'utente, è un errore; se sbaglia lui, è un service pack.
Gio55 ringraziano
#3237
Penso che ho finito la program memory (ogni tanto mi genera un errore quando compilo).
Non ho altre speranze se non quella di cambiare il micro con uno con più flash? 64k del mio modello sono veramente pochi...
#3238
Gio55 ha scritto:Penso che ho finito la program memory (ogni tanto mi genera un errore quando compilo).
Non ho altre speranze se non quella di cambiare il micro con uno con più flash? 64k del mio modello sono veramente pochi...

Non è detto. Dovresti esaminare la mappa di linkaggio e vedere l'occupazione dei vari segmenti. Non posso escludere che sia davvero la flash in blocco la risorsa scarsa, ma ritengo più probabile che il linker "distribuisca" il codice secondo un default che potrebbe non andar bene per il micro in oggetto. Mi è capitato, con altri modelli di micro, che il compilatore incastrasse tutte le funzioni in un segmento di flash lasciando libero un altro addirittura più grande, semplicemente perché il suo default (cioè la sua configurazione standard) non prevedeva l'utilizzo di più segmenti di flash. E' bastato abilitare con una riga #pragma il secondo segmento, e tutto è ritornato a posto. Se la flash è davvero tutta occupata, prima di cambiare il micro potresti provare a riorganizzare il codice e/o cambiare l'ottimizzazione, privilegiando la riduzione di spazio a scapito della velocità. Alcune funzioni standard definite in stdio.h, come ad esempio la printf, possono occupare due o tre kilobyte anche se le usi solo per formattare piccoli interi da 0 a 255. Il testo esatto dell'errore, insieme al manuale del linker e alla mappa di memoria del micro, potrebbe essere d'aiuto per decidere se davvero valga la pena di cambiare l'hardware.
Dimmer su aspirazione

Ciao a tutti ho una ventola di aspirazione in came[…]

Visita il nostro canale telegram