hee hallo iedereen,,

ik heb een vraag.. ik heb een programma geschreven (zie hier onder), maar nu wil ik nog een Klok bijvoegen. het probleem is echter ik weet niet precies hoe ik het moet aanpassen. omdat ik met 2 keer While...Wend heb gebruikt, en me klok dus niet verder wil tellen. Ik heb al iets geprobeert met For...Next, maar hij blijf hangen bij while...wend. De klok moet blijven doortellen ook als ik naar de instelling ga. (lijkt me opzich logisch;):P)

hier 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 


SYMBOL off = 0
SYMBOL AAN = 0
SYMBOL UIT = 1
SYMBOL ON  = 1


      
SYMBOL LDR        =PORTA.1
SYMBOL Wissel     =PORTA.2
SYMBOL Relais     =PORTA.3
SYMBOL Open       =PORTB.0
SYMBOL Dicht      =PORTB.2
SYMBOL Handauto   =PORTB.1 
SYMBOL Instel     =PORTB.3      


DIM Weerstand       AS BYTE
DIM Teller          AS WORD
DIM BD1             AS BYTE 
dim BD2             as byte
dim BD3             aS BYTE
DIM BD4             AS BYTE
DIM BD5             AS BYTE
DIM BovengrensOpen  AS BYTE
DIM OndergrensOpen  AS BYTE 
DIM BovengrensDicht AS BYTE      
DIM OndergrensDicht AS BYTE
DIM WachttijdTeller AS WORD        


        

;        76543210
PORTA = %00000000                  ;Alle PORTA poorten laag
TRISA = %11110011                  ;Alleen PORTA.0 en A.1 als uitgang


PORTB_PULLUPS ON                   ;Portb pullups aan voor de sckakelaars
CLEAR                              ;Wis alle RAM geheugen
DELAYMS 500                        ;LCD stabilisering 


;*******Instelling*****************
Instelling:
cls
PRINT AT 1,1, "1. Weerstand"
PRINT AT 2,1, "2. Wachttijd"

while 1 = 1
IF Open = AAN THEN

REPEAT
PRINT AT 1,1, "Luxaflex DICHT"
ondergrensdicht = bd2
IF Dicht = AAN THEN INC bd2
IF Handauto = AAN THEN DEC bd2
PRINT AT 2,1, "Onder <",@bd2,">     "
DELAYMS 110
UNTIL Open = AAN

DELAYMS 25
WHILE Open = AAN : WEND

REPEAT
bovengrensdicht = bd3
IF Dicht = AAN THEN INC bd3
IF Handauto = AAN THEN DEC bd3
PRINT AT 2,1, "Boven <",@bd3,">      "
DELAYMS 110
UNTIL Open = AAN AND bd3 > bd2

DELAYMS 25
WHILE Open = AAN : WEND 

CLS
REPEAT
PRINT AT 1,1, "Luxaflex OPEN "
ondergrensopen = bd4
IF Dicht = AAN THEN INC bd4
IF Handauto = AAN THEN DEC bd4
PRINT AT 2,1, "Van <",@bd4,"> tot ",@bd5,"       "
DELAYMS 110 
UNTIL Open = AAN THEN

DELAYMS 25
WHILE Open = AAN : WEND

REPEAT
bovengrensopen = bd5 
if dicht = aan then inc bd5
IF Handauto = AAN THEN DEC bd5
PRINT AT 2,1, "Van ",@bd4," tot <",@bd5,">       " 
DELAYMS 110
UNTIL Open = AAN AND bd5 > bd4

DELAYMS 25
WHILE Open = AAN : WEND
GOTO Instelling
ENDIF

IF Dicht = AAN THEN
DELAYMS 25
WHILE Dicht = AAN : WEND
CLS
PRINT AT 1,3, "Reageer tijd"
REPEAT
WachttijdTeller = (BD1 * 600)
IF Dicht = AAN THEN INC BD1
IF Handauto = AAN THEN DEC BD1
PRINT AT 2,5, "<",@BD1, "> Min.   "
DELAYMS 110
UNTIL Open = AAN
DELAYMS 25
WHILE Open = AAN : WEND 
GOTO handbediening
ENDIF
WEND



