Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Čet Nov 15, 2012 6:39 pm Naslov sporočila: Tisočinka |
|
|
Kako v AVRBascomu generirat stotinko sekunde, čim bolj natančno? |
|
Nazaj na vrh |
|
|
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Čet Nov 15, 2012 8:50 pm Naslov sporočila: nekaj sem že sam naredil |
|
|
Ta program sem napisal za začetek , vendar me moti način izpisa. ki je na tak način: 1:39:22
Jaz pa želim izpisn na tak način: 00:00:000
Kje naj brišem display da ne bo utripal?
Config Timer1 = Timer , Prescale = 1
load timer1 , Timer1Reload
on ovf1 Timer1_isr
enable timer1
start timer1
enable interrupts
Dim Tistevec As Byte
Dim Seconds As Byte
Dim Minutes As Byte
Dim Hours As Byte
Dim Days As Byte
Cls
Cursor Off
' ////////////////ZANKA GLAVNEGA PROGRAMA ////////////////////////
Do
If Tistevec => 100 Then
Tistevec = 0
cls
Incr Seconds
If Seconds >= 60 Then
Seconds = 0
Incr Minutes
If Minutes >= 60 Then
Minutes = 0
End If
End If
End If
Gosub Izpis
Loop
End
Timer1_isr:
Load Timer1 , Timer1reload
Incr Tistevec
Return
Izpis:
Locate 1 , 1
Lcd Minutes ; ":" ; Seconds ; ":" ; Tistevec
Return |
|
Nazaj na vrh |
|
|
RudiP Profesionalec
Pridružen/-a: Sre Jul 2008 8:39 Prispevkov: 128 Kraj: KOPER
|
Objavljeno: Čet Nov 15, 2012 8:56 pm Naslov sporočila: |
|
|
Z interaptom !
Pomagaš si z AVR timer calculatorjem. Ta ti pripravi kar rabiš za časovni interapt.
Primer kode:
[/code]
const Timer0Reload = 62
config timer0=timer,prescale = 64
load timer0 , Timer0Reload
on ovf0 Timer0_isr
enable ovf0
start timer0
enable interrupts
'Add your code here
Timer0_ISR:
load timer0, Timer0Reload
'Add your ISR code here
return
'Timer value explination
' The timer is a 8Bit timer, it overflows when the timer reaches 256
' The AVR is running at 4000000Hz, the prescaler is 64
' Each tick is 0,016 ms - (1 / CPUSpeed in KHz ) * Prescaler
' The timer needs 62 ticks to reach the required time ( 62 * 0,016 = 0,992ms)
' The start value for the timer must be set to 194 so that it will overflow at 256 after 62 ticks
' NOTE: The load command does the inversion for you (256-value or 65536-value) _________________ Lep pozdrav ! |
|
Nazaj na vrh |
|
|
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Pet Nov 16, 2012 7:39 pm Naslov sporočila: timer |
|
|
Tak del kode že imam , sedaj me zanima kako naj naredim, da moj izpis na LCD_ju ne bo tak: 1:23:1
ampak da bi bil tak: 01:23:001 |
|
Nazaj na vrh |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Pet Nov 16, 2012 7:52 pm Naslov sporočila: |
|
|
Citiram: | ampak da bi bil tak: 01:23:001 |
Pri izpisu preverjaja ali so minute in sekunde manjše od 10 in ali so stotinke manjšeod 10 ali manjše od sto in dodaj pred izpisom istih ničlo ali ničle.
Lahko pa rezultat pretvoriš v string in uporabiš ukaz FORMAT. |
|
Nazaj na vrh |
|
|
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Ned Nov 25, 2012 11:14 am Naslov sporočila: novo vprašanje |
|
|
sedaj imam naslednji program in novo težavo.
Program:
Const Timer1reload = 15000
Config Timer1 = Timer , Prescale = 64
Load Timer1 , Timer1reload
On Ovf1 Timer1_isr
Enable Timer1
Start Timer1
Enable Interrupts
'Add your code here
Dim Tistevec As Byte
Dim Seconds As Byte
Dim Minutes As Byte
Dim Hours As Byte
Dim Days As Byte
Cls
Cursor Off
' ////////////////ZANKA GLAVNEGA PROGRAMA ////////////////////////
Do
If Tistevec => 100 Then
Tistevec = 0
Incr Seconds
If Seconds >= 60 Then
Seconds = 0
Incr Minutes
If Minutes >= 60 Then
Minutes = 0
End If
End If
End If
Gosub Izpis
Loop
End
Timer1_isr:
Load Timer1 , Timer1reload
Incr Tistevec
Return
Izpis:
If Minutes < 10 Then
Locate 1 , 1
Lcd "0" ; Minutes
Else
Locate 1 , 1
Lcd Minutes
End If
Locate 1 , 3
Lcd ":"
If Seconds < 10 Then
Locate 1 , 4
Lcd "0" ; Seconds
Else
Lcd Seconds
End If
Locate 1 , 6
Lcd ":"
If Tistevec < 10 Then
Locate 1 , 7
Lcd "0" ; Tistevec
Else
Lcd Tistevec
End If
Return
Ta program prav lepo deluje, vendar se pojavi težava, ko pridejo stotinke iz vrednost 99 na 00 se mi pojavi tak izpis:
00:01:010 ta treja nula se pojavi domnevam kot posledica stotinke 100 in naredi trimestno število, ne vem mogoče se motim, kako naj to odpravim? Izpis bi moral biti takšen: 00:01:01
LP Boštjan |
|
Nazaj na vrh |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Ned Nov 25, 2012 12:48 pm Naslov sporočila: |
|
|
Citiram: | If Tistevec < 10 Then
Locate 1 , 7
Lcd "0" ; Tistevec
Else
Lcd Tistevec
End If
Return |
ta del programa poskusi popraviti:
If Tistevec < 10 Then
Locate 1 , 7
Lcd "0" ; Tistevec;" " 'pobrises vse zanake za vrednostjo
Else
Lcd Tistevec;" " 'pobrises vse zanake za vrednostjo
End If
Return |
|
Nazaj na vrh |
|
|
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Ned Nov 25, 2012 1:52 pm Naslov sporočila: še vedno |
|
|
zanimivo.
zadeva se je bistveno izboljšala vendar se še vedno pojavi izpis
00:43:120 namesto 00:43:12 ampak se nula še vedno pojavi.
Opazil sem da se nula ne pojavi kot neko naključno število, zato je ukaz:
Lcd Tistevec ; "" ne pobriše ko se pojavi. Zdi se mi da je del spremenljivke tistevec, pojavi pa se, ko se tistevec prelije iz vrednosti 99 na 00 , zgleda tako, kot da se tretje mesto pojavi kot posledica vrednosti 100. Ne vem če ima to kak pomen. |
|
Nazaj na vrh |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Ned Nov 25, 2012 2:34 pm Naslov sporočila: |
|
|
Boštjan,
jaz ti nisem napisal "", ampak " ",( narekovaj, dve prazni mesti narekovaj"!
Samo tako boš za spremenljivko pobrisal neželene karakterje.
Nisem pa se spuščal v program da vidim ali je še kakšna napaka. |
|
Nazaj na vrh |
|
|
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Ned Nov 25, 2012 4:02 pm Naslov sporočila: ja sem razumel |
|
|
Ja sem razumel, da bi za stoticama naredil še dve prazni mesti, tako
LCD tistevec ; " "
ampak žal mi ne pomaga, ničla ki se mi pojavi je verjetno pojav iz spremenljivke tistevec zato je ne pobriše. |
|
Nazaj na vrh |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Ned Nov 25, 2012 5:02 pm Naslov sporočila: |
|
|
Boštjan,
na žalost izpis na LCD ni tako hitrer kot si mislil.
Ko prideš pri izpisu na LCD do tega da izpišeš stotinke ti se števec že poveča.
pri izpisu stotic preveri ali je rezultat tega >100, če je ga deli z 10.
Pripni cel tvoj program vključno z reg file, crystal . . .
Programa ne prepisuj ampak ga kopiraj takšnega kot ga uporabljaš.
Zakaj imaš prekinitev vsako milisekundo če prikazuješ desetinke? |
|
Nazaj na vrh |
|
|
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Ned Nov 25, 2012 6:50 pm Naslov sporočila: zanimivo |
|
|
Hvala vlado.
Sedaj sem naredil tri presledke in deluje ok.
Sedaj pa bi naredil še start in stop, mogoče kakšna ideja. |
|
Nazaj na vrh |
|
|
Boštjan Profesionalec
Pridružen/-a: Tor Mar 2004 22:48 Prispevkov: 100
|
Objavljeno: Čet Dec 06, 2012 7:32 pm Naslov sporočila: sem ugotovil v čem je težava |
|
|
Težava se pojavi kadar se izvaja izpis na lcd in se pojavi prekinitev za stotinko. Ali se da dobiti stotinke kako drugače brez prekinitve? |
|
Nazaj na vrh |
|
|
Jure Urednik
Pridružen/-a: Pon Jan 2004 12:51 Prispevkov: 2132 Kraj: Ljubljana
|
Objavljeno: Čet Dec 06, 2012 7:47 pm Naslov sporočila: |
|
|
Boštjan,
Vlado je predlagal, da pripni program, sicer tipamo v temi in verjemi, da ni enostavno takole svetovati.
Če ti prekinitev uniči prikaz na LCD-ju lahko uporabiš ukaz INITLCD tik preden skočiš v rutino za prikaz.
Lp
Jure |
|
Nazaj na vrh |
|
|
|