- Messaggi: 63
- Ringraziamenti ricevuti 0
Approccio alla comunicazione HID tra 18f4550 e PC
- velvettiere
- Autore della discussione
- Anziano Utente
-
Less
Di più
11 Anni 9 Mesi fa #1
da velvettiere
Approccio alla comunicazione HID tra 18f4550 e PC è stato creato da velvettiere
Salve a tutti ragazzi,
Ho fatto questo software che standalone funziona egregiamente e mostra i valori di temperatura e gas acquisiti.
Il problema che si pone ora è di caratura superiore dato che ho la necessità di comunicare i dati acquisiti al computer.
Avrei intenzione di attivare una comunicazione HID in full speed mode tra scheda pic e pc.
Ho provato a caricare sulla scheda alcuni hex precompilati ma windows non mi vede la scheda..
Sto impazzendo e sinceramente non vedo una via d'uscita. Esiste un tutorial dettagliato che mi fornisca un quadro completo della situazione??
Mi piacerebbe riuscire stasera a far riconoscere la scheda a windows
Grazie a tutti veramente....
Code:
//----------------------------------------------------------------------------//
//------------------Header,Librerie,Configurazioni,Define---------------------//
//----------------------------------------------------------------------------//
#include <p18f4550.h>
/* Questo DEFINE deve essere messo
necessariamente in questa posizione,
dato che il programma in polling deve prima
conoscere come sono le connessioni dell'LCD
e poi può inviargli i comandi
*/
#define LCD_DEFAULT
/* anzichè includere le librerie nel progetto
provvedo ad includere i file header e i sorgenti
dato che in fase di compilazione questi verranno richiamati
e usati allo stesso modo di una libreria, che si compila proprio
a partire dal file .h e .c
*/
#include <LCD_44780.h>
#include <LCD_44780.c>
#include <delay.h>
#include <delay.c>
#pragma config FOSC = HSPLL_HS // Impostato per lavorare ad alta frequenza (quarzo a 20 MHz)
#pragma config PLLDIV = 5
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2
#pragma config WDT = OFF // Disabilito il watchdog timer
#pragma config LVP = OFF // Disabilito programmazione LVP
#pragma config PBADEN = OFF // Disabilito gli ingressi analogici del PortB
#define frequenza_cpu 48 // definisco come costante il valore della frequenza di clock impostata per la CPU, utilizzabile indipendentemente in ogni routine
//--------------------------------------------------------------//
//--------------------------MAIN PROGRAM------------------------//
//--------------------------------------------------------------//
void main (void){
//----------------------------------------------------------------------------//
//------------------------Definizione delle variabili-------------------------//
//----------------------------------------------------------------------------//
/* Le variabili devono essere le prime istruzioni all'interno di una routine
altrimenti mettendo una qualunque istruzione prima di queste la compilazione
restituisce degli errori
*/
// Variabile utilizzata indicizzare il numero delle letture
char i;
// Variabili per salvare il valore della conversione A/D
int letturaTemp = 0;
int letturaGas = 0;
// Variabile per effettuare la sommatoria dei dati letti
int sommatoria = 0;
// Variabile per allocare il valore del Gas
float valoreGas = 0;
float valoreTemperatura = 0;
int valoreTemperaturaInt = 0;
int frazione = 0;
float frazioneneg = 0;
//int frazionenegInt = 0;
char segno=0;
//----------------------------------------------------------------------------//
//-----------Impostazione dei registri PORT, LAT, TRIS------------------------//
//----------------------------------------------------------------------------//
LATA = 0x00; // azzero il valore di tutti i pin del PORTA
TRISA = 0xFF; // Imposto PORTA tutti ingressi
LATB = 0x00; // azzero il valore di tutti i pin del PORTB
TRISB = 0x00; // Imposto PORTB tutte uscite
LATC = 0x00; // azzero il valore di tutti i pin del PORTC
TRISC = 0x00; // Imposto PORTC tutte uscite
LATD = 0x00; // azzero il valore di tutti i pin del PORTD
TRISD = 0x00; // Imposto PORTD tutte uscite
LATE = 0x00; // azzero il valore di tutti i pin del PORTE
TRISE = 0xFF; // Imposto PORTE tutti ingressi
//-----------------------------------------------------------------------------//
setQuartz(frequenza_cpu); // se non lo metto la routine di delay si setta in automatico per lavorare a 20 MHz
//-----------------------------------------------------------------------------//
// Faccio lampeggiare un led sul PORTB0 come indicazione della corretta inizializzazione del microcontrollore
for (i=0;i<10;i++){
LATBbits.LATB0 = 1;
delay_ms (50);
LATBbits.LATB0 = 0;
delay_ms (50);
}
/*
Inizializzazione dell'LCD per farlo lavorare nella modalità multiplexata
a 4 bit e con una cpu che sta lavorando con un clock di 48 MHz
(Il cosiddetto "Primary Clock").
Da notare che la piedinatura della connessione del display deve essere editata nell'header LCD_44780.h
*/
OpenLCD (frequenza_cpu);
//CursorLCD(BLINK_ON,TURN_ON_CURSOR);
ClearLCD();
delay_ms(50);
BacklightLCD (TURN_ON_LED); //accende retroilluminazione del display comandata dal piedino PORTD7
GotoLineLCD(1);
WriteStringLCD (" Sistema di Allarme ");
GotoLineLCD(2);
WriteStringLCD (" Temperatura + Gas ");
GotoLineLCD(3);
WriteStringLCD ("- - - - - - ");
GotoLineLCD(4);
WriteStringLCD ("- - - - - - ");
delay_s(3);
ClearLCD();
// Seleziono AN0-AN1 come ingressi analogici
// Le VREF sono impostate a massa e a VCC
ADCON1 = 0b00001101;
// Imposto i tempi di conversione e la giustificazione a destra del Byte
// TAD : FOSC/4
// TACQ: 16 TAD
ADCON2 = 0b10110100;
/* Nel processo di conversione e acquisizione prima devo selezionare il canale e poi devo attivare la conversione A/D
altrimenti non parte l'ADC perchè non sa su quale pin attivare la conversione
*/
// Ciclo infinito
while (1) {
LATBbits.LATB0 = 1;
delay_ms(20);
sommatoria = 0;
// Seleziono AN1 come ingresso e abilito la conversione sul piedino selezionato
ADCON0 = 0b00000101;
/*
Potevo anche abilitare l'ADC dopo aver scelto l'ingresso analogico:
ADCON0 = 0b00000100;
// Abilito l' ADC
//ADCON0bits.ADON = 0x01;
*/
// Effettuo 10 letture per fare una media
for (i =0; i<10; i++){
// Avvio la conversione Analogico/Digitale per leggere il GAS
ADCON0bits.GO = 1;
// Attendo la fine della conversione
while(ADCON0bits.GO);
// Prelevo il valore della conversione
letturaGas = (((int) ADRESH) << 8) | ADRESL;
// Sommatoria delle letture fatte
sommatoria = sommatoria + letturaGas;
}
valoreGas = sommatoria / 10;
valoreGas = (valoreGas / 0.1023) - 96;
if (sommatoria/10 <= 10) {
valoreGas = 1;
}
if (sommatoria/10 > 1022) {
valoreGas = 10000;
}
if (valoreGas >= 5000){
LATBbits.LATB4 = 1;
}else {LATBbits.LATB4 = 0;}
// A questo punto ho la variabile "valoreGas" con il corretto valore
// della concentrazione del gas da visualizzare sul display
sommatoria = 0;
// Selezione AN0 come ingresso e abilito la conversione
ADCON0 = 0b00000001;
// Effettuo 10 letture per fare una media
for (i =0; i<10; i++){
// Avvio la conversione Analogico/Digitale
ADCON0bits.GO = 1;
// Attendo la fine della conversione
while(ADCON0bits.GO);
// Prelevo il valore della conversione
letturaTemp = (((int) ADRESH) << 8) | ADRESL;
// Sommatoria delle letture fatte
sommatoria = sommatoria + letturaTemp;
}
valoreTemperatura = sommatoria / 10;
// 1 shift per avere la temperatura in gradi
// divido cioe' per 2
valoreTemperatura = (valoreTemperatura / 10.23) - 20;
if (valoreTemperatura>=0) { valoreTemperaturaInt=valoreTemperatura;
frazione = (valoreTemperatura*10)-(valoreTemperaturaInt*10);
segno=32;
} else {
frazioneneg= valoreTemperatura * -1;
valoreTemperaturaInt=frazioneneg;
frazione = (frazioneneg*10)-(valoreTemperaturaInt * 10);
segno=45;
}
if (valoreTemperaturaInt == 0 && frazione == 0) {
segno = 32;
}
//A questo punto abbiamo le variabili "valoreTemperaturaInt" e "frazione" che contengono il valore della temperatura ambiente
LATBbits.LATB0 = 0;
GotoLineLCD(1);
WriteStringLCD ("Temperatura Ambiente");
GotoLineLCD(3);
WriteStringLCD (" Concentrazione Gas ");
GotoLineLCD(2);
WriteStringLCD (" Temp: "); //scrive la stringa formattata su 12 colonne
WriteCharLCD (segno);
WriteIntLCD (valoreTemperaturaInt,2);
WriteCharLCD (44);
WriteIntLCD (frazione,1);
ShiftCursorLCD (RIGHT,1);
WriteCharLCD (223);
WriteCharLCD ('C');
GotoLineLCD(4);
WriteStringLCD (" Gas: "); //scrive la stringa formattata su 12 colonne
WriteIntLCD (valoreGas,5);
WriteStringLCD (" ppm");
}
}
Ho fatto questo software che standalone funziona egregiamente e mostra i valori di temperatura e gas acquisiti.
Il problema che si pone ora è di caratura superiore dato che ho la necessità di comunicare i dati acquisiti al computer.
Avrei intenzione di attivare una comunicazione HID in full speed mode tra scheda pic e pc.
Ho provato a caricare sulla scheda alcuni hex precompilati ma windows non mi vede la scheda..
Sto impazzendo e sinceramente non vedo una via d'uscita. Esiste un tutorial dettagliato che mi fornisca un quadro completo della situazione??
Mi piacerebbe riuscire stasera a far riconoscere la scheda a windows