;********Handbediening*************
Handbediening:
cls
PRINT AT 1,2, "Luxaflex (Hand)"
PRINT AT 2,2, "1.Open  2.Dicht"
delayms 500
while 1 = 1
  HandOpen:
  WHILE Dicht = AAN : WEND
  IF Open = AAN THEN
  Relais = ON 
  DELAYMS 50
  Wissel = ON
  ELSE 
  Relais = off
  Wissel = off
  ENDIF 
  IF Dicht = AAN THEN GOTO HandDicht
 
  
  HandDicht:
  WHILE Open = AAN : WEND
  IF Dicht = AAN THEN
  Wissel = ON
  ELSE 
  Wissel = off
  ENDIF
  IF Open = AAN THEN GOTO HandOpen
  

IF Handauto = AAN THEN
while handauto = aan : wend
CLS
FOR Teller = 0 TO wachttijdteller
PRINT AT 1,2, "Luxaflex (Auto)"
print at 2,2, @teller
DELAYMS 100 
if handauto = aan then goto handbediening
NEXT
GOTO Automatisch
endif
if instel = aan then goto instelling  
wend



;*********Automatisch*************
Automatisch:
cls
delayms 500
  while 1 = 1
  AutoDicht:
  Weerstand = POT LDR, 160
  IF Weerstand <ondergrensdicht OR Weerstand >bovengrensdicht THEN
  Relais = ON
  DELAYMS 50
  Wissel = ON
  ELSE
  Relais = off
  Wissel = off
  ENDIF
  IF Weerstand >ondergrensopen AND Weerstand <bovengrensopen THEN 
    FOR Teller = 0 TO wachttijdteller
    DELAYMS 100
    Weerstand = POT LDR, 160
    IF Weerstand <ondergrensdicht or Weerstand >bovengrensdicht THEN BREAK
    NEXT
    GOTO AutoOpen
  ENDIF
  if handauto = aan then
  wissel = off
  delayms 50
  relais = off
  goto handbediening
  endif
  if instel = aan then goto instelling
  wend

  AutoOpen:
  while 1 = 1
  print at 2,1, @weerstand
  Weerstand = POT LDR, 160
  IF Weerstand >ondergrensopen AND Weerstand <bovengrensopen THEN
  Wissel = ON
  ELSE
  Wissel = off
  ENDIF
  IF Weerstand <ondergrensdicht OR Weerstand >bovengrensopen THEN 
    FOR Teller = 0 TO wachttijdteller
    DELAYMS 100
    Weerstand = POT LDR, 160
    IF Weerstand >ondergrensopen AND Weerstand <bovengrensopen THEN BREAK
    NEXT
    GOTO AutoDicht
  ENDIF
  if handauto = aan then 
  wissel = off
  delayms 50
  relais = off
  goto handbediening
  endif
  if instel = aan then goto instelling
  wend

END

http://www.circuitsonline.net/forum/faq/2 even goed lezen en je code tussen tags zetten.

Alleen dan het volgende probleem: Je kan niet verwachten dat iemand anders door je hele programma gaat spitten.

Post alleen relevante code, deze grote lap host maar ergens.

@Henry S.

ik verwacht niet dat mensen een compleet programma voor me schrijven hoor. ik vraag alleen of mensen misschien een idee hebben over hoe het kan.

MVG Sjors van den Berg

Hij bedoelt dat je alleen de code moet posten waar de fout in zit.
Niet de gehele code.

nee nee dat ook niet echt ik wil alleen iets weten hoe je bijvoorbeeld een klok moet inbouwen bij dit, ik kom zelf niet verder omdat ik 2x while..wend heb gebruikt. als ik dan bijvoorbeeld een klok maak met For..next. en er komt een lus in van while...wend dan telt de for....next niet meer door. snap u?

