Salut Michel,
I have not read every line of your program, but it seems like you don't have
any hysteresis. Slowly changing values on a comparator without hysteresis
*will* lead to erratic behaviour while the voltage is near the threshold.
This is not easy to handle, especially if you're tying an interrupt to the
comparator output.
I would do it differently. I'd use the ADC, saying it is "light" when the
reading is above 60%, and "dark" when the reading is below 40% or so. If the
reading is between the numbers, I wouldn't do anything.
Then I would only really start anything if the reading stays on "light" or
"dark" for more than a minute or two, so that not every cloud would start the
motor.
Bonne chance!
Kiste
Am Mittwoch, 2. September 2020, 11:45:15 MESZ hat Michel MORICE
<[email protected]> Folgendes geschrieben:
Hi Rob,I come back to you because I have always some problems with my
project.Let me remind you this project:a LDR controls the light of the day. As
soon as the level is under a threshold, a motor closes a door up to an ILS is
detected.When level goes beyond this threshold, the motor opens the door until
an other ILS is detected.I use a PIC12F675 to control the system.The system,
sometimes, doesn't run correctly: stops before the ILS, starts and goes back,
or other quirks.Can you have a look to my program if you find a mistake.I also
send you the circuit scheme.
Kind regardsMichel
| | Garanti sans virus. www.avast.com |
Le dim. 2 août 2020 à 20:13, Rob CJ <[email protected]> a écrit :
Hi Michel,
Your solution is correct. You have to read the value of the comparator as soon
you get an interrupt so you capture the value in the interrupt routine itself.
In your second program you could remove the _usec_delay in the forever loop
since it will only delay the opening or closing (unless you want that of
course).
Note that your input signal on the comparator must have a minimal length as for
the PIC to be able to read the correct level. If for example the pulse would be
very short, you could get the interrupt but the signal could already be changed
before you read the pin. Of course I am talking here about a signal in the
microsecond range. Since in your first program you missed this signal, I
suspect it to be short.
Kind regards,
Rob
Van: [email protected] <[email protected]> namens Michel MORICE
<[email protected]>
Verzonden: zondag 2 augustus 2020 19:20
Aan: [email protected] <[email protected]>
Onderwerp: Re: [jallib] PIC12F675 INTERRUPT WITH COMPARATOR OUTPUT CHANGING
doesn't work Hi Rob,
As I continued my project, I discovered a new problem for me.Here after the
initial
draft:--************************************************************************
--****** Programme POULE3 -Ouverture crépusculaire du poulailler ********
--***************************************Michel MORICE 16 juillet 2020****
include 12f675
pragma target clock 4_000_000
pragma target OSC INTOSC_NOCLKOUT -- horloge interne à 4 MHz
pragma target MCLR internal -- make MCLR pin available I/O
--conditionnement du PIC
ANSEL = 0b_0000_0011 --ports 0 et 1 en analogique, entrées du comparateur
TRISIO = 0b_0000_1011 --ports 0, 1, 3 en input, 2, 4 et 5 en output
CMCON = 0b_0000_0001 --comparateur + en 0, - en 1, sortie en 2
PIE1_CMIE = ON --Comparator changing Interrupt ON
INTCON_PEIE = ON --Peripheral Interrupt On
INTCON_GIE = ON --Global Interrupt On
--paramétrage des portes
alias COMPS is pin_A2 --sortie du comparateur
alias ILS is pin_A3 --ILS contrôlant la fermeture de porte
alias OUVRE is pin_A4 --commande l'ouverture
alias FERME is pin_A5 --commande la fermeture
--paramétrage général
--ON OFF TRUE FALSE définis par include 12f675 et constants_jallib
const dword seconde = 1_000_000
const bit OUVERTE = ON
const bit FERMEE = OFF
var bit changeLum = FALSE
OUVRE = OFF
FERME = OFF
--****************************************************************
procedure changeLuminosite() is pragma INTERRUPT
if PIR1_CMIF == ON then --changement de luminosité détecté
PIR1_CMIF = OFF --reset du flag de détection
INTCON_GIE = OFF --Stop global interrupt
changeLum = TRUE --flag de détection de changement activé
end if
end procedure--***************************************************************
procedure ouverturePorte() is
OUVRE = ON --on ouvre la porte - moteur ON+
_usec_delay(seconde * 3) --pendant 3 secondes
OUVRE = OFF --arrêt du moteur
end procedure
--***************************************************************
procedure fermeturePorte() is
FERME = ON --on ferme la porte - moteur ON-
while ILS == OUVERTE loop --tant que la porte n'est pas fermée
end loop
FERME = OFF --arrêt moteur
end procedure
--****************************************************************
--***********programme principal******************************
forever loop
while !changeLum loop
end loop
if COMPS == ON then --passe au jour
ouverturePorte()
else --passe à la nuit
fermeturePorte()
end if
changeLum = FALSE
INTCON_GIE = ON
end loop
--*********************************************************************
That doesn'nt work and I found this solution (in blue):
--************************************************************************
--****** Programme POULE5 -Ouverture crépusculaire du poulailler ********
--***************************************Michel MORICE 2 août 2020****
include 12f675
pragma target clock 4_000_000
pragma target OSC INTOSC_NOCLKOUT -- horloge interne à 4 MHz
pragma target MCLR internal -- make MCLR pin A3 available as I/O
pragma target WDT disabled
--conditionnement du PIC
ANSEL = 0b_0000_0011 --ports 0 et 1 en analogique, entrées du comparateur
TRISIO = 0b_0000_1011 --ports 0, 1, 3 en input, 2, 4 et 5 en output
CMCON = 0b_0000_0001 --comparateur + en 0, - en 1, sortie en 2
PIE1 = 0b_0000_1000 --comparateur enable bit
INTCON = 0b_1100_0000 --global interrupt et peripheral interrupt
--paramétrage des portes
alias ILS is pin_A3 --ILS contrôlant la fermeture de porte
alias OUVRE is pin_A4 --commande l'ouverture
alias FERME is pin_A5 --commande la fermeture
--paramétrage général
--ON OFF TRUE FALSE définis par include 12f675 et constants_jallib
const dword seconde = 1_000_000
const bit OUVERTE = TRUE
const bit FERMEE = FALSE
var bit lumChange = FALSE --flag de changement de luminosité
var bit etatCout --etat de la sortie du comparateur
OUVRE = OFF
FERME = OFF
--****************************************************************
procedure changeLuminosite() is pragma INTERRUPT
if PIR1_CMIF then --changement de luminosité détecté
PIR1_CMIF = OFF --reset du flag détecté
INTCON_GIE = OFF --stop interrupts
etatCout = CMCON_COUT --mise en mémoire de la sortie
lumChange = TRUE --flag de changement de luminosité
end if
end procedure
--***************************************************************
procedure ouverturePorte() is
OUVRE = ON --on ouvre la porte - moteur ON+
_usec_delay(seconde * 3) --pendant 3 secondes
OUVRE = OFF --arrêt du moteur
end procedure
--***************************************************************
procedure fermeturePorte() is
FERME = ON --on ferme la porte - moteur ON-
while ILS == OUVERTE loop --tant que la porte n'est pas fermée
end loop
FERME = OFF --arrêt moteur
end procedure
--********************************************************************
--*************programme principal********************************
forever loop
while !lumChange loop --tant qu'il n'y a pas de changement
end loop --on boucle
_usec_delay(seconde)
if etatCout == HIGH then --si c'est de nuit à jour
ouverturePorte()
else --si c'est de jour à nuit
fermeturePorte()
end if
lumChange = FALSE --reset du flag de changement
INTCON_GIE = ON --remise en attente des interrupts
asm sleep --mise en sommeil
end loop
--*************************************************************************
I don't no exactly the reason, perhaps a timing problem again.Now tutto va
bene , grazie milleThank you again. Merci beaucoup
Michel
| | Garanti sans virus. www.avast.com |
Le sam. 1 août 2020 à 14:00, Michel MORICE <[email protected]> a écrit :
Hi Rob,
Sorry for not answering sooner, I was enjoying the sun for a few days.
Thank you for this solution, it's perfect. The problem was actually there and
is fixed now.I'ill finally be able to continue my project.
Best regards
Michel
| | Garanti sans virus. www.avast.com |
Le mar. 28 juil. 2020 à 19:52, Rob CJ <[email protected]> a écrit :
Hi Michel,
Sorry for the spam but I saw that you did not enable the external interrupt in
INTCON0. I was confused because you mentioned "An interrupt on A2 changing
should start the process but that doesn't work."
But the statement about hanging in the interrupt routine still stands.
You have to change the code in your interrupt routine into the following:
procedure changeLuminosite() is pragma INTERRUPT if PIR1_CMIF then
--changement de luminosité détecté PIR1_CMIF = FALSE changeLum = TRUE
end ifend procedure
Otherwise the PIC will re-enter the interrupt routine as soon as it has left it.
Kind regards,
Rob
Van:[email protected] <[email protected]> namens Rob CJ
<[email protected]>
Verzonden: dinsdag 28 juli 2020 19:10
Aan: [email protected] <[email protected]>
Onderwerp: Re: [jallib] PIC12F675 INTERRUPT WITH COMPARATOR OUTPUT CHANGING
doesn't work Hi Michel,
Sorry missed that one. Then your problem may be the following.
I do not see that you service the external interrupt. This will result in the
PIC being continuous in the interrupt routine since the INTF flag remains set.
It then appears as if the PIC hangs (believe me I have also run into this
issue).
So you have to least service the external interrupt otherwise it will not work.
Kind regards,
Rob
Van:[email protected] <[email protected]> namens Michel MORICE
<[email protected]>
Verzonden: dinsdag 28 juli 2020 17:57
Aan: [email protected] <[email protected]>
Onderwerp: Re: [jallib] PIC12F675 INTERRUPT WITH COMPARATOR OUTPUT CHANGING
doesn't work Hi Rob,Thank you for trying to help me.Yes it's necessary to
enabling INTCON_PEIE. It is what I did with INTCON = 0b_1100_0000.The mystery
is elsewhere
| | Garanti sans virus. www.avast.com |
Le lun. 27 juil. 2020 à 21:42, Rob CJ <[email protected]> a écrit :
Hi Michel,
Maybe I was too quick. You mentioned that you have connected something to A2 so
I assume you use the external interrupt.
Next to that you are using a comparator which is a peripheral device.
This means that you also have to enable interrupts from peripheral devices by
enabling those interrupts with: INTCON_PEIE = TRUE
Kind regards,
Rob
Van: Rob CJ <[email protected]>
Verzonden: maandag 27 juli 2020 21:38
Aan: [email protected] <[email protected]>
Onderwerp: Re: [jallib] PIC12F675 INTERRUPT WITH COMPARATOR OUTPUT CHANGING
doesn't work Hello Michel,
If you want to use the external interrupt you have to enable it by: INTCON_INTE
= TRUE
Initially it is disabled by default.
Kind regard,
Rob
Van:[email protected] <[email protected]> namens Michel MORICE
<[email protected]>
Verzonden: maandag 27 juli 2020 12:06
Aan: jallib <[email protected]>
Onderwerp: [jallib] PIC12F675 INTERRUPT WITH COMPARATOR OUTPUT CHANGING doesn't
work HiOn a PIC12F675 I use A0 and A1 as analogic input to control the light of
the day to open/close a door A2 as logic output with a led to control the right
operating.An interrupt on A2 changing should start the process but that doesn't
work.Hereafter a little program to try the function.Thanks for helping me.
--************************************************************************--******
Programme POULE2 -Ouverture crépusculaire du poulailler
********--***************************************Michel MORICE 16 juillet
2020****include 12f675pragma target clock 4_000_000pragma target OSC
INTOSC_NOCLKOUT -- horloge interne à 4 MHzpragma target MCLR internal
-- make MCLR pin A3 available as I/Opragma target WDT disabled--conditionnement
du PICANSEL = 0b_0000_0011 --ports 0 et 1 en analogique, entrées du
comparateurTRISIO = 0b_0000_1011 --ports 0, 1, 3 en input, 2, 4 et 5 en
outputCMCON = 0b_0000_0001 --comparateur + en 0, - en 1, sortie en 2PIE1 =
0b_0000_1000 --comparateur enable bitINTCON = 0b_1100_0000 --global interrupt
et peripheral interrupt--paramétrage des portesalias COMPS is pin_A2 --sortie
du comparateuralias ILS is pin_A3 --ILS contrôlant la fermeture de
portealias OUVRE is pin_A4 --commande l'ouverturealias FERME is pin_A5
--commande la fermeture--paramétrage général--ON OFF TRUE FALSE définis par
include 12f675 et constants_jallibconst dword seconde = 1_000_000const bit
OUVERTE = ONconst bit FERMEE = OFFvar bit changeLum =
FALSE--***************************************************************--****************************************************************procedure
changeLuminosite() is pragma INTERRUPT if PIR1_CMIF then --changement de
luminosité détecté changeLum = TRUE end ifend
procedure--****************************************************************--programme
principalforever loop if changeLum then PIR1_CMIF = OFF INTCON_GIE =
OFF OUVRE = ON _usec_delay(seconde * 3) OUVRE = OFF end if
INTCON_GIE = ON changeLum = FALSEend loop
--
You received this message because you are subscribed to the Google Groups
"jallib" group.
To unsubscribe from this group and stop receiving emails from it, send an email
[email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jallib/cdf66d12-1e34-4563-9d26-345617726af0o%40googlegroups.com.
--
You received this message because you are subscribed to the Google Groups
"jallib" group.
To unsubscribe from this group and stop receiving emails from it, send an email
[email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jallib/AM0PR07MB6241E981A94CAD71E293ABCFE6720%40AM0PR07MB6241.eurprd07.prod.outlook.com.
| | Garanti sans virus. www.avast.com |
--
You received this message because you are subscribed to the Google Groups
"jallib" group.
To unsubscribe from this group and stop receiving emails from it, send an email
[email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jallib/CAD9DK3KRQ%3DwE4NuYqB_h4qWFUCbDjGOej9s3qGHd3EJ7my_-sQ%40mail.gmail.com.
--
You received this message because you are subscribed to the Google Groups
"jallib" group.
To unsubscribe from this group and stop receiving emails from it, send an email
[email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jallib/AM0PR07MB624194A0ECB1FA0C696F7E9BE6730%40AM0PR07MB6241.eurprd07.prod.outlook.com.
--
You received this message because you are subscribed to the Google Groups
"jallib" group.
To unsubscribe from this group and stop receiving emails from it, send an email
[email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jallib/AM0PR07MB62411E45F1DBD56F30C83C29E6730%40AM0PR07MB6241.eurprd07.prod.outlook.com.
--
You received this message because you are subscribed to the Google Groups
"jallib" group.
To unsubscribe from this group and stop receiving emails from it, send an email
[email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jallib/CAD9DK3Ka-wBWpMkcROqskhdvxfvbB1t%3DjnKzi3pUv0eSQyMnww%40mail.gmail.com.
--
You received this message because you are subscribed to the Google Groups
"jallib" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jallib/AM0PR07MB6241F411040DC09F0EA6CED4E64C0%40AM0PR07MB6241.eurprd07.prod.outlook.com.
--
You received this message because you are subscribed to the Google Groups
"jallib" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jallib/CAD9DK3K6vR840xf8R_BM3NZWTewiM%3DvnXuTxHquT2UhRBnhxDQ%40mail.gmail.com.
--
You received this message because you are subscribed to the Google Groups
"jallib" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jallib/1442563370.2013901.1599044874776%40mail.yahoo.com.