 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3360 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Ned Sep 14, 2008 12:26 pm Naslov sporočila: Obnašanje Porta A na AVR-jih |
|
|
I/O Porte uporabljam samo kot I/O porte, no morda včasih za interrupt, no in seveda rxd/txd za komunikacijo.
Te dni pa sem naletel na vsaj zame nenavadno obnašanje porta A.
En pin porta A vežem s tipko na maso, in z led diodo in preduporom na plus.
Tako ima port dvojno funkcijo, prikazuje z ledico neko stanje, in odtipavam tipko, s katero krmilim program. To počnem tako:
Koda: |
do
...
Debounce Tipka , 0 , Tipkasr , Sub 'vsebuje config pin = input
Config Ledica = Output ' pretaknem spet na output
Ledica = Cetrtsek.2 ' in dam spet signal na ledico
' Tipka le isti pin, kot je ledica port recimo pina.0 in porta.0
...
loop
|
Ker v programu uporabljam tudi Timer0, me je presenetilo, to, da zadeva popolnoma v redu dela, če delam to na pinu port-a B, če pa delam na pinu porta A pa opažam, da močno zavre delo timerja 0.
Verjetno tako, da nekaj časa onemogoči interrupte.
Ker mi je zadeva popolnoma nejasna, sprašujem, ali morda kdo od vas ve, kaj je na tem.
_________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.93 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Ned Sep 14, 2008 12:51 pm Naslov sporočila: |
|
|
Še en primer, zakaj nisem pristaš raznih Bas* PortA nima nobene veze z TO
Prav tako na delovanje časovnika ne sme vplivati noben interupt. A je možno program videti tudi v assemblerski kodi. Potem bi lahko točno analizirali nastalo težavo.
PS.
Sedaj sedaj nimam časa (grem v službo) Bom jutri teh nekaj vrstic za test napisal v assemblerju.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.93 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Sep 16, 2008 11:46 pm Naslov sporočila: |
|
|
Silvo je napisal/a: |
PS.
Sedaj sedaj nimam časa (grem v službo) Bom jutri teh nekaj vrstic za test napisal v assemblerju. |
Zdaleje sem se spomnil - ravno sem dal 2313 na testno ploščo.
Evo na hitro napisano.
Vilko, lahko poskusiš. Vzel sem 3 led diode vezane preko upora na +. Ena je na RA0 druga je na RD2 tretja je na RD4. Tipka1 med RD3 ter RA0 Tipka2 med RD3 ter RDRD4.
Vezava kot si jo omenil ti (En pin porta A vežem s tipko na maso, in z led diodo in preduporom na plus.) Kajti, če je pin definiran kot izhod ter je na njem visoko stanje boš v trenutku ko tipko stisneš naredil kratek stik. Rešitev je, da daš tudi s tipko upor - v tem primeru se bo led dioda prižgala - oziroma storiš kot sem to storil sam. Ko pin na katerem je led definiram kot vhod takrat pin, ki je skupni konec tipke definiram kot nizek izhod. Preverem stanje skupni pin definiram kot vhod ter pine na katerih so led diode kot izhod.
Kaj napisano počne.
Ena ledica intervalno utripa. (test Timer0 prekinitve)
Z tipkama pa se lahko vključuje/izključuje led dioda ki je vezana na isti pin kot tpka.
Koda: |
;------------------------------------
;testni program pin kot vhod/izhod
;Timer0 prekinitev
;------------------------------------
.include "tn2313def.inc"
.def TipkaA=r2
.def TipkaD=r3
.org 0x0
rjmp GlProg
.org 0x06
rjmp T0Prek
.org 0x13
GlProg:
ldi r16,low(RAMEND)
out SPL,r16
sbi DDRA,0 ;port RA0 izhod
ldi r16,0b10100
out DDRD,r16 ;port RD4,RD2 izhod
sbi PORTD,4 ;prižgem led na RD4
cbi PORTA,0 ;prižgem led na RA0
ldi r16,0b10
out TIMSK,r16 ;vklop owerflow prekinitve
ldi r16,0b11
out TCCR0B,r16 ;preddelilnik 1/64
sei ;vklop prekinitev
Zanka:
sbrc TipkaA,0 ;je tipka na RA0 stisnjena?
rjmp Tipka2 ;ne preverjam tipko na RD7
sbis Porta,0 ;led na RA0 Izključen? (visoko stanje na pinu)
rjmp LedA_off ;ne
cbi PORTA,0 ;da zato ga vključim
rjmp Konec
LedA_off:
sbi PORTA,0
Konec:
sbrs TipkaA,0 ;čakam, da se tipka spusti
rjmp PC-1
rjmp Zanka ;nazaj na zanko
Tipka2:
sbrc TipkaD,4
rjmp Zanka
sbis PORTD,4
rjmp LedD_off
cbi PORTD,4
rjmp Konec2
LedD_off:
sbi PORTD,4
Konec2:
sbrs TipkaD,4
rjmp PC-1
rjmp Zanka
;--------------------------------
;timer0 overflow prekinitev
;--------------------------------
T0Prek:
;branje tipk na pinih RA0 ter RD4 kateri
;so istočano izhodi
cbi DDRA,0 ;RA0 je vhod
cbi DDRD,4 ;RB0 je vhod
cbi PORTD,3 ;nizko stanje skupnega pina za tipke
sbi DDRD,3 ;skupni pin vklučim kot izhod
nop
nop ;počakam da se stanje na pinih stabilizira
in TipkaA,Pina
in TipkaD,Pind
cbi DDRD,3 ;izklop skupnega pina tipk
sbi DDRA,0 ;vrnem pine kot izhode
sbi DDRD,4 ;
;utripanje ledice na portu RB2
dec r17
breq Naprej
reti
Naprej:
sbic PORTD,2
rjmp PinOff
sbi PORTD,2
reti
PinOff:
cbi PORTD,2
reti
|
Opis: |
|
 Download |
