Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC12F683, errori compilazione su end main

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] PIC12F683, errori compilazione su end main

Messaggioda Foto Utenteangelorosso » 23 set 2011, 18:19

Salve a tutti, sto realizzando un programmino per gestire l'apertura e chiusura degli specchietti della mia auto.
Sto impiegando un pic12f683, il software lo sto scrivendo in C.
La mia richiesta di aiuto vuole incentrarsi sulla modalità di termine del programma: in fase di compilazione l'HI-TECH C mi rilascia questi due errori

Codice: Seleziona tutto
Error   [195] C:\Users\Angelo\MiDe\listato.c; 64.0 expression syntax
Error   [300] C:\Users\Angelo\MiDe\listato.c; 64.0 unexpected end of file

********** Build failed! **********


Ecco il codice che ho scritto

Codice: Seleziona tutto
#include <htc.h>
#include <stdio.h>
#define TRISIO_0b00001011   //imposto le porte tutte uscite tranne gp0 e gp1 che sono ingressi

int INCH, GP0;          // segnale di ingresso chiusura su GP0
int INAP, GP1;          // segnale di ingresso apertura su GP1
int OUT1, GP5;         // segnale di uscita 1 su GP5
int OUT2, GP4;         // segnale di uscita 2 su GP4
int OUTPLUS, GP2;         // segnale di uscita temporizzato (antipozzanghera)
int contaimp=0;            // numero impulsi da telecomando, già azzerato

void controlloch(void);      // dichiaro la funzione che gestisce la chiusura
void controlloap(void);      // dichiaro la funzione che gestisce l'apertura
void main (void);
   