MVG Sjors van den Berg

Microcontrollers bevatten timers, deze kunnen na een exact aantal pulsen een interrupt geven aan je programma.
Als je dus een klok wilt maken, stel je een timer zo in dat hij met een frequentie van 1Hz interrupts geeft. Je klok tikt zo altijd mooi door, en je hebt tijd zat om je processor andere dingen te laten doen.

Op 1 mei 2009 22:05:16 schreef sjors007:
nee nee dat ook niet echt
[...]

Dus haal die code maar weg en host het ergens.

Timer1 met een 32768 kristal en dan de tmr1 interrupt gebruiken. Elke keer preloaden met 128 om op 1 Hz uit te komen. De nauwkeurigheid is afhankelijk van de kwaliteit van je kristal. Ik heb het in 2 schakelingen ingebouwd, de ene is nauwkeuriger dan de ander. Correcties zijn natuurlijk mogelijk door een andere waarde dan 128 te gebruiken, maar dat kost veel experimenteertijd want bij het kristal met de grootste afwijking duurde het toch een paar uur voor een seconde verschil was met mijn DCF ontvanger.

@Stijn S

iede geval bedankt voor de informatie!
En hoe zit je dit dat in je programma??

In de datasheet de register instellingen opzoeken. EN die dan in je programma zetten. En even in de picbasic handleiding kijken hoe het zit met interrupts.

@Bas Smit

ik zal even kijken in de datasheet kijken van me PIC

MVG Sjors van den Berg

Een tijdje terug had ik hetzelfde probleem, toen heb ik veel gehad aan dit topic: http://www.circuitsonline.net/forum/view/41049/1/timer+interrupt
daarin staat uitgelegd wat een interrupt is, hoe je hem aanzet en hoe je hem programmeert

Ik kwam dit stukkie tekst tegen. is dit ongeveer wat de bedoeling is?

' LCD clock program using On Interrupt
' Uses TMR0 and prescaler.  Watchdog Timer should be
' set to off at program time and Nap and Sleep should not be used.
' Buttons may be used to set hours and minutes

		Include "PROTON_4.INC"

		Dim hour    as     byte    		' Define hour variable
		Dim dhour   as     byte    		' Define display hour variable
		Dim minute  as     byte    		' Define minute variable
		Dim second  as     byte    		' Define second variable
		Dim ticks   as     byte    		' Define pieces of seconds variable
		Dim update  as     byte    		' Define variable to indicate update of LCD
		Dim i       as     byte    		' Debounce loop variable

        Delayms 100       				' Wait for LCD to startup

        hour = 0        				' Set initial time to 00:00:00
        minute = 0
        second = 0
        ticks = 0

        update = 1      				' Force first display

' Set TMR0 to interrupt every 16.384 milliseconds
        OPTION_REG = $55        		' Set TMR0 configuration and enable PORTB pullups
        INTCON = $A0            		' Enable TMR0 interrupts
        On Interrupt Goto Tickint		' Create a SOFTWARE INTERRUPT

' Main program loop - in this case, it only updates the LCD with the time
mainloop:
        PORTB = 0       				' PORTB lines low to read buttons
        TRISB = $F0     				' Enable all buttons

        ' Check any button pressed to set time
        If PORTB.7 = 0 Then decmin
        If PORTB.6 = 0 Then incmin      ' Last 2 buttons set minute
        If PORTB.5 = 0 Then dechr
        If PORTB.4 = 0 Then inchr       ' First 2 buttons set hour

        ' Check for time to update screen