Ime datoteke: |
vilko.zip |
Velikost datoteke: |
6.33 KB |
Downloadano: |
2 krat |
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3360 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Tor Sep 16, 2008 11:56 pm Naslov sporočila: tipka/ledica |
|
|
[quote="Silvo"]
Silvo je napisal/a: |
[size=10]PS.
Vezava kot si jo omenil ti (En pin porta A vežem s tipko na maso, in z led diodo in preduporom na plus.) Kajti, če je pin definiran kot izhod ter je na njem visoko stanje boš v trenutku ko tipko stisneš naredil kratek stik.
[/code] |
To je res, a očitno take kratkočasne kratke stike, saj tipke ne držiš pretežno dol, mikroprocesor dopušča. Bom pa res dal drugič tipki zaporedno upor, da ga ne izzivam preveč.
Kaj si mi hotel povedat, ne razumem preveč. Ker sem imel pin porta b prost, sedaj uporabljam za tipko/ledico portb in dela kot treba, ne zavira interruptov in timerja.
Kolikor sem skušal razumeti assemblerske ukaze, ki si jih pripel, si ravnotako uporabil timer in testiraš pritisk na tipko. Kaj si dosegel? Ti timer teče v redu ne glede na katerem portu imaš tipko/ledico?
Mimogrede, imam nek disassembler, ki ga pa ne znam uporabljati, nič mi ne naredi. Imaš kak namig, kak disassembler in assembler uporabiti? Jaz sem pri 8051 si često pomagal, da sem razumel, kako to dela, da sem del program disassembliral in potem študiral listo assemblerskih ukazov. A imel sem orodje, ki sem ga znal uporabiti. Pri avr-u ga nimam.
_________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.93 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sre Sep 17, 2008 12:14 am Naslov sporočila: |
|
|
Citiram: |
Kaj si mi hotel povedat, ne razumem preveč. |
Zgoraj si omenil:
Citiram: |
če delam to na pinu port-a B, če pa delam na pinu porta A pa opažam, da močno zavre delo timerja 0...] |
Hotel sem ti povedati, da timer nima nobene veze z pini ter neovirano teče ne glede na to, kaj se dogaja s pini - so vhodi izhodi nizki visoki... Delovanje timerja ponazarja utripajoča led.
V tvojem primeru očitno "nekaj" uporablja timer?
Branje tipk je v assemblerji možno izvesti na x načinov. V gornjem primeru se ob prekinitvi T0 izvaja branje tipk rezultat se shrane v dva registra. Stanje pa se preverja izven prekinitvene rutine.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3360 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sre Sep 17, 2008 8:39 am Naslov sporočila: |
|
|
Silvo je napisal/a: |
V tvojem primeru očitno "nekaj" uporablja timer?
|
Ali pa onemogoča prekinitve, in potem timerinterrupt nima moči.
Debounce je ukaz, ki poleg tega, da preverja spremembo stanja pina iz 1 na 0, tudi zadrži delovanje toliko časa, da odskakovanje tipke mine, načeloma 25ms, a ta zakanistvena zanka bi se morala v obeh slučajih odvijati v glavnem programu brez tega, da zavre delo interrupt rutine.
Kot že rečeno: Jaz če ne morem skozi zid, grem okoli njega. In to sem storil.
Če te prav razumem, si ti to isto naredil v assemblerju na pinu porta a, tako utripanje ledice, kot odtipavanje tipke na istem pinu porta A in nisi opazil zakasnitve timerja. Potem je stvar definitivno skrita nekje v bascomu.
Hvala.
_________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.93 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sre Sep 17, 2008 1:22 pm Naslov sporočila: |
|
|
Citiram: |
Če te prav razumem, si ti to isto naredil v assemblerju na pinu porta a, tako utripanje ledice, kot odtipavanje tipke na istem pinu porta A in nisi opazil zakasnitve timerja. Potem je stvar definitivno skrita nekje v bascomu. |
Stvar je definitvno skrita v višjenivojskem jeziku. Dvomim sicer, da bi avtor za zakasnitev za tako enostavno (nepomembno) stvar, katero spišeš dve assemblerski vrstici uporabil kak hardwerski timer ter s tem onemogočil "velik kos" vgrajene periferije za kako drugo pomembnejšo rabo. Še manj pa, da bi izključeval morebitno vključene prekinitve. Malo sumim, da tisti kratek stik v tvoji varianti povzroča reset procesorja. (poskusi tisto izvesti drugače - z uporom oz kot sem to sam opisal zgoraj)
Vsekakor pa bi bilo zanimivo videt assemblersko kodo.
_________________ lp
Silvo |
|
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: 494 dni
Powered by phpBB © 2001, 2005 phpBB Group
|