16f628 programmeren tijd actief

Ik ben bezig met een printje.

Welke geluid maakt als s1 en of s2 actief is.

alles werkt naar behoren, echter nu wil ik dus een tijd instellen
dat en geluid 1 en geluid 2 , in combi of niet 1 keer hoorbaar is
en vervolgens bijv. 30 min wacht en dan weer 1 keer hoorbaar is. indien s1 en of s2 nog actief is.

ik heb van alles geprobeerd in PICBASIC maar ik krijg het niet werkend.

mijn bedoeling is wel dan als halverwege s1 of s2 er bij komt dat hij dit wel ziet en actie onderneemt.

je ziet 2 ifs staan de eerst klopt in de tijd, echter als ik ga vergroten word de tijd niet langer. ik weet dat dit een slordige manier van programmeren is, maar tja.

Schema van de print niet toegevoegd, want alles reageert zoals verwacht, het hangt nu aan de software.

tips zijn welkom.

code:


'2
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26-6-2008                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
xtal = 20; 1000 miliseconde = 1 seconde

ALL_DIGITAL TRUE              ;Alle ingangen digitaal


;Poortnamen
SYMBOL S1           = PORTa.1 ; Stroboscoop
SYMBOL S2           = PORTa.0 ; Omvormer
SYMBOL LED          = PORTA.2 ; Led schakelaar STROBOSCOOP


dim A as word
dim B as word
dim WACHTTIJD as word  ' MOET NOG VERANDERD WORDEN DAT DIT MOGELIJK GEEN WORD MOET ZIJN.
dim DD as word

 
;Variabelen declareren
;WORD
DIM Hertz           AS WORD   ;'Hertz' is de variabele toonhoogte (frequentie in Hertz)


;        76543210
TRISB = %11110111             ;PORTB.3 is uitgang voor PWM geluid signaal

PORTB_PULLups ON              ;Activeer ingebouwde PORTB pull-up weerstanden (voor toets S1) 
CLEAR                         ;Wis alle RAM geheugen
HPWM 1, 0, 0                ;Reset de CCP/PWM module (Op 0% = constant laag)
a  =  0 
b  =  0
dd = 10
WACHTTIJD  =  0

Main:

' for x = 0 to 70000  ' 15000 = 1.15min

if s1 = 1 and a=0 then goto start1
if s2 = 1 and b=0 Then goto start2
' if s1 = 1 then toggle led1
if s1 = 0 then A=0
if s2 = 0 then b=0

delayms 1
WACHTTIJD = WACHTTIJD + 1

'if WACHTTIJD = 375000 then a=0:b=0:WACHTTIJD=0  ' 4.30 min
if WACHTTIJD = 11250000 then a=0:b=0:WACHTTIJD=0  ' 15 min


''next

' a=0
' b=0

goto main

Start1:

hertz=250

hpwM 1, 127, Hertz
delayms dd
HPWM 1, 0, 0
delayms dd
hpwM 1, 127, Hertz
delayms dd
HPWM 1, 0, 0
delayms dd

a=1

goto main

Start2:

hertz=500
hpwM 1, 127, Hertz
delayms dd
HPWM 1, 0, 0
delayms dd
hpwM 1, 127, Hertz
delayms dd
HPWM 1, 0, 0
delayms dd 

b=1

goto main

END

[Bericht gewijzigd door spacegremlin op donderdag 25 november 2021 00:31:53 (15%)

A en a zijn twee verschillende variabelen.

a wordt nooit meer 0

Domoticz en ESP8266, goede combo!!!

thxs, heel apart, maar het is wel degelijk de zelfde variable

bij mij in de editor zijn het ook gewoon hoofdletters.
zal het hier aanpassen.

Arco

Special Member

Dit kan nooit werken:

pic basic code:


if x = 11250000 then A=0:B=0:x=0  ' 15 min

want x is een word
Volgens mij is Picbasic niet case sensitive trouwens...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

moet zeker byte zijn?
ga ik mij daar even in verdiepen.

nou op zich simpel als hij niet veranderd in een hoofdletter, als je ze allemaal in hoofdletters doet, dan weet je dat het fout is. hihih

dan zal ik straks ook wel een beperking krijg in het optellen maar dat zie ik dan wel.

[Bericht gewijzigd door spacegremlin op donderdag 25 november 2021 00:15:14 (19%)

Arco

Special Member

Een word gaat maar tot 65535, een byte tot 255 (da's toch wel heel erg basiskennis wat je met programmeren moet weten)
Wat je nodig hebt is een DWord/Unsigned long of hoe dat in Picbasic ook mag heten. Die kan tot 4294967295

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
benleentje

Golden Member

Ik ben zelf iets meer thuis in C++ en doorgrond deze code niet helemaal.

Ik wil je aanmoedigen om meer duidelijke variabelen te gaan gebruiken ipv A,B,X en DD. Voor x zou ik dan gewoon frequentie nemen vol uitgeschreven. Want als je programma's langer worden zegt x niet zoveel maar frequentie zegt precies wat het is.

Maar ik zie nu dat je met x gewoon de tijd bedoelt dus noem het ook gewoon bv wachttijd.

Gebruik ook de code tags voor pic assembly. Die kan je vinden boven je tekstinvoerveld dat symbool met de 2 rode <> erin.

want x is een word

Scherp gezien. In c++ gebruiken ze geen word dus ik heb er overheen gekeken. Maar ik dacht dat een word16 bit is met een max van 65535.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

ik begrijp je statement maar, maar dit was gewoon even vluchtig gedaan.

want hoe moeilijk kan het nu zijn om dit werkend te krijgen hihi

die max wat jij zegt, dacht ik dus ook aan en daar zit denk ik ook oa het probleem.

(aangepast)

[Bericht gewijzigd door spacegremlin op donderdag 25 november 2021 00:33:57 (22%)

Arco

Special Member

Met X als word wordt die nooit 11250000: na 65535 krijg je een 'roll-over' naar 0x0000 als je er eentje bij optelt...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

@arco, ik was hier al bang voor, ik ga dit even bekijken hoe ik dit kan fixen, thxs.

Een word gaat maar tot 65535, een byte tot 255 (da's toch wel heel erg basiskennis wat je met programmeren moet weten)
Wat je nodig hebt is een DWord/Unsigned long of hoe dat in Picbasic ook mag heten. Die kan tot 4294967295

jip das als je er voor geleerd hebt, maar goed, met een beetje hulp moet het ook wel lukken toch , thxs.

Wat je hierboven vermeld is mij ook wel bekend, maar nu niet zo over nagedacht.

En weet zeker dat er een veel simpeler manier is om te doen wat ik wil, dan het geen wat ik bovenin heb gemaakt. thxs, ik ga even morgen verder testen.

[Bericht gewijzigd door spacegremlin op donderdag 25 november 2021 00:43:32 (22%)

benleentje

Golden Member

En weet zeker dat er een veel simpeler manier is om te doen wat ik wil, dan het geen wat ik bovenin heb gemaakt. thxs, ik ga even morgen verder testen.

Dat valt heel erg mee. Je programma is zo te zien simpel en doeltreffend. Niets weinig mis mee.

Fouten maken heeft ook wel zijn voordelen dan kan je ervan leren ;).

11250000 / 65535 = 171,66. Dus in theorie kan je met 2 counters van een word en een byte te combineren ook op 11250000 uitkomen. Maar een Dword gebruiken is wel een stuk eenvoudiger.

jip das als je er voor geleerd hebt, maar goed, met een beetje hulp moet het ook wel lukken toch , thxs.

IK heb er ook niet voor geleerd gewoon ook alles met zelfstudie. Maar wel een goed opleiding gehad waar wel ooit een en ander al is behandelt dat scheelt wel wat.

Maar ik denk dat elke programmeur wel ergens een blinde vlek heeft.

[Bericht gewijzigd door benleentje op donderdag 25 november 2021 01:39:48 (25%)

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
marcob

Golden Member

Je kunt ook twee of drie tellers gebruiken:
x = x + 1
if x > max_x then y = y + 1 : x = 0
if y > max_y then z = z + 1 : y = 0
if z > max-z then .....

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years

De andere 2 optie gegeven.
Ik heb inderdaad ook gedacht aan meerdere counters.

Omdat ik nog wat telling wil gaan toevoegen,
vind ik dword een mooie optie, en na testen werkt dit
voor wat ik wil.

iedereen bedankt voor het vlot meedenken.

(Maar ik denk dat elke programmeur wel ergens een blinde vlek heeft.)
Denk dat dat het ook even was

Arco

Special Member

In grotere programma's is het (als de situatie het toelaat) beter om andersom te tellen:

pic basic code:


If WACHTTIJD > 0 Then WACHTTIJD = WACHTTIJD -1
if WACHTTIJD = 0 Then a=0 : b=0 : WACHTTIJD = 11250000 

Dit omdat testen of een variabele nul is veel sneller gaat als variabele vergelijken met een ander getal...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Je moet wachttijd even resetten bij het afspelen van een toontje. Nu kan je na 14 minuten een toon krijgen en een minuut later weer één.

@acro bedankt, Neem het mee als info. voor later

@k7Jz, geen last van gehad maar misschien zie ik wat over het hoofd
.

Voor nu is dit het geworden alleen de led, en count 3 4 5 ben ik nog testen.

.

code:


'2
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2021 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 25-11-2021                                        *
'*  Version : 1.0                                               *
'*  Notes   : Msxflash                                          *
'*          :                                                   *
'****************************************************************
DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
xtal = 20; 1000 miliseconde = 1 seconde

ALL_DIGITAL TRUE              ;Alle ingangen digitaal

;Poortnamen
SYMBOL S1     = PORTa.1 ; Stroboscoop
SYMBOL S2     = PORTa.0 ; Omvormer
SYMBOL LED    = PORTA.2 ; Led schakelaar STROBOSCOOP


dim TELLER1   as  word
dim TELLER2   as  word
dim COUN      as  word
dim WACHTTIJD as dword 
dim delayH    as  word
DIM Hertz     AS  WORD 
DIM TellerLED AS  WORD 

;        76543210
TRISB = %11110111       ; PORTB.3 is uitgang voor PWM geluid signaal
                        
pORTB_PULLups ON        ; Activeer ingebouwde PORTB pull-up weerstanden (voor toets S1) 

start:

CLEAR                   ; Wis alle RAM geheugen
HPWM 1, 0, 0            ; Reset de CCP/PWM module (Op 0% = constant laag)

TELLER1   =  0 
TELLER2   =  0
DelayH    = 10
WACHTTIJD =  0
COUN      =  0
tellerled  = 0

Main:

if s1 = 1 then
 if teller1   =  0 then goto start1   ; Stroboscoop
 if tellerled = 25 then toggle led : tellerled = 0
tellerled = tellerled + 1
End if

if s2 = 1 and  teller2 = 0 Then goto start2   ; Omvormer
if s1 = 0 then TELLER1 = 0
if s2 = 0 then TELLER2 = 0

delayms 1
WACHTTIJD = WACHTTIJD + 1

if coun = 0 and WACHTTIJD =  12000 then TELLER1 = 0 : TELLER2 = 0 : coun = 1:WACHTTIJD = 0 '  1 min
if coun = 1 and WACHTTIJD =  50000 then TELLER1 = 0 : TELLER2 = 0 : coun = 2:WACHTTIJD = 0 '  4 min
if coun = 2 and WACHTTIJD = 120000 then TELLER1 = 0 : TELLER2 = 0 : coun = 3:WACHTTIJD = 0 ' 10 min

If coun = 3 Or coun = 4 Then

   if WACHTTIJD = 360000 then TELLER1 = 0 : TELLER2 = 0 : coun = coun + 1 : WACHTTIJD = 0 ' 30 min

End If


if coun = 5 then goto start

'if count = 3 or count = 4 and WACHTTIJD = 360000 then TELLER1 = 0 : TELLER2 = 0 : count = count + 1 : WACHTTIJD = 0 ' 30 min


goto main

Start1:

 hertz=250
 hpwM 1, 127, Hertz:delayms delayH:HPWM 1, 0, 0:delayms delayH:hpwM 1, 127, Hertz:delayms delayH:HPWM 1, 0, 0:delayms delayH
 TELLER1 = 1

goto main

Start2:

 hertz=500
 hpwM 1, 127, Hertz:delayms delayH:HPWM 1, 0, 0:delayms delayH:hpwM 1, 127, Hertz:delayms delayH:HPWM 1, 0, 0:delayms delayH
 TELLER2 = 1

goto main

END

Om ook het idee te geven waar dit voor is.

Ik heb een stroboscoop en omvormer op in de auto.

Hiermee laat hij mij horen dat de stroboscoop en of omvormer nog aan staat.

Is 1 min, dan 4min, dan 10min en dan om de 30min.

Waarom stel je heb je omvormer aan terwijl het voertuig stil staat en je hebt het niet door.

en als de stroboscoop per ongeluk aan staat tijden rijden. etc.

dat is de doelstelling van deze print.

Je hebt ook Xtal=20 staan en de interne oscillator is maar 4Mhz.
Ik weet niet of de compiler dat zelf goed zet.

LDmicro user.

bedankt voor je meedenken.

Ik heb een 20 kristal geplaatst.
en niet gekozen voor de interne.

Op 25 november 2021 23:43:29 schreef spacegremlin:
en niet gekozen voor de interne.

Je config lijn zegt van wel.

pic basic code:

[b]CONFIG INTRC_OSC[/b]_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
xtal = 20; 1000 miliseconde = 1 seconde

[Bericht gewijzigd door MGP op donderdag 25 november 2021 23:47:10 (31%)

LDmicro user.

ja dat heb ik dus ook net door hahaha, thxs.
maar dan laat ik het lekker zo anders moet ik mijn tijden weer veranderen
nu snap ik ook waarom mijn tijden niet klopte met mijn verwachting, hihi

als ik mij niet vergis doordat hij op de interne staat, doet die xtal niks. dus dat scheelt. maar goed ik heb mijn timing nu goed, dus ik ga er niks aan veranderen.

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

Ander kort vraagje.

de input trigger op de 16f628 is 5 volt.(s1,s2)
om te triggeren doe je dat met 5 volt en met de veiligheid een weerstand er tussen.

nu komt deze in de auto en word de trigger 12volt, en bij draaiende motor zeg maar 14,40.

kan ik dit ook veilig met een weerstand begrenzen.

Ik dacht zelf om bijv. een 78l05 te gebruiken echter lijkt mij dat overkill.

of moet ik het totaal anders aanpakken.

Gebruik een optocoupler waar er 2 inzitten zoals een TLP521-2.
Een weerstandsdeling met een zener op de input kan ook.
Een 12V relais kan ook, zoals je ziet mogelijkheden genoeg en een beetje afhankelijk van uw kennis/vaardigheden.

[Bericht gewijzigd door MGP op vrijdag 26 november 2021 08:54:38 (12%)

LDmicro user.

Ga ik voor een optocoupler.
Denk het veiligst

Heb enkele en dubbele liggen.

Relais wil ik niet doen.

Zouden jullie even voor mij willen kijken of ik het zo met de optocouplers goed.

Het liefst schakel ik plus aan de andere kant van de optocoupler maar de enige 2 die ik heb liggen zijn. 4n35 en cyn17-4

zie bijlage voor betere weergave.

https://www.msxflash.nl/electronica/stov.jpg

Bedankt.

benleentje

Golden Member

Het is nu niet echt een begrijpelijk schema. Leuk dat IC2 een 4n35 is maar wat welke pen van het IC doet is zo niet te zien of begrijpen. Dus ipv de behuizing teken je de schematische voorstelling van wat er in het ic zit en dat is voor een opto een Led en een fototransitor.

https://img.brainkart.com/imagebk7/ZZbaeJT.jpg

Voor IC1 is het nog ok dat je alleen de behuizing teken maar het vaak handiger om gewoon een rechthoek te tekenen en dan bv links de ingangen en rechts de uitgangen. Van dit IC is geen schematische voorstelling te maken dus dat mag zo.

Het is ook leesbaarder om vlakbij de bv de weerstanden ook gelijk de waarde te zetten. Nu moet je elke zoeken naar de waarde.

Bij de leds in de schakelaar ontbreekt een weerstand
T2 is een raar ding maar het is zo geen transitor.

Voor de leesbaarheid is het ook handiger om meer in volgorde te tekenen. Dus eerst S1 dan de opto en dan naar IC1.

Veel mensen hier gebruiken splan 7.0 om schema's te tekenen in onderstaande link staat onder gebruiker Blackdog een download voor de meest gebruikte symbolen voor Splan. De link zelg gaat of versie 8.0 maar die schijnt niet echt lekker te werken ik blijf voorlopig bij versie 7

https://www.circuitsonline.net/forum/view/155436#highlight=8.0+splan

www.bramcam.nl/Diversen/1STAID.LIB

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.