Vai al contenuto
PLC Forum


Settaggi Mplabx


walterword

Messaggi consigliati

qualcuno di voi sa come settare un progetto mplabX con C30 compiler?

Sto diventando scemo

Includo un file header per i2c e mi dice che dentro c'e' un link inrisolto ,vado a vedere e c'e' la seguente riga

#include <p30fxxxx.h> sottolineata di rosso

Praticamente qualsiasi uso di macro o definizione di questo file non e' valido ....chissa cosa bisognera fare

Nel vecchio mplab per includere un file di libreria bastava fare

#include <i2c.h>

ora invece bisogna fare un giro cosi

#include "../support/h/peripheral_30F_24H_33F/i2c.h"

ma lo da come warning infatti al suo interno c'e' quel problema spiegato sopra

mah....

Link al commento
Condividi su altri siti


I percorsi utilizzati dalla #include dipendono da alcuni settaggi del compilatore e anche a seconda se il nomefile è tra virgolette o tra parentesi angolari (come da K&R).

Questa nota http://msdn.microsoft.com/it-it/library/36k2cdd4.aspx è per VisualStudio, ma è valida per praticamente tutti i compilatori.

La definizione dei percorsi specifici dipende poi dalle opzioni del compilatore particolare usato (o dall'IDE).

Link al commento
Condividi su altri siti

Walter dipende dal direttorio in cui è archiviato il file da includere.

Solitamente i file da includere usando il nome tra < > son riferiti alla directory di default. Questa la stabilisci nelle opzioni di progetto dove elenchi le directory ed il tipo di suite usata per la compilazione. Tutto quello che non è in quella directory, almeno come directory principale, deve essere indicato tra " " con il percorso completo, proprio perchè le < > fanno riferimento alla directory "per difetto" ;)

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

il fatto delle < ...> va bene , lo stesso compilatore propone la lista dei file dopo aver digitato < .....ma le inclusioni dei file header delle periferiche con " .." mi funziona in modo strano

C'e' una voce sotto Run -> Set Project Configuration -> Global -> C30 -> Include directories -> che ho settato cosi

C:\Program Files (x86)\Microchip\MPLAB C30\support\h

Ma nulla da fare ...:(

Link al commento
Condividi su altri siti

ora uso cosi

....#include "../h/peripheral_30F_24H_33F/i2c.h"

....

e lo compila , solo che se uso una funzione per esempio

IdleI2C(); oppure

OpenI2C(I2C_ON             &  // Modulo in I2C
           I2C_IDLE_CON    &
           I2C_CLK_HLD     &
           I2C_IPMI_DIS    &   // No periferiche intelligenti
           I2C_7BIT_ADD    &   // Configure I2C for 7 bit address mode
           I2C_SLW_DIS     &   // No Slew Rate
           I2C_SM_DIS      &   // No compatibilita' con SMBUS
           I2C_GCALL_EN    &   // No interrupt in modalita' SLAVE
           I2C_STR_DIS     &   // Disable Stretch (Modalita' SLAVE)
           I2C_NACK        &   //
           I2C_ACK_EN      &
           I2C_RCV_EN      &
           I2C_STOP_EN     &
           I2C_RESTART_EN  &
           I2C_START_EN,
           0x110              // Baud rate is set for 100 Khz
           );

mi dice che non trova le definizioni ....

Link al commento
Condividi su altri siti

Bisogna verificare se riesce ad accedere al file che le contiene.

Di solito per venirne a capo si procede a piccoli passi elementari.

Inizia con usare gli include per singole definozioni separate.

potrebbe essere che non ne trova una dell'elenco ed allaora non le risolve tutte. A volte è sufficiente che l'editor inserisca un carattere che non vedi per mandare a ranocche tutto.

Link al commento
Condividi su altri siti

ho inserito una sottocartella nella cartella dei files header .E dentro ci ho messo tutti i .h delle periferiche che comunque sono collegati ad altri files di definizione in base al micro

Poi ho dovuto aggiungere il file linker script .gld , poi ho aggiunto una libreria -coff.a in library files .

Poi ho rifatto le dichiarazioni nel file main.h dove inserisco tutti gli headers del progetto e delle periferiche

In sostanza il mio scopo e' quello di usare file.c dedicati per ogni servizio o attività in modo tale da non sporcacciare il main.c , una cosa a moduli

Ogni strttura dati la dichiaro in un file .h suo e poi la includo nel main.h .

I vari file.c del codice implementano solo il main.h .

Ho fatto per tentativi in due giorni ed ora sembrerebbe compilare

La gestione di I2C slave la faccio in un file dedicato .c e per ora mi compila tutto senza problemi dopo aver ripulito .Mi da ognitanto un warning dicendo che il nome del vettore del interrupt i2c non e' valido

Nel file Comm_I2C.c scrivo questo

#include "Main.h"

InizializzaI2C()
{
     EnableIntSI2C  ;
     //SetPriorityIntSI2C(SI2C_INT_PRI_1);

     OpenI2C(I2C_ON        &  // Modulo in I2C
           I2C_IDLE_CON    &
           I2C_CLK_HLD     &
           I2C_IPMI_DIS    &   // No periferiche intelligenti
           I2C_7BIT_ADD    &   // Configure I2C for 7 bit address mode
           I2C_SLW_DIS     &   // No Slew Rate
           I2C_SM_DIS      &   // No compatibilita' con SMBUS
           I2C_GCALL_EN  &     // Interrupt in modalita' SLAVE
           I2C_STR_DIS     &   // Disable Stretch (Modalita' SLAVE)
           I2C_NACK        &   //
           I2C_ACK_EN      &
           I2C_RCV_EN      &
           I2C_STOP_EN     &
           I2C_RESTART_EN  &
           I2C_START_EN,
           0x110              // Baud rate is set for 100 Khz
           );
    
  IdleI2C();
}

 void __attribute__((__interrupt__ , auto_psv)) __SI2CInterrupt(void)
{

}

Ho dovuto aprire il file i2c.h del sistema per capire bene dentro cosa fa e come chiama i registri ed i prototipi delle funzioni nonche le macro .

Alcuni funzioni le gestisce esternamente con la direttiva

void CloseI2C(void) __attribute__ ((section (".libperi")));

Per cui ho incluso nella cartella dei files headers anche il file p30f4011.h .

Nel Main.h ho anche definito

#include "p30f4011.h"
#include <p30fxxxx.h>

.....

#include "peripheral_30F_24H_33F/ports.h"
#include "peripheral_30F_24H_33F/timer.h"
#include "peripheral_30F_24H_33F/i2c.h"
#include <string.h>
#include "StruttureDati.h"
#include "Comm_I2C.h"

E' abbastanza ostico il C30 , sicuramente potente , con 3000 manuali ect

Ora vedo cosa riesco a tirare fuori e poi mi butto sul CCS che per I2C in slave vuole poche direttive tipo #use I2C(velocità, master/slave,..) e per gli interrupt la fa piu semplice

Usarlo anche come ambiente separato da mblapx , il ccs credo che sia piu semplice e veloce da impostare e da usare ;)

