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%)]

ik zal het even proberen.
je hoort het nog van me!

MVG Sjors

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 :P

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
wend

ipv


while
doe
if
doe
end
doe

@ 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

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%)]

@ 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

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 Flash

Sjors 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.

@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 Flash

wat word hier mee bedoeld

MVG Sjors

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.

@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

End

Voor 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%)]

@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" >:)

oke misschien toch niet helemaal in de goede richting:P

ieder geval bedankt

MVG Sjors

@ 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).

freqeuntie teller heb ik niet:S
ik zal even in de simulator testen, maar de tijd zal daar toch niet zachter lopen??

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

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.

ja oke ik zal het even bekijken gaan;)gewoon een condensator van dezelde grote? dus 22pF alleen 1tje een trim;)
een seconden per minuut is wel wat veel van het goede:P

MVG Sjors

[Bericht gewijzigd door sjors007 op (26%)]