03-30-2018, 02:46 PM
(03-30-2018, 12:01 PM)gorankg Wrote: Povezivanje ti je OK. Princip osvežavanja displeja ti nije dobar. Ne koristim bascom pa ne mogu tu da ti pomognem ali osvežavanje se radi u prekidnoj rutini tajmera.
- Podesiš neki od tajmera tako da generiše prekid nekom frekvencijom. Frekvencija osvežavanja zavisi od broja cifara koje prikazuješ.
- U prekidnoj rutini pogasiš sve tranzistore postavljanjem porta na 0.
- Na segmente (kod tebe je to port D) dovedeš izlaz iz tvoje funkcije Numbers i to samo za jednu cifru. Ovde uvedeš pomoćni brojač koji broji od 0 pa do ukupnog broja cifara minus 1. Svaki ulaz u prekidnu rutinu povećava taj brojač za jedan. Za vrednost brojača 0 izlaz iz Numbers treba da ti bude kodirana cifra za stotine, za vrednost brojača 1 izlaz iz Numbers ti je kodirana vrednost za desetice itd..
- Uključiš tranzistor za odgovarajuću cifru i on ostaje uključen sve do narednog ulaska u prekidnu rutinu. Svo to vreme svetli jedna cifra.
U glavnoj petlji možeš da nastaviš uvećavanje broja koji želiš da prikažeš kao i do sada.
Prekid tajmera ti je vrlo bitna stvar i prava je prilika da ga savladaš sad uz ovo.
Evo citam gore navedeni tekst i FastAVR oko timera i nisu mi jasne nekve stvari:
- timer0 sam podesio sa preskalerom od 256 da daje na 12MHz kristalu 1002.667 us ili ti 1sekuda interrupt prekida sakodom:
$Timer0 = Timer, Prescale = 256 ' 1sec interrupt
Omogucio sam interrupte i startao timer0 da pocne brojati:
Enable Interrupts ' enable global interrupts
Start Timer0 ' start timer0
Zatim sam definirao prekidnu routinu koja se pokrece svakih 1sekundu (kad je timer0 overflow):
Interrupt Ovf0(), Save 1
Reset PORTB.0 ' turn off all segments
Reset PORTB.1
Reset PORTB.2
End Interrupt
E sad po gore napisanim uputstvima treba da ugasim sve segmente to sam i napravio u Ovf0() interruptu...dalje trebam da dovedem na portD broj koji zelim da upisem na segment:
PORTD = segment_number((number mod 1000) / 100)
to mi je jasno kako se dovodi za stotice, desetine itd...ali nije mi jasna ta routina u tome interruptu koja treba da se povecava...novi sam sa timerima...i ovo mi je novo.
Ako mozes da fastavru da napises taj interrupt kod kako bi trebao da ite ta petlja...jer ovako neznam kako treba da i gdje se taj pomocni brojac povecava i kako se salju brojevi na display preko interrupt routine...npr u Do Loop kod:
For i=0 To 480
Next i
Dali globalnu varijablu i preuzima interrupt i prikazuje je na displayu i treba li delay?
evo i basic koda ali nedovrsenog jer neznam kako definirati taj pomocni brojac da broji cifre 1 2 3...