Grazie a tutti veramente....
Si prega Accesso o Crea un account a partecipare alla conversazione.
11 Anni 9 Mesi fa #2
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Approccio alla comunicazione HID tra 18f4550 e PC
Ciao,
per gli esempi USB con classe CDC puoi vedere il progetto Freedom Light .
Tra gli esempi c'e' uno con classe CDC e uno con classe HID.
In particolare per l'esempio HID c'e' anche la GUI che permette di visualizzare sulla barra la lettura di un ADC.
Per la GUI visto che Microchip fornisce qualcosa di gia' fatto, usa quello.
Normalmente c'e' cia VB .NET che VC++ .NET .
VB .NET e' piu' facile da usare qualora tu non conosca il C++.
Se vuoi usare il sistema anche su Linux, puoi pensare si usare Java o QT.
Saluti,
Mauro
per gli esempi USB con classe CDC puoi vedere il progetto Freedom Light .
Tra gli esempi c'e' uno con classe CDC e uno con classe HID.
In particolare per l'esempio HID c'e' anche la GUI che permette di visualizzare sulla barra la lettura di un ADC.
Per la GUI visto che Microchip fornisce qualcosa di gia' fatto, usa quello.
Normalmente c'e' cia VB .NET che VC++ .NET .
VB .NET e' piu' facile da usare qualora tu non conosca il C++.
Se vuoi usare il sistema anche su Linux, puoi pensare si usare Java o QT.
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
- velvettiere
- Autore della discussione
- Anziano Utente
-
Less
Di più
- Messaggi: 63
- Ringraziamenti ricevuti 0
11 Anni 9 Mesi fa - 11 Anni 9 Mesi fa #3
da velvettiere
Risposta da velvettiere al topic Approccio alla comunicazione HID tra 18f4550 e PC
Grazie Marco per il tuo aiuto. Il problema è che dopo aver aperto il progetto "USB Device - HID - Simple Custom Demo - C18 - PIC18F Starter Kit 1" ho provato a compilare e mancavano usb.h e usb_function.HID.h..... trovate queste 2 librerie e caricate con percordo /USB/.... ho ricompilato e mi ha dato un sacco di librerie mancanti che ho trovato nella cartella microchip per i pic non j....aggiunte queste ho ricompilato ed ora ottengo un errore strano che non riesco a capire:
C:\Documents and Settings\Valerio\Desktop\USB_esempi_programmazione\02-FL-HID-Input Output Demo\Firmware\USB\usbcfg.h:83:Error [1099] Not a supported board (yet), See "C:/Documents and Settings/Valerio/Desktop/USB_esempi_programmazione/02-FL-HID-Input Output Demo/Firmware/USB/usbcfg.h", line 82, or double click on this text.
Spero di poter risolvere in maniera semplice. Grazie mille e scusa del disturbo...
PS: Una domandina semplice: Tu preferisce la comunicazione USB emulando la seriale o la comunicazione HID ?
Scusa questa domanda ma continuo purtroppo a non capire quasi nulla su questa comunicazione tra pic e pc, non riesco a trovare il bandolo della matassa....scusa ancora
C:\Documents and Settings\Valerio\Desktop\USB_esempi_programmazione\02-FL-HID-Input Output Demo\Firmware\USB\usbcfg.h:83:Error [1099] Not a supported board (yet), See "C:/Documents and Settings/Valerio/Desktop/USB_esempi_programmazione/02-FL-HID-Input Output Demo/Firmware/USB/usbcfg.h", line 82, or double click on this text.
Spero di poter risolvere in maniera semplice. Grazie mille e scusa del disturbo...
PS: Una domandina semplice: Tu preferisce la comunicazione USB emulando la seriale o la comunicazione HID ?
Scusa questa domanda ma continuo purtroppo a non capire quasi nulla su questa comunicazione tra pic e pc, non riesco a trovare il bandolo della matassa....scusa ancora
Ultima Modifica 11 Anni 9 Mesi fa da velvettiere.
Si prega Accesso o Crea un account a partecipare alla conversazione.
11 Anni 9 Mesi fa #4
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Approccio alla comunicazione HID tra 18f4550 e PC
Ciao,
Inizia con un esempio di Freedom light.
Forse e' una versione precedente del framework ma per i PIC18 non e' cambiato molto.
Copia la cartella del progetto di esempio all'interno della cartella del framework.
Vedi la documentazione di freedom light per i percorsi da aggiungere.
Tra HID e CDC...
CDC e' più' semplice dal lato PC, per scrivere i programmi, ma un utente che deve installare un dispositivo si troverà' meglio con una periferica HID.
...plug band play...ovvero indolore.
Ciao
Mauro...no Marco!
Inizia con un esempio di Freedom light.
Forse e' una versione precedente del framework ma per i PIC18 non e' cambiato molto.
Copia la cartella del progetto di esempio all'interno della cartella del framework.
Vedi la documentazione di freedom light per i percorsi da aggiungere.
Tra HID e CDC...
CDC e' più' semplice dal lato PC, per scrivere i programmi, ma un utente che deve installare un dispositivo si troverà' meglio con una periferica HID.
...plug band play...ovvero indolore.
Ciao
Mauro...no Marco!