Chkup:  If update = 1 Then
        	Cls   						' Clear screen

       		' Display time as hh:mm:ss
       		dhour = hour    			' Change hour 0 to 12
       		If (hour // 12) = 0 Then
       			dhour = dhour + 12
       		Endif

       		' Check for AM or PM
       		If hour < 12 Then
       			Print dec2 dhour, ":", dec2 minute, ":", dec2 second, " AM"
       		Else
       			Print dec2 (dhour - 12), ":", dec2 minute, ":", dec2 second, " PM"
       		Endif

       		update = 0      			' Screen updated
       	Endif

		Goto mainloop   				' Do it all forever

' Increment minutes
Incmin: minute = minute + 1
        If minute >= 60 Then
			minute = 0
        Endif
        Goto debounce

' Increment hours
Inchr:  hour = hour + 1
        If hour >= 24 Then
			hour = 0
        Endif
        Goto debounce

' Decrement minutes
Decmin: minute = minute - 1
        If minute >= 60 Then
			minute = 59
        Endif
        Goto debounce

' Decrement hours
Dechr:  hour = hour - 1
        If hour >= 24 Then
			hour = 23
        Endif

' Debounce and delay for 250ms
Debounce: 
        For i = 1 to 25
        	Delayms 10        				' 10ms at a time so no interrupts are lost
        Next

        Update = 1      				' Set to update screen

        Goto Chkup

' Interrupt routine to handle each timer tick
        Disable         				' Disable interrupts during interrupt handler
Tickint: 
		ticks = ticks + 1      		' Count pieces of seconds
        If ticks < 61 Then tiexit       ' 61 ticks per second (16.384ms per tick)

' One second elasped - update time
        ticks = 0
        second = second + 1
        If second >= 60 Then
			second = 0
			minute = minute + 1
			If minute >= 60 Then
				minute = 0
            	hour = hour + 1
             	If hour >= 24 Then
                	hour = 0
           		Endif
    		Endif
        Endif

        update = 1      				' Set to update LCD

Tiexit: INTCON.2 = 0    				' Reset timer interrupt flag
        Resume

Ik zal proberen om het wat uit te schrijven:

De timer-interrupt is zoals de naam doet vermoeden een teller die bestaat uit 8 bits, dus hij kan tellen tot 256.
Iedere instruction cycle verhoogt deze teller met 1, echter is dit niet voor alle toepassingen nodig en daarom kan je hem "scalen" zodat hij pas na 2, 4, 8,... instruction cycles verhoogt. een instruction cycle is gelijk aan 4 clock cycles, een clock cycle kan je berekenen met de formule T = 1/f dus 1/ je kristalwaarde bv 1/4000000 Hz

De prescaler kan je instellen door 3 "ratio-bits" hoog of laag te maken, deze bits noemt men ps1 ps2 en ps3
de prescaler zelf kan je actief maken door PSA een bepaalde waarde te geven. Als je PSA op 0 zet dan maak je gebruik van je kristal, staat hij op 1 dan gebruik je je interce oscillator. Let wel op, PSA is een deel van het Option_register, dus moet je in je programma ergens iets in deze aard staan hebben:

 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)  
 

 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 

Met de instructie GIE kan je de interrupts aan en afzetten, in het begin word deze op 0 gezet zodat alle vorige interrupts (van de vorige keer dat hij opgestart werd) gewist worden
Met T0CS kan je de bron van je timer van je timer-interrupt kiezen, ofwel kies je voor de interne klok (als je er eerder voor gekozen hebt om een kristal te gebruiken dan is dit een kristal, anders de RC-kring die loopt op 4MHz) ofwel kies je ervoor om een timer interrupt te veroorzaken door TOCKI pin hoog of laag te maken, maar dit is waarschijnlijk niet je bedoeling dus zet je T0CS op 0
TMR0 is de teller van je timer interrupt, deze staat meestal op 0, dan telt hij elke keer tot aan 256, maar je kan je TMR0 ook op 56 zetten, dan telt hij nog maar tot 200

wat uitleg over de ratio bits

 PS2 PS1 PS0 PSA=0 (External crystal OSC) PSA=1 (Internal WDT OSC)
 0   0   0   1 : 2                        1 : 1
 0   0   1   1 : 4                        1 : 2
 0   1   0   1 : 8                        1 : 4
 0   1   1   1 : 16                       1 : 8
 1   0   0   1 : 32                       1 : 16
 1   0   1   1 : 64                       1 : 32
 1   1   0   1 : 128                      1 : 64
 1   1   1   1 : 256                      1 : 128

