benleentje
Golden Member
Als de uc aangaat zonder alles een waarde te geven weet je dus niet welke waarde de variabele heeft. Dit zie je ook aan de rare getallen op je klok. Als je alles op nul zet moet de klok zeker op nul beginnen en daarna nog zien of deze gaat tellen.
Als je nu de waarde hulp ook eens naar je scherm print dan zie je of deze oploopt of niet. Zoniet dan gaat je isr fout, waarschijntlijk komt hij helemaal niet in de ISR.
Als deze niet werk doe je even in je hoofdprogramma wait 40: gosub tijd en aan het einde van tijd een return.
Ga ik morgen wel even je code verder uitpluizen.
[Bericht gewijzigd door benleentje op (13%)]
sjors007
...
Het zit inderdaad bij die ISR, want hij telt de variabele Hulp al niet eens. ik heb ook even geprobeerd met gosub tijd en return maar dan krijg ik niks op mijn display te zien 
MVG Sjors
Mis je niet gewoon een endif op het eind? Bij je 1e if staat geen endif.
Gebruik tab's in je code, dat maakt het een stuk leesbaarder. Dus
while x
doe y
if y=x
doe
endif
doe bloe
wendipv
while
doe
if
doe
end
doe
sjors007
...
@ Bas Smit
ten eerste ieder geval voor het reageren op me vraag, maar zou dat echt uitmaken denk u?? maar de variabele Hulp zal dan sowieso toch moeten door tellen.??
MVG Sjors
benleentje
Golden Member
Volgens mij mis je geen endif dan zou de compiler waarschijnlijkook een error geven.
Maar goed hoever sta je er nu mee wat werk nu wel? Heb je mijn laatste advies al opgevolgd?
Jullie hebben gelijk, ik keek verkeerd. Ik had die inc sec gemist
[Bericht gewijzigd door Bas Smit op (11%)]
sjors007
...
@ Benleentje
ik heb het geprobeerd maar hij deed het nog steeds niet. ik had even gezet print at 2,1, @hulp en hij bleef op 0 staan.
en toen ik dat gosub deed was het wel goed maarja dat is logisch (inc hulp) alleen je gebruikt de timer niet:P
het zit dus bij me registers niet goed denk ik..??
MVG Sjors
benleentje
Golden Member
Kijk nu doe je het goed. Bij problemen is bepalen wat wel werk en wat niet.
Het gaat of bij de tomer fout, maar ik denk dat de isr niet goed verloopt. Volgens mij komt hij helemaal niet in de isr.
in de handleiding van proton staat ergens een voorbeeld van de interrupt afhandeling
Example
' Flash an LED attached to PORTB.0 at a different rate to the
' LED attached to PORTB.1
DEVICE 16F84
ON_HARDWARE_INTERRUPT GOTO Flash
' Assign some Interrupt associated aliases
SYMBOL T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
SYMBOL T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
SYMBOL GIE = INTCON.7 ' Global Interrupt Enable
SYMBOL PS0 = OPTION_REG.0 ' Prescaler ratio bit-0
SYMBOL PS1 = OPTION_REG.1 ' Prescaler ratio bit-1
SYMBOL PS2 = OPTION_REG.2 ' Prescaler ratio bit-2
SYMBOL PSA = OPTION_REG.3 ' Prescaler Assignment (1=assigned to WDT 0=assigned to oscillator)
SYMBOL T0CS = OPTION_REG.5 ' Timer0 Clock Source Select (0=Internal clock 1=External PORTA.4)
SYMBOL LED = PORTB.1
GOTO Over_interrupt ' Jump over the interrupt subroutine
' Interrupt routine starts here
Flash:
' XOR PORTB with 1, Which will turn on with one interrupt and turn off with the next the LED connected to PORTB.0
PORTB = PORTB ^ 1
T0IF = 0 ' Clear the TMR0 overflow flag
CONTEXT RESTORE ' Restore the registers and exit the interrupt
Over_interrupt :
TRISB = %00000000 ' Configure PORTB as outputs
PORTB = 0 ' Clear PORTB
' Initiate the interrupt
GIE = 0 ' Turn off global interrupts
PSA = 0 ' Assign the prescaler to external oscillator
PS0 = 1 ' Set the prescaler
PS1 = 1 ' to increment TMR0
PS2 = 1 ' every 256th instruction cycle
T0CS = 0 ' Assign TMR0 clock to internal source
TMR0 = 0 ' Clear TMR0 initially
T0IE = 1 ' Enable TMR0 overflow interrupt
GIE = 1 ' Enable global interrupts
Inf:
LOW LED
DELAYMS 500
HIGH LED
DELAYMS 500
GOTO Inf
dit is je fout lijkt me
ON_HARDWARE_INTERRUPT GOTO FlashSjors hoe is je engels? Probeer het eens vaker eerst zelf te zoeken. Als je er dan niet uitkomt vraag gerust. Het engels is soms best lastig en als je iets niet van begrijpt mag je dat ook vragen.
Ik wist bv in het begin niet wat ze elke keer met directives bedoelden. Maar dat betekend gewoon aanwijzing.
sjors007
...
@Benleentje
me engels is niet helemaal de beste maar opzich kan ik er wel uitkomen.
ik denk ook dat ie niet in de ISR komt, maar dat legt dan toch aan de registers of niet? of kan het gewoon zijn dat
de volgorde van Goto tijd en On_Interrupt goto... niet goed staan? heeft dat nog van belang?
ON_HARDWARE_INTERRUPT GOTO Flashwat word hier mee bedoeld
MVG Sjors
benleentje
Golden Member
Kijk nu eens wat je in je programma hebt staan. Dat is niet goed denk ik want volgens het voorbeeld van proton is het zoals ik hierboven heb gemeld.
En als je een stuk engelse text niet goed begrijpt vraag hetb dan gewoon dan weet je dat ook voor de volgende keer. Ik spreek nu al 15 jaar elke dag engels voor mijn werk en in prive maar engelse documenten vind ik ook soms erg moeilijk.
sjors007
...
@Benleentje
ik heb het geprobeerd met dat
ON_HARDWARE_INTERRUPT GOTO ....maar ik krijg hem nog steeds niet aan de praat. het zit toch ergens anders denk ik.
ik denk dat ik toch nog iets ben vergeten..??
(dat stukkie wat u aan mij gaf is wel voor TMR0, ik weet niet of dat bij TMR2 hetzelfde is??)
MVG Sjors
Zoals eerder gezegd de datasheet eens raadplegen.
Daar kan je kijken hoe de registers ingesteld moeten worden.
die ON_HARDWARE_INTERRUPT GOTO ... zal alleen maar actief worden als de interrupt goed ingesteld wordt.
Meestal is er in de help functie van proton een voorbeeldprogramma beschikbaar.
Op 3 november 2008 13:23:25 schreef Rupke Flupke:
Ik zit hier even vast, waarschijnlijk een denk foutje.
En dat was dus meer dan een half jaar geleden.
Ik denk niet dat je hier uit gaat komen en zal je maar uit je lijden verlossen 
Zo moet het dus:
Device 16F628A ; We gebruiken een 16F628A type
Config INTRC_OSC_CLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF
All_Digital TRUE ; Alle ingangen digitaal
Xtal = 4
Dim Uren As Byte, Minuten As Byte, Seconden As Byte
Dim i_Uren As Byte, i_Minuten As Byte, i_Seconden As Byte
Dim i_Teller As Byte
Declare LCD_Type ALPHA
Declare LCD_Interface 4
Declare LCD_Lines 2
Declare LCD_ENPin PORTB.0
Declare LCD_RSPin PORTB.3
Symbol GIE = INTCON.7
Symbol PEIE = INTCON.6
Symbol TMR2IF = PIR1.1
Symbol TMR2IE = PIE1.1
Symbol TMR2ON = T2CON.2
On_Hardware_Interrupt GoTo ISR
GoTo HoofdProgramma
ISR:
TMR2IF = 0 ; Andere interrupts worden niet gebruikt
Inc i_Teller ; dus daar testen we ook niet op
If i_Teller = 25 Then i_Teller = 0 : Inc i_Seconden
If i_Seconden = 60 Then i_Seconden = 0 : Inc i_Minuten
If i_Minuten = 60 Then i_Minuten = 0 : Inc i_Uren
If i_Uren = 24 Then i_Uren = 0
Context Restore
HoofdProgramma:
TRISB = %00000000
Clear
DelayMS 500
Cls
Print "Interrupt Klok"
i_Teller = 0
i_Uren = 0 : i_Minuten = 0 : i_Seconden = 0 ; Begin met 00:00:00
T2CON = %01001011 ; Postscaler 1:10, Prescaler 1:16
PR2 = 249 ; 250 ticks geeft 40 millisec / int.
; Dus 25 interrupts per seconde
TMR2IE = 1 : PEIE = 1 : GIE = 1 ; Enable interrupts
TMR2ON = 1 ; Start de timer
While 1=1
DelayMS 100 ; Doe maar wat...
; Om de tijd bijvoorbeeld af te beelden doe het volgende:
GIE = 0 ; Disable interrupts
Uren = i_Uren ; Haal variabelen op
Minuten = i_Minuten
Seconden = i_Seconden
GIE = 1 ; Enable interrupts
Print At 2,1, "Tijd: ", Dec2 Uren, ":", Dec2 Minuten, ":", Dec2 Seconden
Wend
EndVoor een nauwkeurige klok wel een kristal gebruiken, met de interne oscillator zit je er gauw een kwartier per dag naast.
Op 4 juni 2009 11:19:08 schreef JoWi:
[...]En dat was dus meer dan een half jaar geleden.
Ik denk niet dat je hier uit gaat komen en zal je maar uit je lijden verlossen
Het is Sjors007 wat met een probleem zit, mijne is al lang opgelost en was ook met TMR0 en niet met TMR2. Beetje verwarrend natuurlijk.
edit// Dan moet "INTRC_OSC_CLKOUT" er wel uit als je een kristal van 4 Mhz aan gaat sluiten.
Waarom zet je eigenlijk de interrupts in de main uit? Dat heeft toch geen zin, alleen maar kans om er een te missen...
[Bericht gewijzigd door Rupke Flupke op (12%)]
sjors007
...
@Jowi
opzich zat ik er niet ver naast alleen stonden de registers niet op een goed plek!!
ieder geval bedankt voor de informatie
MVG Sjors:D
Je bedoelt:
-behalve dat je de verkeerde vlag reset
-de initialisatie van variabelen vergeet
-de verkeerde waarde in PR2 invult
-het incidenteel fout gaat bij het ophalen
Je hing gewoon de processor op, dat is niet "de registers stonden niet op hun goede plek", meer "ik weet niet wat ik aan het doen ben" 
sjors007
...
@ Jowi
hij loopt op de minuut een seconden te snel, kan dit komen vanwege NU nog interne oscilator..??
MVG SJors
Optie 1: Run hem in de simulator (MPSIM of ISIS) en tel de tijd.
Optie 2: Hang een frequentieteller aan de CLKOUT (daarom heb ik INTRC_CLK_OUT opgegeven).
sjors007
...
freqeuntie teller heb ik niet:S
ik zal even in de simulator testen, maar de tijd zal daar toch niet zachter lopen??
sjors007
...
oke ik ben tot het volgende gekomen!
ik zou normaal voor 25 interrupts voor 1 seconden nodig hebben, maar omdat ik daarmee meer dan 1 seconen krijg. daarmee ben ik tot het volgende gekomen..
voor 25 interrupts krijg ik dus 1 seconden. maar op de minuut loopt ie te snel.
61 / 60 = 1.016666667 seconden voor 25 interrupts
dat zou dus betekenen dat ik voor 1 minuut:
0.016666667 * 60 = 0.9996 seconden
dus zoveel seconden krijg ik te veel per minuut
en dit is dus per dag 24 minuten
0.9996 * 24 = 23.9904
per dag lijkt het misschien heel veel, maar voor een minuut valt het wel mee denk ik
als ik strax een externe kristal gebruik, zal dit dan beter gaan of niet..??
een afwijking van 0.05 of iets minder vind ik al te erg eigenlijk.
dat is dus
0.05 * 24 = 1,2 minuut per dag
1,2 * 7 = 8.4 minuut per week
of is gewoon op te lossen door middel van een andere variatie in post - en prescaler
MVG Sjors
benleentje
Golden Member
Met een extern kristal wordt dit al een beter. De interne oscilator is immers nooit bedoelt als het besturen van een klok.
Neem een een normaal kristalen en neem voor 1 van de condensatoren een trim condensator. Daarmee kan je het kristal wat bijregelen.