Si prega Accesso o Crea un account a partecipare alla conversazione.
- velvettiere
- Autore della discussione
- Anziano Utente
-
Less
Di più
- Messaggi: 63
- Ringraziamenti ricevuti 0
11 Anni 9 Mesi fa #5
da velvettiere
Risposta da velvettiere al topic Approccio alla comunicazione HID tra 18f4550 e PC
Ciao Mauro e scusami innanzitutto per l'errore commesso 
Sono riuscito a compilare il tuo esempio seguendo le tue guide ed ora il computer mi rileva la scheda USB HId e il programma mi fa vedere l'adc, led e pulsanti. Tutto molto bello e ti ringrazio infinitamente...
Ora però ho un problema strano con la mia scheda.
Il programma che ho compilato e postato fino a ieri funzionava, ma se lo provo a caricare adesso non mi funziona più. Cioè il chip viene programmato correttamente ma il programma nn parte.
Per quanto ne sò potrebbe essere che il tuo programma usava un bootloader ed ora se ci metto il mio prog che non lavora con bootloader non si avvia?
Sarebbe possibile riscrivere e CANCELLARE il bootloader, o devo per forsa buttare il mio pic?
Spero di no.. Grazie mille ciaociao..

Sono riuscito a compilare il tuo esempio seguendo le tue guide ed ora il computer mi rileva la scheda USB HId e il programma mi fa vedere l'adc, led e pulsanti. Tutto molto bello e ti ringrazio infinitamente...
Ora però ho un problema strano con la mia scheda.
Il programma che ho compilato e postato fino a ieri funzionava, ma se lo provo a caricare adesso non mi funziona più. Cioè il chip viene programmato correttamente ma il programma nn parte.
Per quanto ne sò potrebbe essere che il tuo programma usava un bootloader ed ora se ci metto il mio prog che non lavora con bootloader non si avvia?
Sarebbe possibile riscrivere e CANCELLARE il bootloader, o devo per forsa buttare il mio pic?
Spero di no.. Grazie mille ciaociao..
Si prega Accesso o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- Strana anomalia LT lib module_EEPROM
- da marcoilgrande
-
- Nuova versione Kicad 9
- da Mauro Laurenti
-
- MODULO GSM SIM900A
- da embedded
-
- Freedom III e compilazioni fallite
- da Black
-
- LTerminal - nuove funzioni
- da Mauro Laurenti