UART1_read_byte() gioie e dolori

  • Lello Guidi
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
6 Anni 9 Mesi fa #1 da Lello Guidi
UART1_read_byte() gioie e dolori è stato creato da Lello Guidi
Più' dolori che gioie, infatti non mi funziona e mi da una sfilza di "advisory".
Il listato è il seguente:
Code:
/****************************** *************************************** * File: main.c * Author: Lello * TX = RC6 pin25, RX = RC7 pin26 * LTlib v4.0.5, MPLABX v4.15, XC8 v1.45 * PIC18F4550 * clock: 20MHz * Freedom Light * Un interruttore e un Led collocati sul pannello. * L'interruttore cambia lo stato del Led. * Visualizzo su LCD la risposta dal panel alla pressione del tasto. * * Created on March 8, 2018, 5:49 PM ***************************************************************************/ #include <xc.h> #include <LTlib.h> #include <LTlib_delay.h> #include <LTlib_delay.c> #include <LCD_44780.h> #include <LCD_44780.c> #include <module_IO.h> #include <module_IO.c> #include "module_UART.h" #include "module_UART.c" #include <stdio.h> #include <stdlib.h> #define HEADER_FILE 0x23 // carattere # #define DEACTIVATED 0x00 #define ACTIVATED 0x01 void main(void) { IO_set_all_ports_as_inputs(); IO_set_port_direction(IO_PORTD, IO_ALL_PORT_OUTPUT); IO_set_port_direction(IO_PORTC, IO_BIT0_OUT); LCD_initialize(20); LCD_backlight (LCD_TURN_ON_LED); LCD_cursor(LCD_TURN_ON_CURSOR, LCD_BLINKING_OFF); LCD_home(); LCD_write_message(" uPanel e Led"); LCD_goto_xy(6,2); // (colonna, riga) LCD_write_message("v1.0"); delay_s(3); LCD_clear(); LCD_goto_line(2); LCD_write_message("...start"); delay_s(2); LCD_clear(); //***************************************************** // Configura l'USART, 8 bit, 57600 bit/s UART1_open(UART_BAUDRATE_57600); delay_ms(10); UART1_write_message("\n"); UART1_write_message("$PING 200;\n"); UART1_write_message("\n"); // Send Panel (Led e switch) UART1_write_message("$P:D!338;=T*15:Led v1.0;{%100,3!88F,228}*20/L1G:0:LED;*10/W1:0;\n"); LCD_goto_line(2); LCD_write_message("...panel"); delay_s(2); LCD_clear(); PIR1bits.RCIF = 0; RCONbits.IPEN = 0; INTCONbits.GIE = 1; INTCONbits.PEIE = 1; while(1){ }// end while }// end main __interrupt(high_priority) void ISR_alta (void){ unsigned char data; static char firstTime; if (PIR1bits.RCIF == ACTIVATED){ PIR1bits.RCIF = DEACTIVATED; if (firstTime == HEADER_FILE){ //LCD_clear(); firstTime = 1; } data = UART1_read_byte(); LCD_goto_xy(1,1); LCD_write_char(data); UART1_close(); INTCONbits.GIE = 0; } }
Mentre gli errori sono questi:
Non line specific message:: advisory: (1492) using updated 32-bit floating-point libraries; improved accuracy might increase code size
../../Documents/Freedom II/LTlib_v_4.0.5/src/LTlib_delay.c:56: advisory: (1510) non-reentrant function "_delay_ms" appears in multiple call graphs and has been duplicated by the compiler
../../Documents/Freedom II/LTlib_v_4.0.5/src/LCD_44780.c:48: advisory: (1510) non-reentrant function "_LCD_enable_pulse" appears in multiple call graphs and has been duplicated by the compiler
../../Documents/Freedom II/LTlib_v_4.0.5/src/LCD_44780.c:60: advisory: (1510) non-reentrant function "_LCD_send_command" appears in multiple call graphs and has been duplicated by the compiler
../../Documents/Freedom II/LTlib_v_4.0.5/src/LCD_44780.c:97: advisory: (1510) non-reentrant function "_LCD_shift_cursor" appears in multiple call graphs and has been duplicated by the compiler
../../Documents/Freedom II/LTlib_v_4.0.5/src/LCD_44780.c:110: advisory: (1510) non-reentrant function "_LCD_goto_line" appears in multiple call graphs and has been duplicated by the compiler
../../Documents/Freedom II/LTlib_v_4.0.5/src/LCD_44780.c:135: advisory: (1510) non-reentrant function "_LCD_goto_xy" appears in multiple call graphs and has been duplicated by the compiler
../../Documents/Freedom II/LTlib_v_4.0.5/src/LCD_44780.c:144: advisory: (1510) non-reentrant function "_LCD_write_char" appears in multiple call graphs and has been duplicated by the compiler
/Applications/microchip/xc8/v1.45/sources/common/Umul16.c:15: advisory: (1510) non-reentrant function "___wmul" appears in multiple call graphs and has been duplicated by the compiler

L'esempio l'ho estrapolato dal "Step by Step" a pagina 328 e a seguire.
Se il programma funzionasse dovrei vedere il "char" dell'IDER (#) in arrivo, sul LCD ma non visualizzo niente.
Ho bisogno di un aiuto.
Saluti

Lello

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
6 Anni 9 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic UART1_read_byte() gioie e dolori
Salve Lello,

le funzioni del controllo del modulo LCD sono piuttosto lente e non dovrebbero essere usate all'interno dell'ISR.

