|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
linel Član
Pridružen-a: Čet 06 Mar 2008 21:14 Prispevkov: 178 Aktiv.: 0.91 Kraj: prekmurje
|
Objavljeno: Pet Nov 29, 2013 8:12 pm Naslov sporočila: |
|
|
lahko dve...
|
|
Nazaj na vrh |
|
|
mucek Član
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5337 Aktiv.: 24.72 Kraj: Domzale
|
Objavljeno: Pet Nov 29, 2013 8:19 pm Naslov sporočila: |
|
|
Koda: |
'DEFINICIJA "STROJNE OPREME" - TO VEDNO NAREDIŠ NAJPREJ!!!
$regfile = "m8def.dat"
$crystal = 12000000
Config Portd = Output 'Zaradi preglednosti daj skupaj npr. izhode in nato skupaj vhode
Config Portb = Output
Config Pinc.5 = Input : Tipka_rst Alias Pinc.5 'Aliase se vedno piše za definicijo porta (input)
Config Pinc.0 = Input : Tipka1 Alias Pinc.0 'Zaradi preglednosti jih sam pišem vedno kar v isto vrstico
Config Pinc.1 = Input : Tipka2 Alias Pinc.1 ' (dvopičje je za Bascom isto, kot bi šel pisat v novo vrstico)
Config Pinc.2 = Input : Tipka3 Alias Pinc.2
Config Pinc.3 = Input : Tipka4 Alias Pinc.3
Config Debounce = 30
Const Timer0reload = 54 'Tudi definicije interruptov, adc itd. spada sem.
Config Timer0 = Timer , Prescale = 1024
Load Timer0 , Timer0reload
On Ovf0 Timer0_isr
Enable Ovf0
Start Timer0
'-------------------------------------------------------------------------------
'DEFINICIJA SPREMENLJIVK - TO NAREDIŠ KASNEJE (ZA HW) - Stringe daj vedno na konec!
Dim Eni1 As Word
Dim Des1 As Word
Dim Des As Word
Dim Eni As Word
Dim I As Word : I = 0 'začetna vrednost spremenljivke I
Dim J As Byte : J = 0 ' začetna vrednost spremenljivke J
Dim K As Byte
'****************************** GLAVNI PROGRAM ****************************************************
Enable Interrupts
Do 'Do-loop zanka naj bo čim enostavnejša in preglednejša!
If Tipka_rst = 1 Then 'Čimveč pomeči ven v podprograme!
I = 0
J = 0
End If
Debounce Tipka1 , 1 , Dodaj , Sub
Debounce Tipka2 , 1 , Dodaj , Sub
Debounce Tipka3 , 1 , Dodaj1 , Sub
Debounce Tipka4 , 1 , Dodaj1 , Sub
Gosub Racunaj
Loop
'************************ PREKINITVENA RUTINA****************************************************
'SUBI
Dodaj:
If Tipka1 = 1 Then Incr I 'da se pisati tudi enostavne IF stavke :)
If Tipka2 = 1 Then Decr I
Return
Dodaj1:
If Tipka3 = 1 Then Incr J
If Tipka4 = 1 Then Decr J
Return
Racunaj:
Eni = I Mod 10
Des = I Mod 100
Des = Des / 10
Eni1 = J Mod 10
Des1 = J Mod 100
Des1 = Des1 / 10
Portd = Lookup(i , Stevilke)
Portb = 0
If K = 0 Then 'Ker K hkrati ne more imeti 4 vrednosti, je bolje delati "elseif": tako se naslednji stavki sploh ne izvedejo,
Set Portb.3 'če je npr. pravilen že prvi pogoj.
Portd = Lookup(des1 , Stevilke)
Elseif K = 1 Then
Set Portb.2
Portd = Lookup(eni1 , Stevilke)
Elseif K = 2 Then
Set Portb.1
Portd = Lookup(des , Stevilke)
Elseif K = 3 Then
Set Portb.0
Portd = Lookup(eni , Stevilke)
End If
Return
Timer0_isr: 'V interrupt rutinah moraš imeti ČIMMANJ!!! Ti imaš tule cel roman!
Load Timer0 , Timer0reload 'Sem ti zmetal zadeve, ki se lahko delajo izven interrupta v
Incr K 'subrutino "Racunaj", ki se kliče iz Main-a
If K > 3 Then K = 0
Return
'***************************TABELA VREDNOSTI ŠTEVILK ZA SEGMENTE*****************************************
Stevilke:
' 0 1 2 3 4 5 6 7
Data &H3F , &H06 , &H5B , &H4F , &H66 , &H6D , &H7C , &H07 , &H7F , &H67
|
_________________ ...lahko pa se tudi motim ... |
|
Nazaj na vrh |
|
|
mucek Član
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5337 Aktiv.: 24.72 Kraj: Domzale
|
Objavljeno: Pet Nov 29, 2013 8:20 pm Naslov sporočila: |
|
|
Še datoteka za direktno delo - preimenuj v .bas!
Malo preglej samo strukturo "mojega" programa in se jo v prihodnje poskusi držati. Nepregleden program = slab program.
Lp, g
Opis: |
|
Download |
Ime datoteke: |
test.txt |
Velikost datoteke: |
3.6 KB |
Downloadano: |
8 krat |
_________________ ...lahko pa se tudi motim ... |
|
Nazaj na vrh |
|
|
linel Član
Pridružen-a: Čet 06 Mar 2008 21:14 Prispevkov: 178 Aktiv.: 0.91 Kraj: prekmurje
|
Objavljeno: Pet Nov 29, 2013 9:22 pm Naslov sporočila: |
|
|
štetje je normalno, se je pa pojavilo da gorijo segmenti, kateri bi morali biti ugašnjeni nekje z 30% svetlosti vklopljenega segmenta. Ob pritiskih, ko se števec spreminja, se tudi oni spreminjajo( bi morali biti ugašnjeni) eni so pa ugašnjeni kot treba
|
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.65
|
Objavljeno: Pet Nov 29, 2013 9:27 pm Naslov sporočila: |
|
|
linel je napisal/a: |
kako pa pogledam v register reseta? ( po datasheetu sem pogledal in je to register 0x000 ali? |
Poglej v datasheet in išči MCUCSR register. Pa pozorno preberi obnašanje tega registra, ker ni dovolj, da samo prebereš vrednost.
_________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
mucek Član
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5337 Aktiv.: 24.72 Kraj: Domzale
|
Objavljeno: Pet Nov 29, 2013 9:28 pm Naslov sporočila: |
|
|
Kako imaš vezane izhode? (preko tranzistorja, direktno? Če prvo - daj shemo pokaži, da ti ne manjka kak pull down)
Lp, g
_________________ ...lahko pa se tudi motim ... |
|
Nazaj na vrh |
|
|
mucek Član
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5337 Aktiv.: 24.72 Kraj: Domzale
|
Objavljeno: Pet Nov 29, 2013 9:30 pm Naslov sporočila: |
|
|
Portd = Lookup(i , Stevilke)
Portb = 0
If K = 0 Then 'Ker K hkrati ne more imeti 4 vrednosti, je bolje delati "elseif": tako se naslednji stavki sploh ne izvedejo,
Set Portb.3 'če je npr. pravilen že prvi pogoj.
Portd = Lookup(des1 , Stevilke)
Elseif K = 1 Then
Set Portb.2
Portd = Lookup(eni1 , Stevilke)
Elseif K = 2 Then
Set Portb.1
Portd = Lookup(des , Stevilke)
Elseif K = 3 Then
Set Portb.0
Portd = Lookup(eni , Stevilke)
End If
Daj tole v interrupt rutino ...
_________________ ...lahko pa se tudi motim ... |
|
Nazaj na vrh |
|
|
Vlado Član
Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 561 Aktiv.: 2.52 Kraj: Ljubljana
|
Objavljeno: Pet Nov 29, 2013 9:41 pm Naslov sporočila: |
|
|
Grega,
menim da še vedno ne bo v redu.
Gorijo segmenti ki nebi smeli:
Citiram: |
If K = 0 Then 'Ker K hkrati ne more imeti 4 vrednosti, je bolje delati "elseif": tako se naslednji stavki sploh ne izvedejo,
Set Portb.3 'če je npr. pravilen že prvi pogoj.
Portd = Lookup(des1 , Stevilke)
Elseif K = 1 Then
Set Portb.2 'TU JE TREBA POSTAVITI PORTB.3=0 (tudi ostale)
Portd = Lookup(eni1 , Stevilke)
Elseif K = 2 Then
Set Portb.1
Portd = Lookup(des , Stevilke)
Elseif K = 3 Then
Set Portb.0
Portd = Lookup(eni , Stevilke)
End If |
Ukaz Set Portb.x bi jaz zamenjal z
portb=&B00000001 ' &B00000010, 00000100, 00001000
V prejšnji kodi portb.x spremeni vrednost na 0 samo ko prešteje vse cikle, ko je K=0.
|
|
Nazaj na vrh |
|
|
linel Član
Pridružen-a: Čet 06 Mar 2008 21:14 Prispevkov: 178 Aktiv.: 0.91 Kraj: prekmurje
|
Objavljeno: Sob Nov 30, 2013 10:32 am Naslov sporočila: |
|
|
mucek, mislim da z tem tvojim programom je tudi nekaj narobe. Vezava je sigurno dobra ker z mojim programom ne gorijo segmenti ki nebi smeli šteje pa normalno ( razen občasno mu nekja pride in je vse na 0).
Jedro oz. pomagalo mojega programa je pa vaja6 pri 7 seg prikazovalnikih, ki ste jih uporabljali na bascom začetnem seminarju ( leto 2008 ali 2009) prosim če pogledaš. tam je tudi računanje in vse v prekinitveni rutini..
Vlado, sem tudi to probal, nič boljše..
|
|
Nazaj na vrh |
|
|
Vlado Član
Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 561 Aktiv.: 2.52 Kraj: Ljubljana
|
Objavljeno: Sob Nov 30, 2013 11:32 am Naslov sporočila: |
|
|
Zakaj ti je tako težko pripeti načrt? Pripni tudi primer po katerem si delal in svoj celoten program. Ugibati je težko.
Preden postaviš novo vrednost na Portd moraš ugasniti vse segmente, postaviš Porb.x (ampak samo tega katerega rabiš, ostali morajo biti izklopljeni) in potem postaviš vrednost za Portd (vrednost za prikaz). Potem ti ne bodo prižgani segmenti ki nebi smeli biti.
|
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.03 Kraj: Dragomer
|
Objavljeno: Sob Nov 30, 2013 11:38 am Naslov sporočila: |
|
|
Vlado je napisal/a: |
Ukaz Set Portb.x bi jaz zamenjal z
portb=&B00000001
|
Ukaz
ni adekvaten ukazu
temveč morda le ukazu
Koda: |
portb = portb or &B00000001 |
Ta, ta drugi ukaz postavi vse bite na 0 le bit 0 postavi na 1.
Treba bo vedeti, kaj programer hoče in izbrati pravega od dveh.
|
|
Nazaj na vrh |
|
|
linel Član
Pridružen-a: Čet 06 Mar 2008 21:14 Prispevkov: 178 Aktiv.: 0.91 Kraj: prekmurje
|
Objavljeno: Sob Nov 30, 2013 12:12 pm Naslov sporočila: |
|
|
prilagam shemo vezja, ter program z katerim sem si pomagal,in še moja koda ( sem še probal z kristalom 8mhz)
še video z delovanjem mojega programa, na koncu sem postavil vrednosti na nič sam z tipko.
video semaforja z mojim programom
p.s.: vezje imam sicer v kovinskem ohišju, ki je ozemljeno. ko je vezje izven ohišja ( na mizi) se resetira manj krat. je možno da kaj motijo napajalne žice 230V AC ?
Opis: |
|
Download |
Ime datoteke: |
7_seg_pink_ponk_stevec.rar |
Velikost datoteke: |
26.52 KB |
Downloadano: |
4 krat |
Opis: |
|
Download |
Ime datoteke: |
vaja6.rar |
Velikost datoteke: |
1.22 KB |
Downloadano: |
2 krat |
Opis: |
|
Download |
Ime datoteke: |
stetje_z_tipko_koncano_atmega8.rar |
Velikost datoteke: |
868 Bytov |
Downloadano: |
3 krat |
|
|
Nazaj na vrh |
|
|
linel Član
Pridružen-a: Čet 06 Mar 2008 21:14 Prispevkov: 178 Aktiv.: 0.91 Kraj: prekmurje
|
Objavljeno: Ned Dec 01, 2013 7:18 pm Naslov sporočila: |
|
|
Zanima me, če lahko preberem vrednost registra za nazaj (so kake nastavitve da se vrednost tega registra kje shranijo ob resetu?) , če izklopim napajanje. Namreč, mikrokontroler bi moral fizično izvlečti iz podnožja na vezju in ga dati v razvojno ploščo, da bi potem lahko prebral vrednost registra MCUCSR, preko uarta.
Sedaj sprobavan na razvojni plošči z drugim mc branje registra MCUCSR.
koda za branje je pa taka:
Koda: |
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 19200
$hwstack = 32
$swstack = 8
$framesize = 24
Dim R As Byte
R = Mcucsr
Do
Print Bin(r)
Waitms 300
Loop
|
Ko sprogramiram čip in se program začne izvajat, dobim vrednost registra 00000111, kar je vredu (mislim da), ker watch dog timer (četrti bit) imam izklopljen , če pa izklopim napajanje in vklopim nazaj, se pa pojavi vrednost 00000101, data sheet pravi da pride do zunanjega reseta.
Če pa dam reset pin na gnd da bi resetiral mc, se samo ustavi izvajanje mc, vrednost registra mcucsr pa je ob delovanju dalje 00000111.
ali vredu izvjam branje registra ali bi moral kako drugače?
|
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.65
|
Objavljeno: Ned Dec 01, 2013 7:59 pm Naslov sporočila: |
|
|
datasheet je napisal/a: |
To make use of the Reset Flags to identify a reset condition, the user should read and then reset the MCUCSR as early as possible in the program. If the register is cleared before another reset occurs, the source of the reset can be found by examining the Reset Flags. |
Sem ti rekel, da pozorno preberi.
_________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
linel Član
Pridružen-a: Čet 06 Mar 2008 21:14 Prispevkov: 178 Aktiv.: 0.91 Kraj: prekmurje
|
Objavljeno: Ned Dec 01, 2013 8:55 pm Naslov sporočila: |
|
|
Se pravi da preberemo register, ter takoj za tem ga resetiramo? če sem prav razumel (da vidimo pri katerem bitu je prišlo do spremembe? sem na dobri poti ali streljam mimo?
Koda: |
Dim R As Byte
R = Mcucsr
Do
Print Bin(r)
Waitms 300
Reset Mcucsr
Loop |
|
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 76 dni
Powered by phpBB © 2001, 2005 phpBB Group
|