UART1_read_byte() gioie e dolori
- Lello Guidi
- Autore della discussione
- Platino Utente
Less
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:
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
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;
}
}
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.
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
che trovi sotto questa spiegazione, che è uno dei problemi che stai avendo:
Saluti,
Mauro
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
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
Saluti
Lello
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Lello Guidi
- Autore della discussione
- Platino Utente
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.
Saluti
Lello
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
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
Ho riverificato la configurazione dei registri e mi sembra corretta.
Lello
Si prega Accesso o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, StefA
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- Aggiornamento sito completato
- da Mauro Laurenti
-
- registro a scorrimento PIPO in cascata
- da Mauro Laurenti
-
- FORMULA PER LINEARIZZARE TERMOCOPIA
- da Mauro Laurenti
-
- Spostamento impronte
- da Mauro Laurenti