Sei mai stato catturato dall’ Autobaud?

Avere del codice sorgente preimpostato è un dono del Cielo, specialmente quando si utilizza un nuovo micro. Ma a volte..
Qualche mese fa avevo iniziato a giochicchiare con il dsPIC401, utilizzando MPLAB e C30. Sono rimasto soddisfatto perché sono stato in grado di far funzionare una applicazione “hello world” in poco tempo. Non solo l’installazione di MPLAB e C30 ha funzionato senza intoppi ma semplicemente copiando ed incollando il codice disponibile nella library C30 delle periferiche , è stato molto facile programmare la uart1 e timer1 !

Qualche mese fa avevo iniziato a giochicchiare con il dsPIC401, utilizzando MPLAB e C30. Sono rimasto soddisfatto perché sono stato in grado di far funzionare una applicazione “hello world” in poco tempo. Non solo l’installazione di MPLAB e C30 ha funzionato senza intoppi ma semplicemente copiando ed incollando il codice disponibile nella library C30 delle periferiche , è stato molto facile programmare la uart1 e timer1 ! Il codice seguente, utilizzato per programmare il uart1 e’ disponibile sulla documentazione microchip:

/* Configure UART1 module to transmit 8 bit data with one stopbit. Also Enable loopback mode */

baudvalue = 5;

U1MODEvalue = UART_EN & UART_IDLE_CON & UART_DIS_WAKE & UART_DIS_LOOPBACK &

UART_EN_ABAUD & UART_NO_PAR_8BIT & UART_1STOPBIT;

U1STAvalue = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL &

UART_TX_ENABLE & UART_INT_RX_3_4_FUL & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;

OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);

Qualche settimana fa, ho iniziato un nuovo progetto con un 4011, utilizzando un maggior numero periferiche. Siccome credo fortemente nel codice riutilizzabile ho importato il codice “hello world”, ho ricompilato solo per essere sicuro che le cose siano state impostate correttamente e poi ho iniziato il vero progetto.

Prima di tutto ho scritto codice di test per configurare ed utilizzare input capture2, ha funzionato bene, poi ho scritto il codice per 2 uscite PWM , e fin qua tutto a posto. Avevo bisogno anche di usare la uart2, quindi ho semplicemente copiato il codice della uart1 per inizializzarla (cambiando dove necessario 1 con 2) e ha funzionato. Adesso avevo a disposizione tutti i pezzi per sviluppare l'intera l’applicazione. L’ho fatto e…. l' input capture2 ha rifiutato di funzionare! PERCHÉ! Confesso che ho perso qualche ora per collegare il problema ad un specifico blocco di codice!

Per farla breve, non mi sono reso conto che il codice di Microchip abilita l’autobaud rate quando apre la uart1 (UART_EN_ABAUD). Questa impedisce il funzionamento dell'input capture1. Indovinate cosa succede quando l'autobaud è abilitato sulla uart2? Si anche l’input capture2 è disabilitato.

Sinceramente è passato un po’ di tempo prima di scoprire questo errore anche perché l’autobaud non è nemmeno menzionato nella sezione dell'input capture nel manuale del 4011. E come al solito Mr Murphy ha fatto in modo che io non usassi l'input capture1 (quando l'uart1 era già stata utilizzata). Ho risolto il problema sostituendo UART_EN_ABAUD con UART_DIS_ABAUD
.

Quindi, per evitare di fare una brutta figura utilizzate il codice preimpostato, ma siate sicuri di sapere esattamente cosa fa…

Repost del 20 febbraio 2008

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend