Home Forum MICROCONTROLLORI info funzione

Questo argomento contiene 5 risposte, ha 3 partecipanti, ed è stato aggiornato da  Emanuele 2 anni, 9 mesi fa.

Stai vedendo 6 articoli - dal 1 a 6 (di 6 totali)
  • Autore
    Articoli
  • #58599

    OPGUIDO
    Membro

    Salve,sto cercando di imparare piu cose sulla programmazione dei microcontrollori , mi spiegate come si scrive in C una funzione fuori dal main e che il main la riconosca?
    Per cortesia mi portate un esempio.
    Grazie

    #70906

    ingmarketz
    Membro

    Ciao, bhe la scrittura in C di un firmware è uguale alla stesura di un normale programma C eccetto per il fatto che dovrai avere delle librerie dedicate alle varie operazioni specifiche per il tuo hardware in questo caso il microcontrollore. Mi spiego meglio se tu dovessi scrivere un firmware molto semplice in cui devi accendere un LED ad esempio che si trova collegato al pin x del microcontrollore basta cercare nelle librerie come si chiama la variabile che rappresenta per quel PIN è assegnare a tale variabile il valore 1 inteso come livello logico alto per esempio.

    Chiaramente il mio è un esempio molto astratto, perchè ad esempio spesso le librerie contengono variabili che rappresentano un gruppo di bit associati a un gruppo di pin , poi si deve affrontare il problema di impostare tali pin come uscite (output) o come ingressi(input) ma l’uso del C semplifica molto queste operazioni perchè tutte queste cose possono essere fatte operando su variabili che rappresentano come dicevo prima : i pin o registri del microcontrollore.(nella maggior parte dei casi rappresentano registri del micro) .

    Se dovessi ad esempio scrivere un firmware per decrementare un registro contatore interno al microcontrollore basta solo cercare con che nome la variabile che rappresenta il registro si presenta nelle librerie e usarla all’interno di un tipico ciclo for (che se hai dimestichezza con il C sai sicuramente impostare ) .

    Quindi in sostanza sarebbe meglio che tu abbia prima buona dimestichezza con il C se hai già acquisito tali nozioni, allora inizia a scaricare qualche firmware di esempi che trovi su internet o su libri come ad esempio firmware per accendere led , vedrai che saprai interpretare le operazioni che vengono svolte perchè è un semplice esercizio di interpretazione di linguaggio C .

    Infine volevo aggiungere che oltre a conoscere il C e analizzare le librerie per prendere familiarità con le variabili che dovrai usare è necessario ancor prima che tu sappia qual’è l’architettura del tuo microcontrollore ovvero devi prendere il datasheet e studiarlo per capire a livello hardware quali saranno i registri o le funzionalità del micro che vuoi usare una volta noti questi aspetti il gioco è fatto: basta solo capire come le librerie rappresentano tali entità che siano registri o funzionalità , un tipo di funzionalità può essere :
    – routine di gestione di interrupt => ci sarà nelle librerie una funzione ad esempio:
    int gestore_interrupt(int interrupt){}
    di cui dovrai scrivere il corpo della funzione
    – routine di gestione del watchdog timer(un tipo di timer contenuto in alcuni micro)
    -etc…

    Spero di essere stato abbastanza chiaro per qualsiasi altra info o chiarimento ci trovi qui. a presto

    #70907

    ingmarketz
    Membro

    a scusa in conclusione non ho risposto alla tua domanda: se effettivamente pensi di non sapere scrivere una funzione fuori dal main forse dovresti ripassare il C un po più approfonditamente ovvero il problema non è relativo alla programmazione hardware ma software. ciao spero che le mie critiche costruttive ti siano state id aiuto.

    #70905

    Emanuele
    Keymaster

    Ciao OPGUIDO,
    il normale flusso di programma in un microcontrollore , dopo le direttive al compilatore, prevede la funzione main (che deve essere vuota – void)
    Al di fuori del mai puoi scrivere qualsiasi altra funzione, sia sopra che sotto (nell’editor di testo) questa potrà essere richiamata dal main come si richiama una normale funzione (assimilabile alle chiamate e subroutine ‘call’ che fai in assembler)

    
    //DIRETTIVE
    #include <usart.h>
    #include <stdio.h>
    
    #pragma config PWRT = OFF	//disable power up
    
    /* asm_timed_delay is found in an assembly file */
    extern void asm_txrs (unsigned char);
    
    #define POWER_ON	PORTAbits.RA4
    
    //FUNZIONE
    void putsUARTema2( char *data)
    {
      do
      {    						
        asm_txrs(*data);		// Transmit a byte
      } while( *data++ );
    }
    
    //MAIN
    void main (void) //MAIN
    {	
     //MAIN_LOOP
         do
           {
            putsUARTema2( inputstr );// Transmit string
           } while (1); //MAIN LOOP
    }
    
    

    Chiedimi pure cosa non comprendi (considera sempre che questo è il mio modo di programmare in c embedded, non è assoluto, questa è la bellezza/forza del C :-)

    #70911

    OPGUIDO
    Membro

    Grazie a tutti, apprezzo tutti i consigli, mi aiutano a crescere.
    Per Emanuele, vedere un codice scritto per me è piu intuitivo, grazie. Ancora una domanda, le funzioni scritte fuori dal MAIN per funzionare devono essere sempre richiamate all’interno del MAIN?

    #70912

    Emanuele
    Keymaster

    Qualsiasi funzione per ‘funzionare’ deve essere richiamata.
    Semplificando, solo il Main parte di default ed infatti deve essere void.

Stai vedendo 6 articoli - dal 1 a 6 (di 6 totali)

Devi aver eseguito l’accesso per poter rispondere a questa discussione.