Freedom Light e il modulino uPanel
- Lello Guidi
- Autore della discussione
- Platino Utente
Less
Di più
6 Anni 9 Mesi fa #1
da Lello Guidi
Freedom Light e il modulino uPanel è stato creato da Lello Guidi
Sto tentando di far dialogare in C il modulino uPanel con la Freedom Light.
Non voglio usare Arduino, è troppo facile.
Sono riuscito a inviare il valore della temperatura misurata dal "LM35" all' iPhone6 e visualizzarla, variazioni comprese, tramite la visualizzazione di un pannello con un termometro circolare.
in trasmissione tutto funziona regolarmente.
Adesso avevo deciso di provare a interpretare anche i comandi in ricezione, che il pannello sul iPhone6 manda indietro.
Ho provato inizialmente con utilizzare la UART1 in polling, poi sono passato a testare la ricezione in Interrupt.
Sono partito dagli esempi dell'ottimo volume "Step by step", ho cercato in internet eventuali esempi di utilizzo della UART in ricezione.
Nonostante tutto non riesco a fare funzionare la cosa, non riesco a visualizzare sull' LCD dei "char" comprensibili.
Posso dire che le ho provate tutte ed è ovvio che mi mancano alcune informazioni decisive per completare la cosa.
Se a qualcuno interessa posso postare il sorgente del test funzionante in trasmissione.
So cosa fare in linea di massima ma mi manca l'esempio pratico.
Saluti
Lello
Non voglio usare Arduino, è troppo facile.
Sono riuscito a inviare il valore della temperatura misurata dal "LM35" all' iPhone6 e visualizzarla, variazioni comprese, tramite la visualizzazione di un pannello con un termometro circolare.
in trasmissione tutto funziona regolarmente.
Adesso avevo deciso di provare a interpretare anche i comandi in ricezione, che il pannello sul iPhone6 manda indietro.
Ho provato inizialmente con utilizzare la UART1 in polling, poi sono passato a testare la ricezione in Interrupt.
Sono partito dagli esempi dell'ottimo volume "Step by step", ho cercato in internet eventuali esempi di utilizzo della UART in ricezione.
Nonostante tutto non riesco a fare funzionare la cosa, non riesco a visualizzare sull' LCD dei "char" comprensibili.
Posso dire che le ho provate tutte ed è ovvio che mi mancano alcune informazioni decisive per completare la cosa.
Se a qualcuno interessa posso postare il sorgente del test funzionante in trasmissione.
So cosa fare in linea di massima ma mi manca l'esempio pratico.
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 #2
da Lello Guidi
Risposta da Lello Guidi al topic Freedom Light e il modulino uPanel
In allegato ho messo l'ossatura del file per la ricezione dei comandi che invia il modulino.
Adesso devo implementare la routine per leggere i dati in arrivo e salvarli in un Array.
Il mio problema è dove inserire il codice; nel Main, nel While o direttamente nella routine di Interrupt ?
Un grazie anticipato per i consigli.
Lello
Code:
/******************************** ***************************
* File: uPanel_Led_New
* 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 sul pannello.
* L'interruttore cambia lo stato del Led.
*
* Created on March 15, 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>
#define HEADER_FILE1 0x23 // carattere #= 23
#define HEADER_FILE2 0x24 // carattere $ = 24
#define LINE_FEED 0X0A // carattere /n = 10
#define DEACTIVATED 0x00
#define ACTIVATED 0x01
#define LEDverde LATDbits.LATD0
#define LEDrosso LATDbits.LATD1
volatile unsigned char data;
volatile unsigned int stato;
//*********************************************
// Funzione per la gestione dell'interruzione
//*********************************************
__interrupt (high_priority) void ISR_alta (void) {
// Controllo che l'interrupt sia stato generato dall'USART
if (PIR1bits.RCIF == ACTIVATED ) {
// Resetto gli Interrupt EUSART
PIR1bits.RCIF = DEACTIVATED;
// Leggo il dato in ingresso
data = UART1_data_ready ();
if (data == HEADER_FILE1){
stato = 1;
}
if( data == HEADER_FILE2){
stato = 2;
}
}
}
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_ON_CURSOR, LCD_BLINKING_ON);
LCD_home();
LCD_write_message(" uPanel e Led");
LCD_goto_xy(6,2); // (colonna, riga)
LCD_write_message("New");
delay_s(1);
LCD_clear();
LCD_goto_line(1);
LCD_write_message("...start");
delay_s(1);
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 new;{%100,3!88F,228}*20/L1G:0:LED;*10/W1:0;\n");
LCD_goto_line(2);
LCD_write_message("...panel");
delay_s(1);
LCD_clear();
// Resetto gli Interrupt vecchi
PIR1bits.RCIF = DEACTIVATED;
// Abilito modalita' compatibile (di default vale 0)
RCONbits.IPEN = 0;
// Abilito l'interrupt globale
INTCONbits.GIE = ACTIVATED;
// Abilito interrupt per periferiche
INTCONbits.PEIE = ACTIVATED ;
while(1){
switch ( stato){
case 2: // $
LEDrosso = 1;
break;
case 1: // #
LEDverde = 1;
break;
case LINE_FEED: // /n
break;
default:
LEDrosso = 0;
LEDverde = 0;
}// end switch
}// end while
}// end main
Adesso devo implementare la routine per leggere i dati in arrivo e salvarli in un Array.
Il mio problema è dove inserire il codice; nel Main, nel While o direttamente nella routine di Interrupt ?
Un grazie anticipato per i consigli.
Lello
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 Freedom Light e il modulino uPanel
Se correggo il listato precedente con queste righe:
per leggere il dato in arrivo alla UART1, mi si accende il led rosso, quindi mi arriva il "$" ma non lo visualizzo sul LCD.
Se invece uso questo listato:
Sul LCD visualizzo il secondo carattere che è "O", e mi perdo il carattere "$" che è il primo che arriva.
Inoltre mi da un errore: main.c:95: warning: (357) illegal conversion of integer to pointer a questa linea: LCD_write_string(*stringa);
La variabile stringa è stata dichiarata : unsigned char stringa[20];.
La UART mi sta facendo perdere la testa.
Saluti
Lello
Code:
UART1_data_ready();
firstCh = UART1_read_byte ();
switch (firstCh){
case HEADER_FILE2:// $
LEDrosso = 1;
break;
case HEADER_FILE1:// #
LEDverde = 1;
break;
}
Se invece uso questo listato:
Code:
while (UART1_data_ready()){
firstCh = UART1_read_byte ();
}
while (UART1_data_ready()){
while(nextCh != LINE_FEED){
nextCh = UART1_read_byte();
stringa[i] = nextCh;
LEDverde=1;
i++;
}
}
Sul LCD visualizzo il secondo carattere che è "O", e mi perdo il carattere "$" che è il primo che arriva.
Inoltre mi da un errore: main.c:95: warning: (357) illegal conversion of integer to pointer a questa linea: LCD_write_string(*stringa);
La variabile stringa è stata dichiarata : unsigned char stringa[20];.
La UART mi sta facendo perdere la testa.
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 Freedom Light e il modulino uPanel
Entro nell' Interrupt ma non visualizzo nessun dato sul LCD, lavorabile stringa rimane vuota se (!RCIF9 è negato.
Invece se (RCIF) è attivo vedo solo l'HEADER che è il $ e il carattere O della scritta OK-PING.
Poi non riceve nient'altro anche premo il tasto sul panel.
Invece dovrei visualizzare #W11.
Accetto consigli
Lello
Code:
unsigned char dato;
unsigned char stringa[7];
unsigned char stringa1[9];
int contatore= 0;
/************** Interrupt ***************************/
void interrupt high_isr(void){
while(!RCIF){ // Se registro pieno
dato = RCREG;
if (dato == HEADER_2){
stringa[contatore] = RCREG;
contatore++;
}// end if
}// end RCIF
LEDverde = 1;
}// end Interrupt
/********************** UART **********************+*/
void InitApp(){
RCIE = 1; // Attivo interrupt in RX
RCIP = 1; // Alta Priorità USART
GIE = 1; // Abilito alta priorità globale
PEIE = 1; // Abilito interrupt periferiche
}
Invece se (RCIF) è attivo vedo solo l'HEADER che è il $ e il carattere O della scritta OK-PING.
Poi non riceve nient'altro anche premo il tasto sul panel.
Invece dovrei visualizzare #W11.
Accetto consigli
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 Freedom Light e il modulino uPanel
Sono riuscito a visualizzare solo il primo messaggio che mi invia il Panel.
I successivi non li prende, entra nella routine di Interrupt ma non salva niente nella stringa, è come bloccato.
Mi serve uno spunto per proseguire.
Il listato è il seguente:
I successivi non li prende, entra nella routine di Interrupt ma non salva niente nella stringa, è come bloccato.
Mi serve uno spunto per proseguire.
Il listato è il seguente:
Code:
/******************************* ***************************
* File: uPanel_Led_New5
* Author: Lello
* TX = RC6 pin25, RX = RC7 pin26
* LTlib v4.0.5, MPLABX v4.15, XC8 v1.45
* PIC18F4550
* clock: 20MHz
* Freedom Light
* Created on March 27, 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>
#define HEADER_1 0x23 // carattere #
#define HEADER_2 0x24 // carattere $
#define LEDverde LATDbits.LATD0
#define LEDrosso LATDbits.LATD1
unsigned char stringa[7];
int contatore= 0;
/************** Interrupt ***************************/
__interrupt (high_priority) void ISR_alta (void){
if(RCIF != 0){ // Se registro pieno
stringa[contatore] = RCREG; // salvo il carattere
contatore++;
}// end RCIF
INTCONbits.RBIF =0 ; // Azzero Interrupt
}// end Interrupt
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 5");
delay_s(1);
LCD_clear();
//*****************************************************
// Configura l'USART 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");
UART1_write_message("$P:D!338;=T*15:Led new 5;{%100,3!88F,228}*20/L1G:0:LED;*10/W1:0;\n");
while(1){
LCD_goto_line(1);
LCD_write_message(stringa);
if (stringa[0]== HEADER_2){
LEDrosso=1;
LEDverde = 0;
}
else if(stringa[0] == HEADER_1){
LEDrosso = 0;
LEDverde = 1;
}
}// end while
}// end main
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