www.elektronik.si
Programiranje v bascom avr
Pojdi na stran Prejšnja  1, 2, 3 ... , 36, 37, 38  Naslednja  :||:
www.elektronik.si -> Bascom sekcija

Avtor: mato1111Kraj: Vrhnika PrispevekObjavljeno: Pet Dec 22, 2017 9:36 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Naredil sem primer ce koga zanima kako se naredi casovno prekinitev.
Uporabil sem Timer1.
Vrednost Timer1reload se izracuna po formuli:
Timer1reload = (f*t)/pr kjer je
f = frekvenca uporabljenega kristala (v Hercih)
t = zeljena casovna enota (v sekundah)
pr = prescale oz. delilnik, ki deli frekvenco kristala, Izbiramo lahko med vrednostmi 1,8,64,256 in 1024.
Pomembno je da je vrednost Timer1reload med 1 in 65535 saj je Timer1 16-biten in zato je njegova max vrednost 65535.

izracun 1:
f = frekvenca uporabljenega kristala = 3686400 Hz
t = zeljena casovna enota = 100 ms = 0,1 s
pr = prescale = 1 (poskusimo z vrednostjo 1)
Timer1reload = (f*t)/pr = (3686400*0,1)/1 = 368640
dobljen rezultat 368640 je vecji kot je najvecja dovoljena vrednost 65535 zato poskusimo z vecjo vrednostjo prescale.

izracun 2:
f = frekvenca uporabljenega kristala = 3686400 Hz
t = zeljena casovna enota = 100 ms = 0,1 s
pr = prescale = 1024 (poskusimo z vrednostjo 1024)
Timer1reload = (f*t)/pr = (3686400*0,1)/1024 = 360
dobljen rezultat 360 je manjsi od 65535 zato je izracun v redu.

Nekje na zacetku programa napisemo tole nastavitev:
Koda:
'***Casovna prekinitev vsakih 100ms***
Const Timer1reload = 360
Config Timer1 = Timer , Prescale = 1024
Load Timer1 , Timer1reload
On Ovf1 Timer1_int
Enable Timer1
Start Timer1
Enable Interrupts


Cisto na koncu programa pa primer tele prekinitvene rutine:
Koda:
Timer1_int:
Ledica = Not Ledica 'Ledica (Nek izhodni pin) spremeni stanje vsako casovno enoto.
Load Timer1 , Timer1reload
Incr stevec 'Nek stevec, ki se vsako casovno enoto poveca za 1 in definiran mora biti na zacetku programa.
Return

Avtor: mato1111Kraj: Vrhnika PrispevekObjavljeno: Pon Jan 08, 2018 4:00 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Sele sedaj sem ugotovil da uporaba stavka "elseif (pogoj) then" znotraj if stavka ni tako logicna (vsaj meni ne) kot se zdi na prvi pogled Think
V bascom help-u piše:
Koda:
IF expression THEN
[ ELSEIF expression THEN ]
[ ELSE ]
END IF

po tem sem sklepal da lahko elseif normalno uporabljas kot naprimer:
Koda:
Dim A As Byte
A = 25
If A < 30 Then
    Print A < 30
Elseif A = 25 Then
    Print A = 25
Elseif A > 23 Then
    Print A > 23
End If

Izkazalo pa se je da se v tem primeru izvede samo ukaz "Print A < 30" kjub temu da sta izpolnjena tudi pogoja A = 25 ter A > 23.
V bistvu se izvede samo prvi pogoj ki je izpolnjen ostale pa ocitno ignorira.
Pa tudi v bascom help-u ne napisano nič na to temo

Avtor: kose19Kraj: okolica Kobarida PrispevekObjavljeno: Pon Jan 08, 2018 4:08 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Kaj se ti izvede pa, če prvi pogo A<30j ni izpolnjen?
Pomoje se šele takrat preverja ELSEIF vrstica.

Kdaj se izvaja drugi ELSEIF stavek pa tudi meni ni jasno tako na pamet brez poizkusit.

Avtor: cimerKraj: Ljubljana PrispevekObjavljeno: Pon Jan 08, 2018 4:39 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Ojla

If stavek se izvaja točno tako kot si sledijo zapisani pogoji.

Najprej preverja prvi IF, če je pogoj izpolnjen, se izvede koda znotraj IF stavka in ko konča z izvajanjem kode skoči na konec IF stavka.

Če pogoj ni izpolnjen se izvede ELSIF ali ELSE. V primeru ELSIF velja isto kot za IF. Če je pogoj izpolnjen, se izvede koda znotraj IF stavka spet skok na konec IF stavka.