comunque il C30 con ANSI C ha ben poco , ho visto che ci sono delle scelte per fargli digerire certe cose.Ho tirato fuori gli esercizi che avevo fatto al corso di algoritmi in C con codeblocks , liste , grafi ect e li ho provati con C30 .....ma e' meglio lasciar perdere

Settimana prox ordino ICD3 e un po di componenti da rs e da un altro rivenditore napoletano che ho visto ha delle belle cosette che costano anche poco .

Prendo anche le espansioni I/O della microchip , gli MCP28....che in I2c espandono da 8 a 16 pin e non costano niente , 1-2 euro

Sto progettando un sistema plc da espandere e portare avanti magari per la tesi l'anno prossimo .

Si tratta di un sandwich con schede una sopra l'altra con I/O , seriali , lcd-keypad , Termocoppia, analog I/O con bus i2c

Per la termocoppia prendo degli AO per studiare la cosa ma poi ripiego sul AD595 anche se costano un po , e un multiplexer CMos per acquisire 2-3 canali

Poi se al limite vedo che che la scheda cpu si carica troppo di lavoro magari la cambio con un micro a 32 bit , ce' solo l'imbarazzo della scelta , l'importante e' che il sistema sia ben stabile e che metta a disposizione almeno i2c.

E' un lavoro impegnativo e faticoso tra progettazione , ricerca componenti ect , bo vado avanti

Link al commento
Condividi su altri siti

Usarlo anche come ambiente separato da mblapx , il ccs credo che sia piu semplice e veloce da impostare e da usare

Sicuramente è uno dei migliori compilatori per PIC.

comunque il C30 con ANSI C ha ben poco

