sjors007
...
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
ENDhttp://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.
sjors007
...
@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
AVR_N()()B
Een FM zender van 5watt/5km is geen kleine zender | !
sjors007
...
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.
hadv
Just find out what you like and let it kill you
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.
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.
eagle987
Eerst waren het atomen, dan waren het protonen, neutronen, elektronen, nog later waren het quarks en nu blijken het snaren te zijn...
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
sjors007
...
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
eagle987
Eerst waren het atomen, dan waren het protonen, neutronen, elektronen, nog later waren het quarks en nu blijken het snaren te zijn...
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 kwamDit is het zowat, als je nog vragen hebt stel je ze maar 
sjors007
...
@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 kwamen 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
eagle987
Eerst waren het atomen, dan waren het protonen, neutronen, elektronen, nog later waren het quarks en nu blijken het snaren te zijn...
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 
sjors007
...
@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 eagle987
Eerst waren het atomen, dan waren het protonen, neutronen, elektronen, nog later waren het quarks en nu blijken het snaren te zijn...
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
sjors007
...
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
eagle987
Eerst waren het atomen, dan waren het protonen, neutronen, elektronen, nog later waren het quarks en nu blijken het snaren te zijn...
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.
sjors007
...
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
eagle987
Eerst waren het atomen, dan waren het protonen, neutronen, elektronen, nog later waren het quarks en nu blijken het snaren te zijn...
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
sjors007
...
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
sjors007
...
@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 0nu 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 0en 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
sjors007
...
@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