In particolare la libreria LCD fa uso di quella delay che non può essere usata in contemporanea nel codice principale e nell'ISR.

Il consiglio principale è di togliere ogni funzione del modulo LCD dall'ISR.

Puoi anche provare a modificare la libreria LTlib_delay.h togliendo il commento a
Code:
//#define DELAY_INTERRUPT_BLOCKING

che trovi sotto questa spiegazione, che è uno dei problemi che stai avendo:
Code:
// Remove the comment from the DELAY_INTERRUPT_BLOCKING definition if the delay // should lock the interrupt. // This feature makes the delay function "almost" thread safe, in case it is // used within the main function and within the ISR at the same time. //#define DELAY_INTERRUPT_BLOCKING

Saluti,

Mauro
I seguenti utenti hanno detto grazie : Lello Guidi

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Lello Guidi
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
6 Anni 9 Mesi fa #3 da Lello Guidi
Risposta da Lello Guidi al topic UART1_read_byte() gioie e dolori
Faccio le correzioni che mi hai consigliato.
Saluti

Lello

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Lello Guidi
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
6 Anni 9 Mesi fa #4 da Lello Guidi
Risposta da Lello Guidi al topic UART1_read_byte() gioie e dolori
Il "Problema" l'ho risolto ma il programma non mi funziona comunque.
Mi arriva come Byte Header il simbolo $ invece sul display LCD vedo solo un carattere strano che non so decifrare.
Allego il sorgente nella eventualità di un aiuto.
Code:
/******************************** *********************************** * File: uPanel_Led_v2 * Author: Lello * TX = RC6 pin25, RX = RC7 pin26 * LTlib v4.0.5, MPLABX v4.15, XC8 v1.45 * PIC18F4550 * clock: 20MHz * Freedom Light * Un interruttore e un Led collocati sul pannello. * L'interruttore cambia lo stato del Led inviando indietro un codice con Header $. * Visualizzo su LCD la risposta dal panel alla pressione del tasto. * * Created on March 13, 2018, 10:22 PM **************************************************************************/ #include <xc.h> #include <LTlib.h> #include <LTlib_delay.h> #include <LTlib_delay.c> #include <LCD_44780.h> #include <LCD_44780.c> #include <module_IO.h> #include <module_IO.c> #include "module_UART.h" #include "module_UART.c" #include <stdio.h> #include <stdlib.h> #define HEADER_FILE 0x24 // carattere $ #define DEACTIVATED 0x00 #define ACTIVATED 0x01 #define LEDverde LATDbits.LATD0 #define LEDrosso LATDbits.LATD1 volatile unsigned char data = 0; //************************************************* // Gestione Interrupt //************************************************* __interrupt (high_priority) void ISR_alta (void) { // Flag per controllare la ricezione del primo carattere static unsigned char firstTime = 0; // Controllo che l'interrupt sia stato generato dall'USART if (PIR1bits.RCIF == 1 ) { // Resetto gli Interrupt EUSART PIR1bits.RCIF = 0; // Controllo la ricezione del primo carattere if (firstTime == 0) { //LCD_clear (); // Memorizzo il fatto che ho gia' pulito il display firstTime = 1; } // Leggo il dato dal buffer di ricezione data = (UART1_read_byte()); // Se $ termino l'applicazione if (data == HEADER_FILE) { LEDverde = 1; //LCD_write_char (data); // Chiudo l'USART UART1_close(); // Disabilito l'interrupt globale INTCONbits.GIE = 0; } } } //************************************************* // Programma Principale //************************************************* void main(void) { IO_set_all_ports_as_inputs(); IO_set_port_direction(IO_PORTD, IO_ALL_PORT_OUTPUT); LCD_initialize(20); LCD_backlight (LCD_TURN_ON_LED); LCD_cursor(LCD_TURN_OFF_CURSOR, LCD_BLINKING_OFF); LCD_home(); LCD_write_message(" uPanel e Led"); LCD_goto_xy(6,2); // (colonna, riga) LCD_write_message("v2.0"); delay_s(3); LCD_clear(); LCD_goto_line(2); LCD_write_message("...start"); delay_s(2); LCD_clear(); //***************************************************** // Configura l'USART, 8 bit, 57600 bit/s // 1 bit stop, 0 bit parità, interruzione RX abilitata ? UART1_open(UART_BAUDRATE_57600); delay_ms(10); UART1_write_message("\n"); UART1_write_message("$PING 200;\n"); UART1_write_message("\n"); // Send Panel (Led e switch) UART1_write_message("$P:D!338;=T*15:Led v2.0;{%100,3!88F,228}*20/L1G:0:LED;*10/W1:0;\n"); LCD_goto_line(2); LCD_write_message("...panel"); delay_s(2); LCD_clear(); LCD_write_char (data); // Resetto gli Interrupt vecchi PIR1bits.RCIF = 0; // Abilito modalit? compatibile (di default vale gi? 0) RCONbits.IPEN = 0; // Abilito l'interrupt globale INTCONbits.GIE = 1; // Abilito interrupt per periferiche INTCONbits.PEIE = 1 ; while(1){ }// end while }// end main

Saluti

Lello

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Lello Guidi
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
6 Anni 9 Mesi fa #5 da Lello Guidi
Risposta da Lello Guidi al topic UART1_read_byte() gioie e dolori
Ho notato, spostando nelle righe del sorgente la visualizzazione dei LED che non viene eseguita la funzione di Interrupt.
Ho riverificato la configurazione dei registri e mi sembra corretta.

Lello

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiStefA

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.