- Messaggi: 58
- Ringraziamenti ricevuti 1
×
MSP430, Microcontrollori 16 bit Ultra Low Power
Librerie MSP430 - Code Composer Studio
10 Anni 7 Mesi fa #21
da mastroebano
Risposta da mastroebano al topic Librerie MSP430 - Code Composer Studio
Paolo buongiorno
allora nel frattempo ho fatto ulteriore prove e finalmente estraendo il tuo progetto in una cartella sono riuscito ad importarlo con la funzione (Import Existing CCS Eclipse Project) in Project Explorer e finalmente riesco ad aprirlo e compilarlo: Il compilatore mi da solo un Warnings, poiche tua hai compilato il progetto con una versione di CCS precedente alla mia, ma credo che questo non sia importante.
Ora veniamo a noi aprendo il tuo progetto questo è composto da un LCD.c,un LCD.h e da un main.c Ora aprendo il LCD.c io vedo e capisco che li hai definito tutte le procedure per comandare il display e dbbo dire che il programma mi è abbastanza chiaro tranne qualche istruzione che poi chiederò spiegazioni.
Il main.c è il corpo del programma dove (se ho capito bene guardando il programma) tu display attraverso il ciclo while un numero, una stringa definiti nelle variabili ed infine il messaggio HELLO WORD.
Giunti a qusto punto s'è vero tutto quello che ho detto ti rifaccio la domanda di partenza :
io apro un nuovo progetto con CCS e lo chiamo PIPPO ora voglio importare in PIPPO la tua libreria per gestire un LCD cosa debbo fare? Ovviamente importanto la tua libreria credo che debbo importare solo LCD.c poiche se importassi tutto il progetto avrei anche un main.c che mi displayerebbe quello che tu hai inserito ne l tuo main.c . Sperando di essermi spiegato e scusandomi per la lungaggino ti saluto Antonio
allora nel frattempo ho fatto ulteriore prove e finalmente estraendo il tuo progetto in una cartella sono riuscito ad importarlo con la funzione (Import Existing CCS Eclipse Project) in Project Explorer e finalmente riesco ad aprirlo e compilarlo: Il compilatore mi da solo un Warnings, poiche tua hai compilato il progetto con una versione di CCS precedente alla mia, ma credo che questo non sia importante.
Ora veniamo a noi aprendo il tuo progetto questo è composto da un LCD.c,un LCD.h e da un main.c Ora aprendo il LCD.c io vedo e capisco che li hai definito tutte le procedure per comandare il display e dbbo dire che il programma mi è abbastanza chiaro tranne qualche istruzione che poi chiederò spiegazioni.
Il main.c è il corpo del programma dove (se ho capito bene guardando il programma) tu display attraverso il ciclo while un numero, una stringa definiti nelle variabili ed infine il messaggio HELLO WORD.
Giunti a qusto punto s'è vero tutto quello che ho detto ti rifaccio la domanda di partenza :
io apro un nuovo progetto con CCS e lo chiamo PIPPO ora voglio importare in PIPPO la tua libreria per gestire un LCD cosa debbo fare? Ovviamente importanto la tua libreria credo che debbo importare solo LCD.c poiche se importassi tutto il progetto avrei anche un main.c che mi displayerebbe quello che tu hai inserito ne l tuo main.c . Sperando di essermi spiegato e scusandomi per la lungaggino ti saluto Antonio
Si prega Accedi o Crea un account a partecipare alla conversazione.
- mastroebano
- Autore della discussione
- Senior Member
Riduci
Di più
10 Anni 7 Mesi fa #22
da elpablito
Risposta da elpablito al topic Librerie MSP430 - Code Composer Studio
Eccomi qua, buon giorno.
Caso 1) esercitazione: crei il tuo progetto PIPPO vai sulla sinistra dove ai tutti i progetti,clicchi con il destro su Pippo ADD FILE e aggiungi LCD430.h e LCD430.c a Pippo, devi aggiungerli tutti e due, vai su main.c e aggiungi #include "LCD430.h", compila il tutto e non dovresti avere errori, forse un warning per qualche troncamento, non farci caso. Poi scrivi il tuo main.c.
Caso 2) Per chi come me non ha voglia di lavorare. Apri il mio progetto LCD_G..... Poi ci clicchi sopra con il destro e scegli RENAME, gli cambi nome e gli dai quello che vuoi. Poi clicchi su il mio LCD....C col destro quindi RENAME e gli dai un nome. Vai nel rinominato pippo.c e lo modifichi di conseguenza. Se fai un passo alla volta e compili scopri se ci sono errori.
Suggerimento: adesso che hai importato il mio progetto fatti un hardware su un pezzo di millefori, che è molto semplice, su cui ci infili la LaunchPad e il display usando qualche connettore a 2,54,così non rovini nulla; poi fai un debug fatto bene, provi a modificare scritte e posizioni e vedrai che poi non hai più problemi.
Ciao
Paolo
Caso 1) esercitazione: crei il tuo progetto PIPPO vai sulla sinistra dove ai tutti i progetti,clicchi con il destro su Pippo ADD FILE e aggiungi LCD430.h e LCD430.c a Pippo, devi aggiungerli tutti e due, vai su main.c e aggiungi #include "LCD430.h", compila il tutto e non dovresti avere errori, forse un warning per qualche troncamento, non farci caso. Poi scrivi il tuo main.c.
Caso 2) Per chi come me non ha voglia di lavorare. Apri il mio progetto LCD_G..... Poi ci clicchi sopra con il destro e scegli RENAME, gli cambi nome e gli dai quello che vuoi. Poi clicchi su il mio LCD....C col destro quindi RENAME e gli dai un nome. Vai nel rinominato pippo.c e lo modifichi di conseguenza. Se fai un passo alla volta e compili scopri se ci sono errori.
Suggerimento: adesso che hai importato il mio progetto fatti un hardware su un pezzo di millefori, che è molto semplice, su cui ci infili la LaunchPad e il display usando qualche connettore a 2,54,così non rovini nulla; poi fai un debug fatto bene, provi a modificare scritte e posizioni e vedrai che poi non hai più problemi.
Ciao
Paolo
Si prega Accedi o Crea un account a partecipare alla conversazione.
- elpablito
- Platinum Member
Riduci
Di più
- Messaggi: 353
- Ringraziamenti ricevuti 8
10 Anni 7 Mesi fa #23
da mastroebano
Risposta da mastroebano al topic Librerie MSP430 - Code Composer Studio
Paolo eccomi ho eseguito la procedura CASO 1 bene nel momento della compilazione ho il seguente messaggio :
Errors (1 item) ci clicco sopra e mi dice #1965 cannot open sourc file "LCD430.h". Tieni presente che nel mio main.c non ho scritto niente è forse dovuto a questo la segnalazione di errore?
Per il discorso hardware non è un problema faccio un piccolo stampato da porre sospra la LaunchPad tipo pig back.
Per il discorso sopra ho un dubbio (scusa per 40 anni ho fatto l'hardwerista non sono molto avezzo alla programmazione ma debbo tenere svegli i neuroni alla mia età) una volta che funziona tutto, io ho nel mio progetto il file LCD.h e LCD.c ma nel mio main.c debbo sempre settare port& US ed srivere la USI interrupt routine come riportato sotto vero?
Ciao Antonio
USICTL0 = USIPE6+USIPE7+USIMST+USISWRST; // Port & USI in modo setup
USICTL1 = USII2C+USIIE; // abilita I2C & USI interrupt
USICKCTL = USIDIV_6+USISSEL_2+USICKPL; // Setup USI clocks: SCL = SMCLK/8 (~125kHz)
USICNT |= USIIFGCC; // Disabilita automatic clear control
USICTL0 &= ~USISWRST; // abilita USI
USICTL1 &= ~USIIFG; // Clear pending flag
_EINT();
#pragma vector = USI_VECTOR
__interrupt void USI_TXRX (void)
{
switch(I2C_State)
{
case 0: // Genera lo Start e invia l'indirizzo
P1OUT |= 0x01; // LED on: sequence start
USISRL = 0x00; // Genera LO Start .....
USICTL0 |= USIGE+USIOE;
USICTL0 &= ~USIGE;
USISRL = slv_addr; // ... e trasmette l'indirizzo dello slave
USICNT = (USICNT & 0xE0) + 0x08; // Bit counter = 8, TX Address
I2C_State = 2; // allo stato successivo: receive address (N)Ack
break;
case 2: // Receve Address Ack/Nack bit
USICTL0 &= ~USIOE; // SDA = input
USICNT |= 0x01; // Bit counter = 1, receve (N)Ack bit
I2C_State = 4; // allo stato successivo: check (N)Ack
break;
case 4: // Processa Address Ack/Nack & trasmette MST_data
USICTL0 |= USIOE; // SDA = output
if (USISRL & 0x01) // Se riceve un Nack ...
{ // Trasmette uno stop...
USISRL = 0x00;
USICNT |= 0x01; // Bit counter = 1, SCL high, SDA low
I2C_State = 10; // Va allo stato successivo: generate Stop
P1OUT |= 0x01; // Accende il LED: errore
}
else
{ // Se ricevuto un Ack, TX data allo slave...
USISRL = MST_data; // carica il data byte
USICNT |= 0x08; // Bit counter = 8, inizia TX
I2C_State = 6; // va allo stato successivo: receive data (N)Ack
P1OUT &= ~0x01; // spegne il LED
}
break;
case 6: // Receve il bit Ack/Nack
USICTL0 &= ~USIOE; // SDA = input
USICNT |= 0x01; // Bit counter = 1, receve (N)Ack bit
I2C_State = 8; // va allo stato successivo: verisica se (N)Ack
break;
case 8: // Processa MST_data in funzione di Ack/Nack & invio lo Stop
USICTL0 |= USIOE;
if (USISRL & 0x01) // se ha ricevuto un Nack ...
P1OUT |= 0x01; // accende il LED: errore
else // se è invece un Ack
{
MST_data++; // Incrementa il Master data
P1OUT &= ~0x01; // spegne il LED
}
// Send stop...
USISRL = 0x00;
USICNT |= 0x01; // Bit counter = 1, SCL high, SDA low
I2C_State = 10; // va allo stato successivo: genera uno Stop
break;
case 10:// Genera la condizione di Stop
USISRL = 0x0FF; // USISRL = 1 to release SDA
USICTL0 |= USIGE; // Abilitato il Transparent latch
USICTL0 &= ~(USIGE+USIOE); // Disabilita Latch/SDA output
I2C_State = 0; // Resetta lo stato per una nuova trasmissione
LPM0_EXIT; // stato attivo per il nuovo transfer
flag=1;
break;
}
USICTL1 &= ~USIIFG; // Clear il flag attivo
}
Errors (1 item) ci clicco sopra e mi dice #1965 cannot open sourc file "LCD430.h". Tieni presente che nel mio main.c non ho scritto niente è forse dovuto a questo la segnalazione di errore?
Per il discorso hardware non è un problema faccio un piccolo stampato da porre sospra la LaunchPad tipo pig back.
Per il discorso sopra ho un dubbio (scusa per 40 anni ho fatto l'hardwerista non sono molto avezzo alla programmazione ma debbo tenere svegli i neuroni alla mia età) una volta che funziona tutto, io ho nel mio progetto il file LCD.h e LCD.c ma nel mio main.c debbo sempre settare port& US ed srivere la USI interrupt routine come riportato sotto vero?
Ciao Antonio
USICTL0 = USIPE6+USIPE7+USIMST+USISWRST; // Port & USI in modo setup
USICTL1 = USII2C+USIIE; // abilita I2C & USI interrupt
USICKCTL = USIDIV_6+USISSEL_2+USICKPL; // Setup USI clocks: SCL = SMCLK/8 (~125kHz)
USICNT |= USIIFGCC; // Disabilita automatic clear control
USICTL0 &= ~USISWRST; // abilita USI
USICTL1 &= ~USIIFG; // Clear pending flag
_EINT();
#pragma vector = USI_VECTOR
__interrupt void USI_TXRX (void)
{
switch(I2C_State)
{
case 0: // Genera lo Start e invia l'indirizzo
P1OUT |= 0x01; // LED on: sequence start
USISRL = 0x00; // Genera LO Start .....
USICTL0 |= USIGE+USIOE;
USICTL0 &= ~USIGE;
USISRL = slv_addr; // ... e trasmette l'indirizzo dello slave
USICNT = (USICNT & 0xE0) + 0x08; // Bit counter = 8, TX Address
I2C_State = 2; // allo stato successivo: receive address (N)Ack
break;
case 2: // Receve Address Ack/Nack bit
USICTL0 &= ~USIOE; // SDA = input
USICNT |= 0x01; // Bit counter = 1, receve (N)Ack bit
I2C_State = 4; // allo stato successivo: check (N)Ack
break;
case 4: // Processa Address Ack/Nack & trasmette MST_data
USICTL0 |= USIOE; // SDA = output
if (USISRL & 0x01) // Se riceve un Nack ...
{ // Trasmette uno stop...
USISRL = 0x00;
USICNT |= 0x01; // Bit counter = 1, SCL high, SDA low
I2C_State = 10; // Va allo stato successivo: generate Stop
P1OUT |= 0x01; // Accende il LED: errore
}
else
{ // Se ricevuto un Ack, TX data allo slave...
USISRL = MST_data; // carica il data byte
USICNT |= 0x08; // Bit counter = 8, inizia TX
I2C_State = 6; // va allo stato successivo: receive data (N)Ack
P1OUT &= ~0x01; // spegne il LED
}
break;
case 6: // Receve il bit Ack/Nack
USICTL0 &= ~USIOE; // SDA = input
USICNT |= 0x01; // Bit counter = 1, receve (N)Ack bit
I2C_State = 8; // va allo stato successivo: verisica se (N)Ack
break;
case 8: // Processa MST_data in funzione di Ack/Nack & invio lo Stop
USICTL0 |= USIOE;
if (USISRL & 0x01) // se ha ricevuto un Nack ...
P1OUT |= 0x01; // accende il LED: errore
else // se è invece un Ack
{
MST_data++; // Incrementa il Master data
P1OUT &= ~0x01; // spegne il LED
}
// Send stop...
USISRL = 0x00;
USICNT |= 0x01; // Bit counter = 1, SCL high, SDA low
I2C_State = 10; // va allo stato successivo: genera uno Stop
break;
case 10:// Genera la condizione di Stop
USISRL = 0x0FF; // USISRL = 1 to release SDA
USICTL0 |= USIGE; // Abilitato il Transparent latch
USICTL0 &= ~(USIGE+USIOE); // Disabilita Latch/SDA output
I2C_State = 0; // Resetta lo stato per una nuova trasmissione
LPM0_EXIT; // stato attivo per il nuovo transfer
flag=1;
break;
}
USICTL1 &= ~USIIFG; // Clear il flag attivo
}
Si prega Accedi o Crea un account a partecipare alla conversazione.
- mastroebano
- Autore della discussione
- Senior Member
Riduci
Di più
- Messaggi: 58
- Ringraziamenti ricevuti 1
10 Anni 7 Mesi fa #24
da mastroebano
Risposta da mastroebano al topic Librerie MSP430 - Code Composer Studio
giusto per essere più preciso accludo il file del programma e la segalazione di errore
#include <msp430.h>
#include <LCD430.h>
/*
* main.c
*/
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
if (CALBC1_8MHZ==0xFF) // If calibration constants erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_8MHZ; // Set DCO
DCOCTL = CALDCO_8MHZ;
P1OUT = 0xC0; // P1.6 & P1.7 Pullups, altre a 0
P1REN |= 0xC0; // P1.6 & P1.7 Pullups
P1DIR = 0xFF; // Pin non usati settati ein uscita
P2OUT = 0;
P2DIR = 0xFF;
USICTL0 = USIPE6+USIPE7+USIMST+USISWRST; // Port & USI in modo setup
USICTL1 = USII2C+USIIE; // abilita I2C & USI interrupt
USICKCTL = USIDIV_6+USISSEL_2+USICKPL; // Setup USI clocks: SCL = SMCLK/8 (~125kHz)
USICNT |= USIIFGCC; // Disabilita automatic clear control
USICTL0 &= ~USISWRST; // abilita USI
USICTL1 &= ~USIIFG; // Clear pending flag
_EINT();
return 0;
}
#pragma vector = USI_VECTOR
__interrupt void USI_TXRX (void)
{
switch(I2C_State)
{
case 0: // Genera lo Start e invia l'indirizzo
P1OUT |= 0x01; // LED on: sequence start
USISRL = 0x00; // Genera LO Start .....
USICTL0 |= USIGE+USIOE;
USICTL0 &= ~USIGE;
USISRL = slv_addr; // ... e trasmette l'indirizzo dello slave
USICNT = (USICNT & 0xE0) + 0x08; // Bit counter = 8, TX Address
I2C_State = 2; // allo stato successivo: receive address (N)Ack
break;
case 2: // Receve Address Ack/Nack bit
USICTL0 &= ~USIOE; // SDA = input
USICNT |= 0x01; // Bit counter = 1, receve (N)Ack bit
I2C_State = 4; // allo stato successivo: check (N)Ack
break;
case 4: // Processa Address Ack/Nack & trasmette MST_data
USICTL0 |= USIOE; // SDA = output
if (USISRL & 0x01) // Se riceve un Nack ...
{ // Trasmette uno stop...
USISRL = 0x00;
USICNT |= 0x01; // Bit counter = 1, SCL high, SDA low
I2C_State = 10; // Va allo stato successivo: generate Stop
P1OUT |= 0x01; // Accende il LED: errore
}
else
{ // Se ricevuto un Ack, TX data allo slave...
USISRL = MST_data; // carica il data byte
USICNT |= 0x08; // Bit counter = 8, inizia TX
I2C_State = 6; // va allo stato successivo: receive data (N)Ack
P1OUT &= ~0x01; // spegne il LED
}
break;
case 6: // Receve il bit Ack/Nack
USICTL0 &= ~USIOE; // SDA = input
USICNT |= 0x01; // Bit counter = 1, receve (N)Ack bit
I2C_State = 8; // va allo stato successivo: verisica se (N)Ack
break;
case 8: // Processa MST_data in funzione di Ack/Nack & invio lo Stop
USICTL0 |= USIOE;
if (USISRL & 0x01) // se ha ricevuto un Nack ...
P1OUT |= 0x01; // accende il LED: errore
else // se è invece un Ack
{
MST_data++; // Incrementa il Master data
P1OUT &= ~0x01; // spegne il LED
}
// Send stop...
USISRL = 0x00;
USICNT |= 0x01; // Bit counter = 1, SCL high, SDA low
I2C_State = 10; // va allo stato successivo: genera uno Stop
break;
case 10:// Genera la condizione di Stop
USISRL = 0x0FF; // USISRL = 1 to release SDA
USICTL0 |= USIGE; // Abilitato il Transparent latch
USICTL0 &= ~(USIGE+USIOE); // Disabilita Latch/SDA output
I2C_State = 0; // Resetta lo stato per una nuova trasmissione
LPM0_EXIT; // stato attivo per il nuovo transfer
flag=1;
break;
}
USICTL1 &= ~USIIFG; // Clear il flag attivo
}
SEGNALAZIONE DI ERRORE
1 catastrophic error detected in the compilation of "../main.c".
Compilation terminated.
>> Compilation failure
gmake: *** [main.obj] Error 1
gmake: Target `all' not remade because of errors.
**** Build Finished ****
Ciao Antonio
#include <msp430.h>
#include <LCD430.h>
/*
* main.c
*/
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
if (CALBC1_8MHZ==0xFF) // If calibration constants erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_8MHZ; // Set DCO
DCOCTL = CALDCO_8MHZ;
P1OUT = 0xC0; // P1.6 & P1.7 Pullups, altre a 0
P1REN |= 0xC0; // P1.6 & P1.7 Pullups
P1DIR = 0xFF; // Pin non usati settati ein uscita
P2OUT = 0;
P2DIR = 0xFF;
USICTL0 = USIPE6+USIPE7+USIMST+USISWRST; // Port & USI in modo setup
USICTL1 = USII2C+USIIE; // abilita I2C & USI interrupt
USICKCTL = USIDIV_6+USISSEL_2+USICKPL; // Setup USI clocks: SCL = SMCLK/8 (~125kHz)
USICNT |= USIIFGCC; // Disabilita automatic clear control
USICTL0 &= ~USISWRST; // abilita USI
USICTL1 &= ~USIIFG; // Clear pending flag
_EINT();
return 0;
}
#pragma vector = USI_VECTOR
__interrupt void USI_TXRX (void)
{
switch(I2C_State)
{
case 0: // Genera lo Start e invia l'indirizzo
P1OUT |= 0x01; // LED on: sequence start
USISRL = 0x00; // Genera LO Start .....
USICTL0 |= USIGE+USIOE;
USICTL0 &= ~USIGE;
USISRL = slv_addr; // ... e trasmette l'indirizzo dello slave
USICNT = (USICNT & 0xE0) + 0x08; // Bit counter = 8, TX Address
I2C_State = 2; // allo stato successivo: receive address (N)Ack
break;
case 2: // Receve Address Ack/Nack bit
USICTL0 &= ~USIOE; // SDA = input
USICNT |= 0x01; // Bit counter = 1, receve (N)Ack bit
I2C_State = 4; // allo stato successivo: check (N)Ack
break;
case 4: // Processa Address Ack/Nack & trasmette MST_data
USICTL0 |= USIOE; // SDA = output
if (USISRL & 0x01) // Se riceve un Nack ...
{ // Trasmette uno stop...
USISRL = 0x00;
USICNT |= 0x01; // Bit counter = 1, SCL high, SDA low
I2C_State = 10; // Va allo stato successivo: generate Stop
P1OUT |= 0x01; // Accende il LED: errore
}
else
{ // Se ricevuto un Ack, TX data allo slave...
USISRL = MST_data; // carica il data byte
USICNT |= 0x08; // Bit counter = 8, inizia TX
I2C_State = 6; // va allo stato successivo: receive data (N)Ack
P1OUT &= ~0x01; // spegne il LED
}
break;
case 6: // Receve il bit Ack/Nack
USICTL0 &= ~USIOE; // SDA = input
USICNT |= 0x01; // Bit counter = 1, receve (N)Ack bit
I2C_State = 8; // va allo stato successivo: verisica se (N)Ack
break;
case 8: // Processa MST_data in funzione di Ack/Nack & invio lo Stop
USICTL0 |= USIOE;
if (USISRL & 0x01) // se ha ricevuto un Nack ...
P1OUT |= 0x01; // accende il LED: errore
else // se è invece un Ack
{
MST_data++; // Incrementa il Master data
P1OUT &= ~0x01; // spegne il LED
}
// Send stop...
USISRL = 0x00;
USICNT |= 0x01; // Bit counter = 1, SCL high, SDA low
I2C_State = 10; // va allo stato successivo: genera uno Stop
break;
case 10:// Genera la condizione di Stop
USISRL = 0x0FF; // USISRL = 1 to release SDA
USICTL0 |= USIGE; // Abilitato il Transparent latch
USICTL0 &= ~(USIGE+USIOE); // Disabilita Latch/SDA output
I2C_State = 0; // Resetta lo stato per una nuova trasmissione
LPM0_EXIT; // stato attivo per il nuovo transfer
flag=1;
break;
}
USICTL1 &= ~USIIFG; // Clear il flag attivo
}
SEGNALAZIONE DI ERRORE
1 catastrophic error detected in the compilation of "../main.c".
Compilation terminated.
>> Compilation failure
gmake: *** [main.obj] Error 1
gmake: Target `all' not remade because of errors.
**** Build Finished ****
Ciao Antonio
Si prega Accedi o Crea un account a partecipare alla conversazione.
- mastroebano
- Autore della discussione
- Senior Member
Riduci
Di più
- Messaggi: 58
- Ringraziamenti ricevuti 1
10 Anni 7 Mesi fa #25
da elpablito
Risposta da elpablito al topic Librerie MSP430 - Code Composer Studio
@ Antonio
Poi guardo la chiacchierata però incomincia con il cambiare
#include <LCD430.h> con #include "LCD430.h" perchè il file è nella directory del progetto e quindi "..."
e non <...>.
Poi ti mancano le variabili, ma facciamo un passo alla volta, compila e dimmi
Ciao
Paolo
Poi guardo la chiacchierata però incomincia con il cambiare
#include <LCD430.h> con #include "LCD430.h" perchè il file è nella directory del progetto e quindi "..."
e non <...>.
Poi ti mancano le variabili, ma facciamo un passo alla volta, compila e dimmi
Ciao
Paolo
Si prega Accedi o Crea un account a partecipare alla conversazione.
- elpablito
- Platinum Member
Riduci
Di più
- Messaggi: 353
- Ringraziamenti ricevuti 8
Moderatori: Mauro Laurenti, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.