void main(void)
{

controlloch:
{
       if (INCH)
         {delayms(100); // ritardo per antirimbalzo }
            if (INCH) // se non si tratta di un rimbalzo
               {   contaimp++;  }
                   if (contaimp==2)      // se sono due impulsi allora possiamo attivare gli specchi
                     {    OUT1=1;
                        delayms(4000);   //dopo 4 secondi spegniamo l'alimentazione agli specchi e azzeriamo il contaimp
                        OUT1=0;
                        contaimp=0;
                              }         
                  goto controlloch;
                                 } //chiusura controlloch   

controlloap:
{
       if (INAP)
         {delayms(100); // ritardo per antirimbalzo }
            if  (INAP) // se non si tratta di un rimbalzo
            { contaimp++;  }
                   if (contaimp==2)      // se sono due impulsi allora possiamo attivare gli specchi
                     {    OUT1=1;
                        OUT2=1;
                        OUTPLUS=1;
                        delayms(4000);   //dopo 4 secondi spegniamo l'alimentazione agli specchi e azzeriamo il contaimp
                        OUT1=0;
                        OUT2=0;
                        contaimp=0;
                        delayms(6000);      // dopo altri 6 secondi spegniamo l'uscita ausiliaria per i led antipozzanghera
                        OUTPLUS=0;
                  
                           }
                  goto controlloap;
                                 }    //chiusura controlloap


}         //chiusura main


Premetto che ho già provato ad inserire "end", "end;" , ma nulla da fare. In cosa sbaglio?
Avatar utente
Foto Utenteangelorosso
40 3
New entry
New entry
 
Messaggi: 61
Iscritto il: 17 lug 2011, 22:36

0
voti

[2] Re: PIC12F683, errori compilazione su end main

Messaggioda Foto UtenteTardoFreak » 23 set 2011, 18:39

Hai troppe parentesi { aperte e poche chiuse.
Poi mi permetto di suggerirti di non usare i goto in C. Si usano solo in casi straordinari quando proprio non se ne può fare a meno.
Altro suggerimento: imposta l' editor in modo che ti inserisca degli spazi al posto delle tabulazioni.
Utima cosa, se usi questo tipo di formattazione (tabulazioni a due spazi e parentesi allineate):
Codice: Seleziona tutto
SPIA_SendByte(unsigned char dato)
{
  char i;

  i = 8;
  while(i)
  {
    if (dato & 0x80) GPIOB->BSRR = 0x8000; else GPIOB->BRR = 0x8000;
    // Alza il clock
    GPIOB->BSRR = 0x2000;
    dato <<= 1;
    i--;
    // Abbassa il clock
    GPIOB->BRR = 0x2000;
  }
}


Il programma ne guadagna in ordine, compattezza e leggibilità.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,4k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15764
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[3] Re: PIC12F683, errori compilazione su end main

Messaggioda Foto Utenteangelorosso » 23 set 2011, 20:34

Ti ringrazio per la risposta!

Per le parentesi ho verificato tante volte: ho 9 parentesi d'apertura e 9 di chiusura. Cosa dovrei usare al posto dei goto?

Cosa mi suggerisci per il problema segnalato dal compilatore sull'end del programma?
Avatar utente
Foto Utenteangelorosso
40 3
New entry
New entry
 
Messaggi: 61
Iscritto il: 17 lug 2011, 22:36

0
voti

[4] Re: PIC12F683, errori compilazione su end main

Messaggioda Foto UtentePaolino » 23 set 2011, 20:50

Se non hai grosse basi di programmazione il mio consiglio è quello di partire da un flow-chart (prova a disegnarlo con FIDOCADJ). Da lì, vedrai che si riesce a scrivere il codice senza i goto e mettendo le parentesi nel modo corretto ;-)

Butta giù il flow-chart e poi ne parliamo.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,2k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4203
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[5] Re: PIC12F683, errori compilazione su end main

Messaggioda Foto Utenteangelorosso » 23 set 2011, 21:34

Avatar utente
Foto Utenteangelorosso
40 3
New entry
New entry
 
Messaggi: 61
Iscritto il: 17 lug 2011, 22:36

0
voti

[6] Re: PIC12F683, errori compilazione su end main

Messaggioda Foto UtenteTardoFreak » 23 set 2011, 22:24

Come inizio può andare.
Guardando la flow-chart rifletti ora su questo aspetto: dopo che il micro ha attivato un' uscita o l' altra cosa fa? Muore? Si Autodistrugge?
Non pensi che manchi qualcosa?

Rivedi la flow-chart che poi ne riparliamo. :ok:
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,4k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15764
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[7] Re: PIC12F683, errori compilazione su end main

Messaggioda Foto Utenteangelorosso » 24 set 2011, 7:50

Ho visto che non posso modificare lo schema postato su, quindi lo rimetto qui modificato.
Avevo abbozzato la flow-chart in maniera concettuale, omettendo alcune parti che ovviamente sono indispensabili.
Ecco


Altra cosa che non ho detto prima:
- ho già provato a mettere return (0) e end main();
- mi andrebbe bene anche mandare il PIC in sleep o reset
Avatar utente
Foto Utenteangelorosso
40 3
New entry
New entry
 
Messaggi: 61
Iscritto il: 17 lug 2011, 22:36

1
voti

[8] Re: PIC12F683, errori compilazione su end main

Messaggioda Foto UtenteTardoFreak » 24 set 2011, 11:53

angelorosso ha scritto:...omettendo alcune parti che ovviamente sono indispensabili...

Evitiamo di omettere, la flow chart deve essere completa.
Il flow chart indica un loop infinito quindi la struttura del programma deve essere come questa

Codice: Seleziona tutto
// Includes

// defines

// Dichiarazione variabili globali

// Main program
int main(void)
{
  // Dichiarazione variabili locali
  char ingresso_attivo;

  // Inizializzazione variabili

  // Loop infinito principale
  while(1)
  {
    // Attende l' attivazione di un ingresso
    ingresso_attivo = 0;
    while(!ingresso_attivo)
    {
      // Legge ed elabora l' ingresso
    }
    // fa il resto
  }
  return(0);  //deve esserci anche se non serve a niente
}


E c'e' una cosa che non capisco: la logica degli ingressi. Che senso ha scrivere "attendi secondo impulso" ? Deve arrivare entro un certo tempo? Sulla flow chart non è indicato nessun timer. Non è completa.

Ripeto, non tralasciamo niente altrimenti ci riduciamo a ragionare sul niente.

Un' altra cosa: riporta la linea su cui ti da il primo errore, la linea non solo il numero. Vai in quella linea, copiala e postala.

Altre cose:
- nel sorgente che hai postato mancano le parti in cui attendi il rilascio del/dei pulsanti.
- Le label che usi per i goto(orrore) non devono essere dichiarate con i prototipi! Forse è per questo che ti da errore.
- Includere <stdio.h> non serve a niente. Contiene le varie prinf e scanf e compagnia cantante che tu non usi.

Domanda: quali linguaggi di programmazione hai usato fino ad ora?
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,4k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15764
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[9] Re: PIC12F683, errori compilazione su end main

Messaggioda Foto Utenteangelorosso » 24 set 2011, 13:37

Bene, cercherò di essere il più chiaro ed esaustivo possibile!
Ho conosciuto i linguaggio C alle superiori e lo usavo spesso negli esperimenti di laboratorio di informatica. Dopo tanti anni (più di 10) ho deciso di rispolverarlo per avvicinarmi al mondo dei PIC. Questo spiega anche perché non uso l'assembler, conoscendo qualcosa di C mi viene più intuitivo questo metodo (anche se aimè i datasheet spiegano le istruzioni in assembler!).
Il progetto che voglio realizzare sfrutta l'impulso di apertura e chiusura porte dell'auto per abilitare la chiusura o apertura specchietti retrovisori (già motorizzati); non voglio dilungarmi su come intercettare questo segnale perché ci sono già riuscito con un comparatore a finestra (thanks to IsidoroKZ in questo topic). L'apertura e chiusura deve avvenire al secondo impulso entro un determinato tempo (penso che 3 secondi bastino) in modo da evitare continui apri e chiudi degli specchi ad ogni apri e chiudi delle portiere.
Per l'apertura e chiusura ho chiamato gli impulsi INAP e INCH.
All'uscita del PIC per la chiusura specchi avrò bisogno di OUT1 a livello alto temporizzato per 4 secondi, mentre per l'apertura a livello alto mi servono OUT1 e OUT2 (quest'ultimo mi scambierà, tramite sistema a relè, la polarità d'alimentazione degli specchietti) temporizzati sempre a 4 secondi. Sempre in apertura ho previsto una terza uscita attiva OUTPLUS per alimentare dei led antipozzanghera temporizzati, da me deciso di 6 secondi oltre il movimento specchi (quindi 10 secondi in totale).

Visti i tuoi utili suggerimenti ho modificato la flow chart e il mio file *.c



Codice: Seleziona tutto
#include <htc.h>

#define TRISIO_0b00001011   //imposto le porte tutte uscite tranne gp0 e gp1 che sono ingressi

int INCH, GP0;          // segnale di ingresso chiusura su GP0
int INAP, GP1;          // segnale di ingresso apertura su GP1
int OUT1, GP5;         // segnale di uscita 1 su GP5
int OUT2, GP4;         // segnale di uscita 2 su GP4
int OUTPLUS, GP2;         // segnale di uscita temporizzato (antipozzanghera)
int contaimp=0;            // numero impulsi da telecomando, già azzerato

void main()
{

         controlloch:
            {
                if (INCH)
                  {delayms(100); }            // ritardo per antirimbalzo
                     if (INCH)                // se non si tratta di un rimbalzo
                        {   contaimp++;  }
                            if (contaimp==2)      // se sono due impulsi allora possiamo attivare gli specchi
                              {    OUT1=1;
                                 delayms(4000);   //dopo 4 secondi spegniamo l'alimentazione agli specchi e azzeriamo il contaimp
                                 OUT1=0;
                                 contaimp=0; }         
                           goto controlloch;
                                          } //chiusura controlloch   
         
         controlloap:
            {
                if (INAP)
                  {delayms(100);}             // ritardo per antirimbalzo
                     if  (INAP)             // se non si tratta di un rimbalzo
                     { contaimp++;  }
                            if (contaimp==2)      // se sono due impulsi allora possiamo attivare gli specchi
                              {    OUT1=1;
                                 OUT2=1;
                                 OUTPLUS=1;
                                 delayms(4000);   //dopo 4 secondi spegniamo l'alimentazione agli specchi e azzeriamo il contaimp
                                 OUT1=0;
                                 OUT2=0;
                                 contaimp=0;
                                 delayms(6000);      // dopo altri 6 secondi spegniamo l'uscita ausiliaria per i led antipozzanghera
                                 OUTPLUS=0;      }
                           goto controlloap;
                                          }    //chiusura controlloap

}


Come vedi ho sistemato qualcosina ma non ho inserito il loop infinito con while(1)...non saprei bene come fare!
Fra le criticità presenti persistono:

- Non ho ben capito come inserire la temporizzazione d'attesa del secondo impulso, temporizzazione al termine della quale senza un secondo impulso uguale dovrei tornare all'inizio del programma
- Penso che dichiarando in questo modo

Codice: Seleziona tutto
int INCH, GP0;          // segnale di ingresso chiusura su GP0
int INAP, GP1;          // segnale di ingresso apertura su GP1
int OUT1, GP5;         // segnale di uscita 1 su GP5
int OUT2, GP4;         // segnale di uscita 2 su GP4
int OUTPLUS, GP2;         // segnale di uscita temporizzato (antipozzanghera)


anzichè impostare i due ingressi e le tre uscite ai rispettivi piedini del PIC stia impostando 10 variabili di tipo int
- Compilando il tutto come mostrato su ho come errore

Executing: "C:\Program Files\HI-TECH Software\PICC\9.70\bin\picc.exe" --pass1 C:\Users\Angelo\MiDe\listato.c -q --chip=12F683 -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,-stackwarn,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 --debugger=pickit2 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Warning [361] C:\Users\Angelo\MiDe\listato.c; 26.2 function declared implicit int
Executing: "C:\Program Files\HI-TECH Software\PICC\9.70\bin\picc.exe" -oMide.cof -mMide.map --summary=default,-psect,-class,+mem,-hex --output=default,-inhx032 listato.p1 --chip=12F683 -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,-stackwarn,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 --debugger=pickit2 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
(1273) Omniscient Code Generation not available in Lite mode (warning)
HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) V9.70
Copyright (C) 2009 Microchip Technology Inc.
Error [499] ; 0. undefined symbol:
_delayms(Mide.obj)


********** Build failed! **********
Avatar utente
Foto Utenteangelorosso
40 3
New entry
New entry
 
Messaggi: 61
Iscritto il: 17 lug 2011, 22:36

0
voti

[10] Re: PIC12F683, errori compilazione su end main

Messaggioda Foto UtentePaolino » 24 set 2011, 13:56

Mi soffermerò a leggere con calma il tuo codice e i tuoi commenti, ma mi permetto di buttar giù una bozza di codice (da perfezionare) con la quale, come vedi, mancano i goto e altre "cose strane" tipiche di altri linguaggi:

Codice: Seleziona tutto
void main (void)
{
   InitPic(); // Setup del micro
   InitRam(); // Setup iniziale delle variabili;
   
   // A questo punto avvio un ciclo infinito
   while (1)
   {
      // Solo se sono presenti gli INPUT procedo, altrimenti non si fa nulla
      if (GetInput() == TRUE)
      {
         if (INCH == TRUE) // Se è giunto l'input di INCH procedo
         {
            while (INCH==TRUE); // Attendo il rilascio di INCH
            while (TimerINCH()!=0) // Se il timer di INCH non è ancora scaduto, attendo il secondo impulso
            {
               if (INCH == TRUE)
               {
                  OUT1 = 1;
                  OUT3 = 1;
                  delay_s (x); // valore che devi stabilire tu
                  OUT1 = 0;
                  delay_s (y-x)
                  OUT3 = 0;
               }
            }
         } else if (INAP == TRUE)
         {
         //...
         //...
         // Come prima, ma vale per INAP
         // ...
         // ...
         }
      }
   
   }
}


Mancano:
- routine di inizializzazione PIC;
- routine di inizializzazione variabili;
- routine di gestione ingressi (GetIpnut();)
- routine di gestione timer.

Secondo me, puoi provare a sfruttare questo codice come canovaccio per partire.

Ciao.

Paolo.

P.S. Sai usare gli interrupt?
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,2k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4203
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti