Nee, hoeft niet. Maar als je 1 bitje wilt doen is het wel handig.
TRISx is ook gewoon een register,die stel je toch ook in met trisa=255. Dus waarom zou dat niet voor een ander register kunnen?
sjors007
...
hallo,
ik heb weer even lopen stoeien met dit project. helaas werkt de klok nog niet en krijg ik dit op me beeld te zien 55:12:04
hier heb ik de code
DEVICE 16F628A ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;alle ingangen digitaal
LCD_ENPIN = PORTA.6 ;De EN aansluiting moet nu aan PORTA.6
LCD_RSPIN = PORTA.7 ;De RS aansluiting moet nu aan PORTA.7
dim Uren as byte
dim Minuten as byte
dim Seconden as byte
dim Hulp as byte
SYMBOL GIE = INTCON.7
SYMBOL PEIE = INTCON.6
Symbol T0IF = INTCON.2
SYMBOL TMR2IF = PIR1.1
symbol TMR2ie = pie1.1
symbol T2CKPS1 = t2con.1
symbol TMR2ON = t2con.2
symbol TOUTPS0 = t2con.3
symbol TOUTPS1 = t2con.4
symbol TOUTPS2 = t2con.5
symbol TOUTPS3 = t2con.6
On_interrupt GoTo Tijd
toutps0 =1
toutps1 =0
toutps2 =0
toutps3 =1
T2CKPS1 =1
TMR2IF = 0
PR2 = 250
TMR2IE = 1
PEIE = 1
GIE = 1
tmr2on = 1
goto klok
TIJD:
inc hulp
if hulp = 250 then inc seconden
if seconden = 60 then
minuten = minuten + 1
seconden = 0
endif
if minuten = 60 then
uren = uren + 1
minuten = 0
endif
if uren = 24 then
seconden = 0
minuten = 0
uren = 0
endif
Context Restore
;***************************************
KLOK:
while 1 = 1
print at 1,1, dec2 uren,":",dec2 minuten,":",dec2 seconden
wend
endik denk dat de fout bij de On_Interrupt zit, kan het misschien zijn dat je ze in de verkeerde volgorde heb..??
MVG Sjors
blijft die ook op 55:12:04 staan?
Volgens ij moet je eerst eens kijken naar hulp, die wordt nergens gecleared. Dit zal het probleem niet zijn, want bij de 256 loopt die toch over. Ik neem aan dat dit niet de bedoeling is?
Verder zie ik nergens staan waar de flag gecleared wordt. Ik weet niet hoe het bij deze timer zit, maar normaler wijze moet je hem na de interrupt weer nul maken.
succes ermee,
benleentje
Golden Member
Je kan met t2con ook dit doen
t2con = %01001011 // postscaler = 10 pre = 16
Dit ipv alles los te doen alleen de tmr2on is interessant.
Je krijgt nu een interrupt na 4.000.0000 / 4 / 16 /250 / 10 tikken. Dit is dan 1/25ste seconde. Is 25 interrups per seconde en niet 250. Verder is je interrupt routine TIJD: helemaal fout.
In een ISR (interupt sub routine) doe je het volgende:
- Gie = 0 eerst alle interrups uitzetten zodat andere interrups deze niet kunnen storen.
- Testen welke interrupt het is. in jouw geval niet nodig.
- Instructies utvoeren , maar zo min mogelijk enkel echt noodzakelijke. Onnodige berekeningen zoals je doet is uit den boze. Want er kan terwijl jij die berekeningen doet al weer een interrupt komen.
- Interruptflag clearen
- gie = 1
- content restore
In jouw geval hoef je enkel bij te houden hoe vaak de interrupt al is voor gekomen. Immers elke 25 interrups is dan 1 seconde. Dus in je isr doe je enkel de instructie
inc hulp.Het controleren of hulp al 25 is dus je NIET in de isr maar kan in je hoofd programma net zoals de controlle van sec, min en uren. Alles buiten de isr.
Ik denk dat je veel te weinig leest of niet begrijpt wat je leest.
sjors007
...
@Benleentje
oke maar ik dacht dat het zo ook kon werken omdat bij TMR0 het wel werkte.
dus nu word het:
ISR
1= Gie = 0
2= -
3= inc hulp
4= TOIF = 0
5= Gie = 1
6= Content Restore
en dan in me hoofdprogramma
if hulp = 25 then
enzovoort.
benleentje
Golden Member
Dat is veel beter. Als controller zou je bv elke keer hulp als je lcd kunnen tonen.
Ik zie een 2de probleem. Je print nu achter elkaar naar het scherm. Terwijl er maar 1 keer per seconde wat gebeurt. Kost dus onnodige processor tijd voor dit programmatje mischien geen probleem maar je kan ook pas als er een seconde voorbij is naar het scherm printen.
sjors007
...
@ Benleentje
maar het nadeel van if hulp = 25 then in me hoofdprogramma is ik gebruik paar keer while...wend in me prgramma en als ik dan tussen een while...wend zet if hulp = 25 then, en ik ben bijvoorbeeld bezig in een andere while...wend dan doet die het toch niet. dus daarom dacht ik, ik zet die if hulp = 25 then bij ISR en dan kan ik gewoon ergens in me programma zetten
Print at 1,1, Dec2 uren,":",Dec2 minuten,":",Dec2 secondenMVG Sjors
benleentje
Golden Member
Nee dan nog niet.
Het belangrijkste van de isr is dat hulp optijd met 1 verhoogd wordt de rest kan je allemaal in je hoofdprogramma oplossen.
Als je in een andere while wend lus zit dan wordt idd de if hulp = niet uitgevoerd. Maar dat geeft niet daar moet je gewoon rekening mee houden in je hoofd programma.
Stel dat hulp ineens 27 is geworden dan kan je in je tijd bereken lus hetvolgende doen
If hulp =>25 then hulp = hulp - 25; zie hier geen tijd verloren hulp staat nu op 27 - 25 =2
sec = sec + 1
if sec = 60 then sec = 0 : min = min + 1
if min = 60 then min = 0 ; uur = uur + 1
enz.sjors007
...
@Benleentje
zo verlies je dus geen tijd?? je kan bijvoorbeeld een 10e van een seconden over stappen naar een andere lus, telt ie dan wel gewoon door??
dan word dit dus nu me programma
DEVICE 16F628A ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;alle ingangen digitaal
LCD_ENPIN = PORTA.6 ;De EN aansluiting moet nu aan PORTA.6
LCD_RSPIN = PORTA.7 ;De RS aansluiting moet nu aan PORTA.7
dim Uren as byte
dim Minuten as byte
dim Seconden as byte
dim Hulp as byte
SYMBOL GIE = INTCON.7
SYMBOL PEIE = INTCON.6
Symbol T0IF = INTCON.2
SYMBOL TMR2IF = PIR1.1
symbol TMR2ie = pie1.1
symbol T2CKPS1 = t2con.1
symbol TMR2ON = t2con.2
symbol TOUTPS0 = t2con.3
symbol TOUTPS1 = t2con.4
symbol TOUTPS2 = t2con.5
symbol TOUTPS3 = t2con.6
On_interrupt GoTo Tijd
toutps0 =1
toutps1 =0
toutps2 =0
toutps3 =1
T2CKPS1 =1
TMR2IF = 0
PR2 = 250
TMR2IE = 1
PEIE = 1
GIE = 1
tmr2on = 1
goto klok
Tijd:
Gie = 0
inc hulp
TOIF = 0
Gie = 1
Content Restore
;***********Hoofdprogramma***********
Klok:
while 1 = 1
if hulp = 25 then inc seconden
if seconden = 60 then
minuten = minuten + 1
seconden = 0
endif
if minuten = 60 then
uren = uren + 1
minuten = 0
endif
if uren = 24 then
seconden = 0
minuten = 0
uren = 0
endif
ik S1 = aan then goto test
wend
bijvoorbeeld 2e while...wend
TEST:
while 1 = 1
If hulp =>25 then hulp = hulp - 25; zie hier geen tijd verloren hulp staat nu op 27 - 25 =2
sec = sec + 1
if sec = 60 then seconden = 0 : minuten = minuten + 1
if min = 60 then minuten = 0 ; uren = uren + 1
if uren = 24 then uren = 0 ; minuten = 0 ; seconden = 0
enzo...
wend
zou je dit ook voor meerdere while...wend situaties gebruiken (Me On_interrupt is wel goed ingesteld. ik kan die t2con nog even veranderen t2con = %01001011)
MVG Sjors
benleentje
Golden Member
Je kan maar 1 keer while 1 = 1; when gebruiken. Dit omdat het een oneindige lus. Als bv while a > 1 doet kan het wel zodra a dan 1 wordt is de lus klaar.
ik S1 = aan then goto test
Aha ik zie wat je bedoelt. In dat geval is test ook een suproutine en die moet dan weer terug springen naar het hoofdprogramma. Alleen je hoofdprogramma is een oneindige lus de rest niet.
if hulp = 25 then inc seconden
Moet zijn hulp =>
Want als je hem een keer gemist hebt omdat je bv in isr zat kan hulp 26 zijn en dan is het dus foute boel. Daarom hukp ook niet op 0 zetten maar hulp = hulp -25
sjors007
...
@ Benleentje
ik zal even uitleggen hoe precies mijn programma loopt.
ik heb 3 onderdelen
- Handbediening
- Automatisch
- Instellingen
hij moet de tijd op het scherm brengen wanneer ie in onderdeel automatisch staat. wanneer hij op handbediening staat moet de tijd gewoon doorlopen maar niet op het LCD scherm worden weergegeven. nou had ik bij TMR0 gewoon inc hulp, en if hulp = 25 then inc seconden enzo. bij me ISR zodat ik gewoon kon zetten bij onderdeel automatisch Print at 1,1, ....
volgens u is het beter om dat niet te doen vanwege als hij nog aan het berekenen is dat hij een interrupt mist.
ik gebruik wel een 4 of 5 keer while...wend. dit regel allemaal via goto en zo. nou moet ik dus bij elke while...wend zetten
If hulp =>25 then hulp = hulp - 25; zie hier geen tijd verloren hulp staat nu op 27 - 25 =2
sec = sec + 1
if sec = 60 then seconden = 0 : minuten = minuten + 1
if min = 60 then minuten = 0 ; uren = uren + 1
if uren = 24 then uren = 0 ; minuten = 0 ; seconden = 0
of niet??
ieder geval bedankt voor de informatie, ut heeft even geduurd;)
MVG Sjors
benleentje
Golden Member
Nee nee neee:P
Eigenlijk moet je voordat je programma's gaat maken een flow diagram maken da is een schema met bolletje en pijltjes. Zou je eigenlijk zelf eens een keer in moeten duiken. Dan heb je eigenlijk je programma kwa structuur al klaar.
Ik zei al dat je een ISR, subroutine's en hoofdprogramma hebt.
ISR
Is voor tijd kritsche en dwingende dingen.
BV je bent een spannende film aan het kijken de bel gaat. Je opent de deur en laat de persoon binnen en gaat weer naar de film. Praten met deze persoon doe je enkel tijdens de reclame.
Zou je nu uitgebreid aan de deur gaan praten is de film voorbij. Zo ga je niet met mensen om maar dit is wel hoe je met een uc omgaat.
Hoofdprogramma.
Dit is enkel programma code die nodig is om het verloop van het programma te laten gaan zoals bepaald in het flow diagram.
Het maken van beslissingen met if then enz.
inlezen van schakelaars.
Subroutine's
Al het overige.
Maken van berekeningen enz.
Display aansturen
overige dingen aansturen.
Nu voor jouw programma.
Hoofdprogramma
on int goto ISR.
bepaal hand, auto, instelling.
Goto bepaal ....... return.
goto tijd berekenen ... return
goto subroutine tijd op display .... return.
Dit programma klopt van geen kanten maar geeft je mischien een idee. Eigenlijk draait het in het hoofdprogramma erom om uit te zoeken of een voorwaarde voldaan is en de bij behorende code mag worden uitgevoerd.
If s1 = 1 then
if auto = ja then
If hulp >= 25 then
enz
De voorwaarde is hier in de eerste regel dus S1. IS die voorwaarde er ja of nee. Dat is het enige waar het om draait in het hoofdprogramma.
Als je een flow diagram maakt dan zijn die voorwaarden ook belangrijk en goed overzichtelijk.
EDIT
In het nederlands is het stroomdiagram
http://nl.wikipedia.org/wiki/Stroomdiagram
http://www.computerwoorden.nl/direct--6798--Stroomdiagram.htm
http://users.telenet.be/dirk.van.aerschot/vlaamsbrabant/documenten/man…
Op 25 mei 2009 17:13:50 schreef benleentje:
[*] Gie = 0 eerst alle interrups uitzetten zodat andere interrups deze niet kunnen storen.
[*] Testen welke interrupt het is. in jouw geval niet nodig.
[*] Instructies utvoeren , maar zo min mogelijk enkel echt noodzakelijke. Onnodige berekeningen zoals je doet is uit den boze. Want er kan terwijl jij die berekeningen doet al weer een interrupt komen.
[*] Interruptflag clearen
[*] gie = 1
[/list]
De eerste en laatste stap zijn dus onzin. Als je in een interrupt komt is gie automatisch gecleared (er kunnen dus geen nieuwe ints binnenkomen). De retfie instructie zet de vlag weer.
sjors007
...
@Benleentje
de Stroom diagram snap ik wel hij bekijkt gewoon of een waarde false of true is en gaat zo weer verder, maar ik snap alleen niet hoe je erdan voor kan zorgen dat ie altijd door telt. ik gebruik eigenlijk wel al een stroom diagram. als S1 = aan then goto .... en als s2 = aan then goto anders enzo.
MVG Sjors
benleentje
Golden Member
@jowi. Ik weet ook niet alles maar zo heb ik het geleert.
Even je vraag duidelijker stellen. Wat kan er volgens je niet doortellen de hulp variabele of de tijd berekeningen.
Geef anders even in grote lijnen neer hoe je programma wilt maken dus even het idee van het complete programma.
sjors007
...
zal ik het hele programma posten?? het is flink groot hoor er valt nog flink in te korten maar daar ben ik nog mee bezig
MVG Sjors
benleentje
Golden Member
Nee ik bedoelde meer dat ik de structuur van je totale programma wil weten. Dan kan ik wel zien wat er goed en fout gaat.
sjors007
...
Hallo iedereen,
helaas werkt me klok nog steeds niet.
Als ik hem aanzet komt ie op een waarde bijv. 14:09:05 en ik zet hem weer uit en aan dan zet komt ie bijvoorbeeld op 10:03:38
het zal toch in de code ergens fout zitten
DEVICE 16F628A ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;alle ingangen digitaal
LCD_ENPIN = PORTA.6 ;De EN aansluiting moet nu aan PORTA.6
LCD_RSPIN = PORTA.7 ;De RS aansluiting moet nu aan PORTA.7
dim Uren as byte
dim Minuten as byte
dim Seconden as byte
dim Hulp as byte
SYMBOL GIE = INTCON.7
SYMBOL PEIE = INTCON.6
Symbol T0IF = INTCON.2
SYMBOL TMR2IF = PIR1.1
symbol TMR2ie = pie1.1
symbol T2CKPS1 = t2con.1
symbol TMR2ON = t2con.2
symbol TOUTPS0 = t2con.3
symbol TOUTPS1 = t2con.4
symbol TOUTPS2 = t2con.5
symbol TOUTPS3 = t2con.6
On_interrupt GoTo Tijd
t2con = %01001011
TMR2IF = 0
PR2 = 250
TMR2IE = 1
PEIE = 1
T0IF = 1
GIE = 1
tmr2on = 1
goto klok
Tijd:
inc hulp
if hulp >= 25 then inc seconden
if seconden = 60 then
minuten = minuten + 1
seconden = 0
endif
if minuten = 60 then
uren = uren + 1
minuten = 0
endif
if uren = 24 then
seconden = 0
minuten = 0
uren = 0
endif
T0IF = 0
Context Restore
;***********Hoofdprogramma***********
Klok:
while 1 = 1
print at 1,5, dec2 uren,":",dec2 minuten,":",dec2 seconden
wend
end
ik heb het ook al getest met dat if hulp = 25 then gewoon bij me hoofdprogramma gezet maar het resultaat is hetzelfde
weet iemand het probleem??
MVG Sjors
benleentje
Golden Member
Welke waarde hebben hulp, minuten, uren en seconde als het programma's begint.
Waarom wordt hulp niet gerest nadat deze >+ 25 is.
Waarom is de ISR nog steeds gevuld met onnodige berekeningen.
Als je op de eerste 2 vragen het antwoord weet zou je programma al moeten werken.
sjors007
...
@ Benleentje
het programma zoals ik hierbove heb gegeven dat is de code die ik even gebruik om te testen. maar het is verschillend met welke waarde ze starten als ik um aan zet staat er bijv:
10:47:23
dan zet ik um uit en weer aan en dan krijg ik
55:56:12
ik weet niet wat er fout staat in me code? anders moet je zelf even de code in je pic proggen dan ken je het zien!
waarschijnlijk staan de post- en prescaler op één of andere manier niet goed denk ik
MVG Sjors
Als je de tijd op wilt slaan dan moet je die naar de eprom schrijven bij het uitzetten, en weer uitlezen bij het aanzetten.
sjors007
...
het probleem is hij doet het niet!
hij blijft staan op een getal, dus bijv. 10:47:23
en als je hem uit zet en weer aan zet dan komt er een nieuw getal en blijft ie daar op staan:(
MVG Sjors
benleentje
Golden Member
@bas. Dat is nu even voor later voor sjors.
Je heb nog geen antwoorden gegeven om mijn eerste 2 vragen.
Je maakt de variabele wel aan maar je vergeet er al gelijk in het begin het allerbelangrijkste mee te doen. Ik wil dat je daar eerst zelf eens over nadenkt.
Op 28 mei 2009 17:21:37 schreef sjors007:
helaas werkt me klok nog steeds niet.
Helemaal niet dus loopt de tijd ook niet?