Tot zover het instellen van je timer interrupt, nu nog de interrupt handler
De interrupt handler is een stukje programma dat je schrijft waarin je bepaalde opdrachten zet wat er moet gebeuren als de tmr0 zijn maximum waarde van 256 heeft bereikt. Indien de tmr0 op 256 staat dan krijgt de t0if (timer 0 interrupt flag bit) de waarde 1, hierdoor zal hij naar de interrupt handler springen, waar deze interrupt handler zich precies bevind moet je in het begin van je programma schrijven door de instructie on_interrupt goto ??? (vrij te kiezen)
eenmaal in de interrupt handler doorloopt hij bepaalde instructies en moet de timer 0 flag bit terug op 0 gezet worden, klaar voor de volgende interrupt
dit alles gebeurt zo:

 DEVICE 16F886
... 
 ON_INTERRUPT GOTO Interrupt_handler
...
Interrupt_handler: 
 INC seconden
 if seconden = 60 then clear seconden
 T0IF = 0                        ' de timer 0 interrupt flag big terug op 0 zetten 
 CONTEXT RESTORE                 ' terugkeren van waar je kwam

Dit is het zowat, als je nog vragen hebt stel je ze maar ;)

@eagle987

iede geval bedankt voor de informatie!!;)
dus als ik het goed begrijp zet ik dit ergens in me programma

 ON_INTERRUPT GOTO Interrupt_handler
...
Interrupt_handler: 
 INC seconden
 if seconden = 60 then clear seconden
 T0IF = 0                        ' de timer 0 interrupt flag big terug op 0 zetten 
 CONTEXT RESTORE                 ' terugkeren van waar je kwam

en ik moet dan nog de ps0, ps1, cycle, enzo. instellen.
alleen van dat cycles begrijp ik nog niet helemaal.
dus ik kan dan gewoon ergens neer zetten
print dec2 uren,":",dec2 minuten,":",dec2 seconden. die uren en minuten moet ik dan wel ergens instellen. en dan heb ik dus een klok die continue doortelt, zonder dat ie blijft hangen bij een while..wend situatie?

ieder geval bedankt voor de moeite!;)

MVG Sjors van den Berg

Je voorbeeldprogrammaatje klopt, wel nog de minuten verhogen na 60 seconden
wel niet zomaar "ergens" neerzetten, on_interrupt goto moet bovenaan je programma staan

Dat is het handige aan het interrupt, het blijft nergens hangen bij een while...wend of delay
interrupt = onderbreken het heeft voorrang op de rest, pas als dit afgehandelt is doet hij terug verder
Je kan het vergelijken met een teller die bij elke instructie-cycle verhoogt, hoe snel deze teller verhoogt kan je instellen met PS1 ... PS3 (de prescaler zet je ergens bovenin je programma)
een instructie-cycle kan je eigenlijk vergelijken met een tijd die hij nodig heeft om een instructie uit te voeren
een kristal oscilleert, hoe snel hij dit doet bepaalt je klok-cycle tijd
4 klok-cycles zijn gelijk aan 1 instruction-cycle en met die tijden kan je bepalen hoe snel een interrupt zich moet voordoen. bv om de 512 instruction cycles, of om 1024, ... dit stel je in met je prescaler

als je dan nog je seconden, minuten en uren goed vormt is het eigenlijk niet meer dan dat ;)

@eagle987

ik denk dat dit nog even te hoog gegrepen is voor mij:P
dus het bovenstaande voorbeeld programmaatje klopt? en ik kan dus onderaan gewoon een while... wend plaatsen en ergens neerzetten, print uren,minuten,seconden..??