S tvojim primerom pravzaprav ne vem kaj si želel s programom. Če napišeš konkretno situacijo, ti lahko pomagamo / svetujemo.....

Avtor: Jaka57Kraj: Grosuplje PrispevekObjavljeno: Pon Jan 08, 2018 5:29 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Kakor ti to razumeš velja za SELECT-CASE-END SELECT.

Avtor: kose19Kraj: okolica Kobarida PrispevekObjavljeno: Pon Jan 08, 2018 7:48 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Ker je bilo prej govora o timerjih in njihovih izračunih sem v TO TEMO pripel enostaven kalkulatorček.

Avtor: mato1111Kraj: Vrhnika PrispevekObjavljeno: Sre Feb 07, 2018 12:35 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Zdravo imam sledečo situacijo.
Atmega328 imam priklopljen na rezervno napajanje tako da ko zmanjka napajalne napetosti imam baterijo. Ker pa hočem imeti tudi zaščito proti preizpraznjenosti baterije imam podprogram ki mi izklopi vse porabnike ko pade napetost baterije pod določeno vrednost tako da ostane vklopljen samo še mikrokontroler sam.
Zanima me ali bi lahko naredil da gre mikrokontroler v tem primeru v kakšen način delovanja ki porabi zelo malo energije in se potem nekako spet zbudi ko pride napajalna napetost nazaj? Za meritev baterije uporabljam en ADC kanal za meritev napajalne napetosti pa drug ADC kanal.

Avtor: Jaka57Kraj: Grosuplje PrispevekObjavljeno: Sre Feb 07, 2018 2:49 pm    Naslov sporočila:  
----------------------------------------------------------------------------
328p pozna šest načinov spanja.
V priloženem pdfju glej stran 39.

Avtor: mato1111Kraj: Vrhnika PrispevekObjavljeno: Sre Feb 07, 2018 3:19 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Sem si pogledal pa mi ni jasno kaj uporabit za moj primer. Ocitno bi ga moral nekako zbudit z ADC? Tudi nobenega programskega primera na ta nacin ne najdem?

Avtor: Jaka57Kraj: Grosuplje PrispevekObjavljeno: Čet Feb 08, 2018 2:43 am    Naslov sporočila:  
----------------------------------------------------------------------------
Odvisno v kateri način spanja ga postaviš, toda za vse načine ga lahko zbudiš z INT0 ali INT1, ko se na enem od teh pinov spremeni vrednost,
to se pravi, ko se spremeni od 1->0 ali obratno in ta signal mora biti prisoten vsaj toliko ciklov oscilatorja, kot je določeno s SUT v nastavitvah fuse bitov (opcije oscilatorja).
Preberi si to poglavje vsaj do strani 43.

Avtor: marko11Kraj: Dobrepolje PrispevekObjavljeno: Ned Avg 25, 2019 1:33 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Hi
Spet malo Bascom-a.

Kako napisati tale pogoj ?

ko je T_k večji (>) za 3 od T_b naj vklopi Rele1

in

ko je T_k enak (=) ali manjši kot T_b naj izključi Rele1

Poskušam s Select Case pa mi ne uspe. Prosim za kakšno pomoč.

LP,marko

Avtor: mato1111Kraj: Vrhnika PrispevekObjavljeno: Ned Avg 25, 2019 1:45 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Dva if stavka?

Avtor: marko11Kraj: Dobrepolje PrispevekObjavljeno: Ned Avg 25, 2019 1:58 pm    Naslov sporočila:  
----------------------------------------------------------------------------
mato1111 je napisal/a:
Dva if stavka?


Sem poskušal pa mi ne uspe. Ali lahko napišeš?

Avtor: Jaka57Kraj: Grosuplje PrispevekObjavljeno: Ned Avg 25, 2019 2:15 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Ne poznam Bascoma, toda naj bi šlo takole:
Koda:
If T_k > (T_b + 3) Then vklopi_Rele1
elseIf T_k <= T_b Then izklopi_Rele1
EndIf


Če ne pozna operatorja <= potem še en if stavek ali logični OR ( If (T_k<T_b) OR (T_k=T_b) Then........ ).

Avtor: marko11Kraj: Dobrepolje PrispevekObjavljeno: Ned Avg 25, 2019 2:25 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Operatorje pozna nesprejme pa tega v oklepaju.

Stran 37 od 38

Powered by phpBB © 2001,2002 phpBB Group