Salve,
dovrei leggere in Interrupt, tramite la USART del PIC18F4550, tre stringhe lunghe massimo ciascuna 10 caratteri che mi arrivano in sequenza nel tempo.
Le prime due hanno un’ Header = $ e mi arrivano una dietro l'altra.
La terza stringa ha l’Header = # e mi arriva a comando.
L’header mi serve per distinguerle e per poterle processare nel “main”.
Uso come compilatori il MPLABX IDE v4.15 e XC8 v1.45, più delle librerie per la gestione del LCD 16x2 e degli I/O.
Riesco a visualizzare solo la prima stringa in arrivo e non vedo le altre.
I codici dell’interrupt e le configurazioni sono nel seguente listato:
/******************************** funziona parziale ************************
* File: uPanel_Led_New4
* Author: Lello
* TX = RC6 pin25, RX = RC7 pin26
* MPLABX v4.15, XC8 v1.45
* PIC18F4550
* clock: 20MHz
*
* Created on March 23, 2018, 3:06 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>
#include <string.h>
#define HEADER_1 0x23 // carattere # = 23
#define HEADER_2 0x24 // carattere $ = 24
#define LINE_FEED 0X0A // carattere /n = 10
#define DEACTIVATED 0x00
#define ACTIVATED 0x01
#define LEDverde LATDbits.LATD0
#define LEDrosso LATDbits.LATD1
unsigned char dato;
unsigned char stringa[8];
unsigned char stringa1[9];
int contatore= 0;
bit flag = 0;
/************** Interrupt ***************************/
void interrupt high_isr(void){
if(RCIF){
switch(flag){
case 0:
stringa[contatore] = RCREG;
if(stringa[contatore] == '\n'){
flag = 1;
contatore = 0;
}// end if
else contatore++;
break;
case 1:
stringa1[contatore] = RCREG;
if(stringa1[contatore] == '\n'){
contatore = 0;
flag = 1;
}// end if
else contatore++;
break;
}// end RCIF
}
}// end Isr
/********************** UART **********************+*/
void InitApp(){
RCIE = 1; // Attivo interrupt in RX
RCIP = 1; // Alta Priorità USART
RCIF =0 ; // Resetto vecchi IOnterrupt
IPEN = 0; // Abilito modalità compatibile
GIE = 1; // Abilito alta priorità globale
PEIE = 1; // Abilito interrupt periferiche
}
void main(void){
InitApp();
IO_set_all_ports_as_inputs();
IO_set_port_direction(IO_PORTD, IO_ALL_PORT_OUTPUT);
LCD_initialize(20);
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("New 4");
delay_s(1);
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 new 4;{%100,3!88F,228}*20/L1G:0:LED;*10/W1:0;\n");
while(1){
LCD_goto_line(1);
LCD_write_message(stringa);
LCD_goto_line(2);
LCD_write_message(stringa1);
flag = 0;
//while(1){
}// end while
}// end main
Grazie per un eventuale aiuto.