(ik kwam trouwens dit schemaatje ook tegen, klopt dit een beetje of niet?)

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


		ON_INTERRUPT Goto myint

		Dim TICK as	Byte SYSTEM
		Dim seconds as Byte		
		Dim minutes as Word	
		Dim hours as Word	
	
		minutes = 0			
		seconds = 0
	
		T1CON = $01				' Turn on Timer1, prescaler = 1
		INTCON 	= $C0			' Enable global interrupts, peripheral interrupts
		PIE1 = $01				' Enable TMR1 overflow interrupt
		
Goto main
	
		Movlw	$C0				; Prepare to set TMR1 high register
		Movwf	TMR1H			; Set TMR1H to C0h
		Incf	TICK,F			; INCREMENT TICK COUNT
  		Bcf     PIR1, 0			; Clear interrupt flag

myint: 	
	PIE1 = 0				
	seconds = seconds + (tick / 61)	
	
	IF seconds = 60 THEN
	minutes = minuten + 1
        seconds = 0
	ENDIF
	
	IF minutes = 60 THEN
        hours = hours + 1
	minutes = 0
	ENDIF
	
	IF hours = 24 THEN
	hours = 0
	ENDIF
	
	PIE1 = $01				
Return						

main:
WHILE 1 = 1                  
  TOGGLE PORTA.1              
  DELAYMS 500                 
WEND                         

END 

Te hoog gegrepen, te hoog gegrepen, lees het eens rustig door en dan zal het wel gaan :)
alleen begrijp ik niet goed wat die assembler instructies doen in proton, of het zou tussen ASM...ENDASM moeten staan
je mag gewoon while wend lussen plaatsen en gewoon print neerzetten, kan allemaal geen kwaad
wat betreft dat programma zou ik een ander voorbeeld nemen, kijk hier maar eens naar http://www.circuitsonline.net/forum/view/41049/1/timer+interrupt
daar staat er ergens een programma met een servosturing, enkel de interrupt handler aanpassen, prescaler anders zetten etc. en kopieren en plakken in je programma

ik denk dat dit al aardig in de richting komt of zit ik er helemaal naast:P;)

DEVICE 16F628A
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF,MCLRE_OFF
ALL_DIGITAL true
 
On_interrupt Klok
SYMBOL INTF = INTCON.1        ' RB0 External Interrupt Flag
SYMBOL INTE = INTCON.4        ' RB0 External Interrupt Enable
SYMBOL GIE = INTCON.7         ' Global Interrupt Enable

SYMBOL Sec. = PORTb.0
SYMBOL Min. = portb.1
symbol hrs. = portb.2

DIM seconden as byte
dim minuten as byte
dim uren as byte


DELAYMS 500
CLS

GOTO over_irq

Klok:
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
uren = 0
ENDIF
INTF=0
CONTEXT RESTORE


over_irq:
GIE=0
INTE=1
GIE=1

loop:
DELAYMS 100
PRINT AT 1,1, DEC2 uren,":",dec2 minuten,":",dec2 seconden
GOTO loop
END 

MVG Sjors van den Berg

tja, je prescaler is niet ingesteld, je hebt intcon.2 en intcon.5 nodig niet 1 en 4, je tmr0 moet nog op 0 gezet worden, ik zie ook dat je de interne oscillator gebruikt voor een klok, dus deze zal niet erg juist lopen, gebruik een kristal en zet dan de juiste xtal waarde, enz.

dit word me echt te lastig:P

kunt u me niet alvast even een beginnetje geven met bijvoorbeeld de moeilijkste instellingen

MVG Sjors van den Berg

Dit is wellicht niet de beste manier om het te leren maar enfin, hier een voorbeeldje

