Freedom Light e il modulino uPanel

  • Lello Guidi
  • Autore della discussione
  • Platino Utente
  • Platino Utente
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

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 #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.
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
  • Platino Utente
Di più
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:
Code:
UART1_data_ready(); firstCh = UART1_read_byte (); switch (firstCh){ case HEADER_FILE2:// $ LEDrosso = 1; break; case HEADER_FILE1:// # LEDverde = 1; break; }
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:
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
  • Platino Utente
Di più
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.
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
  • Platino Utente
Di più
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:
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 LaurentiStefA

Registrati al sito

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

Registrati al sito LaurTec.