Kezo - om du vill lära dig hur timer fungerar så kanske inte min kod är att föredra. Jag försöker lära mig själv. Ett försök hittar du i den understa koden.
Timern fungerar faktiskt även med delay. Dvs den fyller sitt syfte. Hur länge ska jag göra en aktivitet. Att 5 min blir + - 2 sec. betyder inte så mycket i dessa fall. Men ingenting är så perfekt att det inte kan bli bättre.
Ska tänka på det där med batteriet senare, när jag varit igång ett tag och kan se hur bra/dåligt ett 9 v. håller.
Så här ser min gamla kod ut, den som styr timern med delay.
program timerklocka
const tid2 as longint = 3300
dim tid as longint
dim i, x as integer
dim cont as byte
sub function TestButton as byte
if Button(PORTA, 4, 1, 0) then
result = true
else
result = false
end if
end sub
main:
CMCON = 0x07 ' disable Comparators
TRISB = 0 ' configure pins of portb as output
TRISA = %00010000
PORTB = %00000000 ' turn off diodes on portb
PORTA = %00011000
tid = 580
cont = false
do
cont = TestButton
loop until cont = true
' PORTA.4 = 0
cont = false
delay_ms(1000)
cont = TestButton
if cont = true then
PORTB.0 = 1
tid = tid2
i = 0
do
cont = false
delay_ms(700)
cont = TestButton
if cont = true then
i = i + 1
if i < 8 then
PORTB.i = 1
end if
if (i > 7) and (i < 11) then
PORTA.(i-8) = 1
end if
if i = 11 then
PORTB = %00000000
PORTA = %00011000
delay_ms(500)
PORTB = %11111111
PORTA = %00011111
delay_ms(500)
PORTB = %00000000
PORTA = %00011000
delay_ms(500)
PORTB = %11111111
PORTA = %00011111
delay_ms(500)
end if
tid = tid + tid2
end if
loop until (cont = false) or (i = 11)
end if
PORTB = %00000000 ' turn off diodes on portb
PORTA = %00011000
delay_ms(1000) ' wait for 1 second
i = 0
do
PORTB.i = 1
i = i + 1
x = 0
do
Vdelay_ms(tid)
x = x + 1
loop until x = 13
loop until i = 8
i = 0
do
PORTA.i = 1
i = i + 1
x = 0
do
Vdelay_ms(tid)
x = x + 1
loop until x = 13
loop until i = 2
delay_ms(1000)
PORTA.3 = 1
Sound_Init(PORTA, 3)
larm:
i = 0
Sound_Play(60, 100)
PORTB = %00000001
PORTA = %00010100
delay_ms(100)
Sound_Play(80, 100)
PORTB = %00000011
PORTA = %00010110
delay_ms(100)
Sound_Play(100, 100)
PORTB = %00000101
PORTA = %00010101
delay_ms(100)
Sound_Play(120, 100)
PORTB = %10001001
PORTA = %00010100
delay_ms(100)
Sound_Play(140, 100)
PORTB = %01010001
delay_ms(100)
Sound_Play(160, 100)
PORTB = %00100001
delay_ms(100)
Sound_Play(140, 100)
PORTB = %01010001
delay_ms(100)
Sound_Play(120, 100)
PORTB = %10001001
delay_ms(100)
Sound_Play(100, 100)
PORTB = %00000101
PORTA = %00010101
delay_ms(100)
Sound_Play(80, 100)
PORTB = %00000011
PORTA = %00010110
delay_ms(100)
goto larm
end.
Och så här ser den ut när jag försökt styra tiden med timer-interrupt. Den koden går att kompilera utan felkod, men jag har lånat ut timern för testning en vecka. Så koden är inte testad ännu. Just den här koden är anpassar till 4MHz. och värdena är uträknade med hjälp av timer_calculator_v0_3.exe.
program timerklocka
dim i, x, tid as integer
dim cont as byte
dim counter as word
sub procedure interrupt
counter = counter + 1 ' increment value of cnt on every interrupt
TMR0 = 68
INTCON = $20 ' set T0IE, claer T0IF
end sub
sub function TestButton as byte
if Button(PORTA, 4, 1, 0) then
result = true
else
result = false
end if
end sub
main:
OPTION_REG = 196 ' assign prescaler to TMR0
CMCON = 0x07 ' disable Comparators
TRISB = 0 ' configure pins of portb as output
TRISA = %00010000
PORTB = %00000000 ' turn off diodes on portb
PORTA = %00011000
tid = 1 ' 6 sec. x 10 dioder = 1 min, här börjar koden för att ställa in timern på rätt tid
cont = false
do
cont = TestButton
loop until cont = true
' PORTA.4 = 0
cont = false
delay_ms(1000)
cont = TestButton
if cont = true then
PORTB.0 = 1
tid = 5 ' 6 sec x 5 x 10 dioder = 5 min
i = 0
do
cont = false
delay_ms(700)
cont = TestButton
if cont = true then
i = i + 1
if i < 8 then
PORTB.i = 1
end if
if (i > 7) and (i < 11) then
PORTA.(i-8) = 1
end if
if i = 11 then
PORTB = %00000000
PORTA = %00011000
delay_ms(500)
PORTB = %11111111
PORTA = %00011111
delay_ms(500)
PORTB = %00000000
PORTA = %00011000
delay_ms(500)
PORTB = %11111111
PORTA = %00011111
delay_ms(500)
end if
tid = tid + 5
end if
loop until (cont = false) or (i = 11)
end if
PORTB = %00000000 ' turn off diodes on portb
PORTA = %00011000
delay_ms(1000) ' wait for 1 second
i = 0
counter = 0 ' initialize cnt
TMR0 = 68
INTCON = $A0 ' enable TMRO interrupt
do
PORTB.i = 1 ' här är koden som väntar in timern så att det blir rätt tid.
i = i + 1
counter = 0
do
loop until counter = tid
loop until i = 8
i = 0
do
PORTA.i = 1
i = i + 1
x = 0
counter = 0
do
loop until counter = tid
loop until i = 2
delay_ms(1000)
PORTA.3 = 1
Sound_Init(PORTA, 3)
i = 0
do ' alarm effekt, här börjar koden för att visa att tiden är slut
Sound_Play(60, 100)
PORTB = %00000001
PORTA = %00010100
delay_ms(100)
Sound_Play(80, 100)
PORTB = %00000011
PORTA = %00010110
delay_ms(100)
Sound_Play(100, 100)
PORTB = %00000101
PORTA = %00010101
delay_ms(100)
Sound_Play(120, 100)
PORTB = %10001001
PORTA = %00010100
delay_ms(100)
Sound_Play(140, 100)
PORTB = %01010001
delay_ms(100)
Sound_Play(160, 100)
PORTB = %00100001
delay_ms(100)
Sound_Play(140, 100)
PORTB = %01010001
delay_ms(100)
Sound_Play(120, 100)
PORTB = %10001001
delay_ms(100)
Sound_Play(100, 100)
PORTB = %00000101
PORTA = %00010101
delay_ms(100)
Sound_Play(80, 100)
PORTB = %00000011
PORTA = %00010110
delay_ms(100)
i = i + 1
loop until i = 15
end.
Tidshjälpmedel, timer
-
- Inlägg: 36
- Blev medlem: 27 februari 2007, 16:12:39
- Ort: Vallentuna