Device 16F628A                ;Gebruik een 16F628A type
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL 16                       ;Kristal van 16MHz
...
Symbol GIE = INTCON.7 		   ;global interrupt enable
Symbol T0IE = INTCON.5 	       ;TMR0 overflow interrupt enable 
Symbol T0IF = INTCON.2 	       ;TMR0 overflow interrupt flag bit
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  
Symbol T0CS = OPTION_REG.5     ;Timer0 Clock Source Select
...
TRISA = ???
TRISB = ???
...
On_interrupt GoTo Klok
GIE = 0				           ;disable all global interrupts
PSA = 0                        ;Assign the prescaler to oscillator 
PS0 = 0                        ;Set the prescaler 
PS1 = 0                        ;to increment TMR0 
PS2 = 0                        ;every 2nd instruction cycle 
T0CS = 0                       ;Assign TMR0 clock to internal source
T0IE = 1			           ;TMR0 overflow interrupt enable
T0IF = 1			           ;TMR0 overflow interrupt flag bit
GIE = 1				           ;enable all global interrupts
TMR0 = 0                       ;zet tmr0 op 0

GoTo loop

Klok:
...
T0IF=0
Context Restore

loop:
...

de ... laat ik aan jou over

oke bedankt:D:D
ik zal het even in elkaar voegen en kijken of het werkt!

je hoort nog van me;)

MVG Sjors van den Berg

@Eagle987

ik heb nu de klok werkend:D alleen hij loopt nog te snel. ik gebruik voor nu nog even de interne kristal (4Mh) ik weet alleen niet precies hoe ik hem goed moet zetten qua snelheid. Ik zat us te kijken bij dat voorbeeldje dat jij mij gaf, en daar stond in:

GIE = 0				           ;disable all global interrupts
PSA = 0                        ;Assign the prescaler to oscillator 
PS0 = 0                        ;Set the prescaler 
PS1 = 0                        ;to increment TMR0 
PS2 = 0                        ;every 2nd instruction cycle 
T0CS = 0                       ;Assign TMR0 clock to internal source
T0IE = 1			           ;TMR0 overflow interrupt enable
T0IF = 1			           ;TMR0 overflow interrupt flag bit
GIE = 1				           ;enable all global interrupts
TMR0 = 0                       ;zet tmr0 op 0

nu liep de teller onwijs snel. Nu heb ik zelf dit even gedaan

On_interrupt GoTo Klok
GIE = 0				           ;disable all global interrupts
PSA = 0                       ;Assign the prescaler to oscillator 
PS0 = 1                        ;Set the prescaler 
PS1 = 1                        ;to increment TMR0 
PS2 = 1                        ;every 2nd instruction cycle 
T0CS = 0                       ;Assign TMR0 clock to internal source
T0IE = 1			           ;TMR0 overflow interrupt enable
T0IF = 1			           ;TMR0 overflow interrupt flag bit
GIE = 1				           ;enable all global interrupts
TMR0 = 0                       ;zet tmr0 op 0

en loopt hij wel al langzamer, alleen een seconden duurt nog steeds geen seconden:P nu zat ik even bij dat tabeltje te kijken wat je een tijdje geleden had gestuurd, en ik dacht misschien moet het deze zijn.

 PS2 PS1 PS0 PSA=0 (External crystal OSC) PSA=1 (Internal WDT OSC)
 0   1   0   1 : 8                        1 : 4

ik moet me PSA op 1 zetten vanwege interne kristal, en dan
PS2 = 0
PS1 = 1
PS0 = 0

(ik ga binnen kort weer kristallen (20Mh) bestellen)
MVG Sjors van den Berg

@eagle987

ik denk dat ik al een manier heb gevonden! ik kwam hem tegen in een forum
PSA = 0
PS0 = 1
PS1 = 1
PS2 = 0
als ik mijn prescaler op 1:16 zet en ik gebruik voor even mijn 4MHz interne oscilator dan is het dus

4MHz = 1.000.000 instructie cycles per seconde
mijn TMRO = 6
dan word het dus 256 - 6 = 250
1.000.000 / 250 = 4000 interrups per seconden

4000 / 16 = 250
dan maak ik een tellertje tot 250
dan zeg ik

als de teller bij 250 dan
seconden = seconden + 1
dan moet het volgens mij aardig kloppen:D

MVG Sjors van den Berg