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! **********