Oramai tutti compilatori sono un sovrainsieme del C ANSI, altrimenti non riusciresti ad ottenere le ottimizzazioni molto spinte a cui siamo abituati. E' un po' come i PLC che diaciarano di rispettare lo standrd IEC; se usi solo le istruzioni che rientrano nello standard fai ben poco. :(

Link al commento
Condividi su altri siti

e gia....C30 e' molto spinto e credo sia buono per fare applicazioni o programmazioni anche particolari .

Credo che per iniziare e giocare ed avere subito risultati sia meglio il CCS .Tra l'altro potrei fare gia un programmino e caricarlo da xpmode con icd2 selezionando l'hex ...cosa lunga ma giusto per provare

Livio poi quando avrai tempo dovro chiederti una cosa ...sto riuscendo a fare un plc con lista istruzioni cioe macro in assembly col pic16f876-877 ...

Per cui prima leggo gli ingressi , li filtro dal debouncing e li definisco come I0.0 ect ....cosi faccio con i merker , tutto in assembly .

Poi c'e' lo spazio dedicato al programma utente in IL e poi la gestione delle uscite , cioe la scrittura verso i dispositivi di uscita.

Stavo pensando ....io carico il programma assembly senza la parte progamma utente plc ...questa la carico tramite seriale in una certa porzione di memoria ....

Nel programma assembly precaricato posso manipolare il program counter o il registro dell eistruzioni e farlo puntare in una specifica area di memoria cove inizia il programma utente che ho scaricato tramite seriale ?

Sto vedendo l'uso dei registri in assembly e sembrerebbe che si possa fare , certo non e' cosa semplice ...

In pratica come un vero e proprio plc sul quale gira un firmware che arriva ad un certo punto di memoria e non trovando nulla prosegue e va a scrivere le uscite , se invece trova il programma utente lo esegue e poi va a scrivere le uscite ....

cosa mi dici Livio?

Se la cosa sta in piedi , piu avanti voglio mettere giu un ambientino ladder che compila in base alla macro che sto facendo e scarica in memoria del plc-pic il programma ....

Lo sai che il mio scopo in questa vita e' quella di costruire un vero e proprio plc no ? Quindi prima di morire lo devo fare . cosi ne approfitto per studiare e dare un senso alle teorie ...

Modificato: da walterword
Link al commento
Condividi su altri siti

Nel programma assembly precaricato posso manipolare il program counter o il registro dell eistruzioni e farlo puntare in una specifica area di memoria cove inizia il programma utente che ho scaricato tramite seriale ?

Certamente. Io lo farei richiamare a tempi fissi.

Il firmware gestisce in backgraud le periferie Hw della macchina, seriali display, I2C, etc. Ad intervalli di tempo fissi, 10 ms p.e., il FMW legge gli ingressi, licopia in memoria, copia gli stati delle uscite dalla memoria alla periferia Hw, elabora il programma applicativo.

Link al commento
Condividi su altri siti

io vorrei far leggere ed elaborare I/O a tempo fisso e poi far eseguire il programma utente a tempo in modo tale da garantire un minimo tempo di esecuzione dei tasks ....si comunque anche come dici tu e' giusto ...la cosa ideale sarebbe se il firmware fosse piu ' un sistema operativo real time e si possa dedicare il tempo per ogni task ...ma i sistemi operativi li faro' l'annoprosismo per cui adesso andrebbe bene anche cosi .

Livio hai capito cosa intendo di sopra. no ?

Link al commento
Condividi su altri siti

..la cosa ideale sarebbe se il firmware fosse piu ' un sistema operativo real time...

In effetti lo è anche se semplicissimo ed è limitato ad un task di bacgroud ed uno di forground.

Come ti ho scritto nel #10 i tempi fissi li imponi tu.

Io ho ipotizzato un richiamo ogni 10 ms della gestione degli I/O e del programma utente. Ovviamente nel momento che viene attivato questo job deve anche essere attivato un watch dog, anche se per me è improprio come termine inquesto caso. In pratica se dopo, ad esempio, 8 ms (ovvero lo 80% del tempo disponibile) il programma utente non è stato terminato, si entra in una procedura di ritorno al background; in pratica alla prossima attivazione non si riparte con la lettura-scrittura deglio I/O, ma si riprende il programma utente da dove era stato lasciato.

Ovviamente poi è necessario un allarme per evitare una reiterazione infinita di questa situazione.

Questo è il modo di operare dei sistemi mutitasking, solo che è più complesso perchè il forground prevede numerosi tasks con varie priorità.

Comunque se vuoi farti un PLC vai sul sito di TI, che hanno appena messo disponibile un processore specifico, oltre a numerosa documentazione. Purtroppo la mail con le indicazioni ce l'ho su un altro PC ed ora non posso darti il link diretto.

Link al commento
Condividi su altri siti

dammi il lin appena puoi che vado a sbirciare anche se ormai sonogia partito con hw e risorse in un certo senso.

C'eun RTOS si chiama Salvo ...

comunque sia un RTOS fatto in modo soddisfacente succhia un sacco di risorse , ram ect .....per un piccolo pic direi che il firmware cosi com'e' e' gia un micro OS monotask ....senz asemafori , mutes ect

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...