www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Prenos bitov z enega porta na drugega - assembler

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
mujo
Član
Član



Pridružen-a: Ned 02 Jan 2005 19:24
Prispevkov: 746
Aktiv.: 3.15
Kraj: MB

PrispevekObjavljeno: Ned Jan 08, 2006 1:22 pm    Naslov sporočila:  Prenos bitov z enega porta na drugega - assembler Odgovori s citatom

Zanima me ce sem spodnjo kodo napisal pravilno. Sem totalen začetnik v programiranju v assemblerju in delanju z PIC-i.

Koda:

;------------------------------------------
;8bit podatek z PORTB prenesi na PORTC
;Uporabljen mikrokontroler: PIC 16F877
;
;Avtor: 08.01.06
;-----------------------------------------

        list p=16f877   ;kompajleru povemo kateri uC imamo
        #include "16f877.inc"

        org 0   ;naslednji ukaz sodi v prvo lokacijo
        goto GLAVNI     ;gremo v glavni program

GLAVNI
        banksel TRISB   ;premaknemo se v bank1
        movlw 0xff      ;v working register damo vrenost 255
        movwf TRISB     ;iz working registra skopiramo vrednost 255 -> kar pomeni da je port TRISB nastavljen za branje
        clrf TRISC      ;v PORTC pisemo - torej more imeti register TRISC vrednost 0
        banksel PORTB   ;iz bank1 v bank0
        movf PORTB,0    ;vsebino PORTB prenesemo v working register
        movwf PORTC     ;vsebino working registra prenesemo na PORTC
end



Nazadnje urejal/a mujo Pon Maj 02, 2022 3:26 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Ned Jan 08, 2006 1:30 pm    Naslov sporočila:   Odgovori s citatom

Koda:
        list p=16f877   ;kompajleru povemo kateri uC imamo
        #include "16f877.inc"

        org 0   ;naslednji ukaz sodi v prvo lokacijo
        goto GLAVNI     ;gremo v glavni program

GLAVNI
;         banksel TRISB   ;premaknemo se v bank1
        bsf STATUS,RP0      ;s to instrukcijo menjaš bank
        movlw 0xff      ;v working register damo vrenost 255
        movwf TRISB     ;iz working registra skopiramo vrednost 255 -> kar pomeni da je port TRISB nastavljen za branje

        clrf TRISC      ;v PORTC pisemo - torej more imeti register TRISC vrednost 0
;        banksel PORTB   ;iz bank1 v bank0
        bcf STATUS,RP0
        movf PORTB,0    ;vsebino PORTB prenesemo v working register
        movwf PORTC     ;vsebino working registra prenesemo na PORTC
end


Tako bi delalo. Banke menjaš v STATUS registru.

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mujo
Član
Član



Pridružen-a: Ned 02 Jan 2005 19:24
Prispevkov: 746
Aktiv.: 3.15
Kraj: MB

PrispevekObjavljeno: Ned Jan 08, 2006 1:37 pm    Naslov sporočila:   Odgovori s citatom

Aha, to mi je jasno.
V literaturi (neko gradivo z univerze (mislim da mariborske)), sem zasledil da je mozno izbiranj preko macroja banksel.

Najlepša hvala za pomoč
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Ned Jan 08, 2006 1:44 pm    Naslov sporočila:   Odgovori s citatom

Drži,

Lahko bi na začetku programa definiral

#define BANK1 bsf STATUS,RP0
#define BANK0 bcf STATUS,RP0


v programu pa bi le napisal:
BANK1

prevajalnik pa zamenja to z :
bsf STATATUS,RP0

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
snow
Član
Član



Pridružen-a: Tor 27 Dec 2005 14:02
Prispevkov: 341
Aktiv.: 1.44
Kraj: Ljubljana || Velenje

PrispevekObjavljeno: Ned Jan 08, 2006 6:01 pm    Naslov sporočila:   Odgovori s citatom

BANKSEL TRISA ;gre na bank1 oziroma tja kjer je TRISA
CLRF TRISA
BANKSEL PORTA ;gre na bank0 oziroma tja kjer je PORTA
....
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Ned Jan 08, 2006 9:52 pm    Naslov sporočila:   Odgovori s citatom

Očitno prevajalnik pozna tudi to okrajšavo, če prav je sam nisem nikoli uporabljal.


Directive Summary.pdf
 Opis:

Download
 Ime datoteke:  Directive Summary.pdf
 Velikost datoteke:  31.03 KB
 Downloadano:  11 krat


_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mujo
Član
Član



Pridružen-a: Ned 02 Jan 2005 19:24
Prispevkov: 746
Aktiv.: 3.15
Kraj: MB

PrispevekObjavljeno: Tor Jan 17, 2006 3:43 pm    Naslov sporočila:   Odgovori s citatom

Ok prenos 8 bitnega števila je bil uspešen.
Sedaj pa me zanima kako je z prenosom prvih štirov bitov?

Sam sem ražmislal da bi working registru prek bcf zadnje štiri bite pac nastavil na 0. Vendar mi nekako ni delovalo - sploh ni upostevalo bcf ukazov. Je sploh mozno spreminjat vrednost w registra preko bcf in bfs ukazov?
Drugo rešitev pa sem naredil da sem pac TRISB (port z katerega berem) nastavil na b'00001111' - torej da bere iz zadnjih 4 bitov. Kaj se pa zgodi ce so npr na pinu RB7 (ki je definiran kot izhod) bila napetost 5V (torej logicna 1?)?

Lp, Matjaž
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Jan 17, 2006 6:34 pm    Naslov sporočila:   Odgovori s citatom

Glede vprašanja nisi bil dovolj jasen oz. sam ga nisem razumel najbolje.
Poskusimo s primerom:



Koda:

;recimo želimo prenesti gornje 4 bite s portab na port c s tem da mora na portuc
;ostati stanje nespremnenjeno (vrednosti bom pisal binarno, ker bo bolj razumljivo
;recimo portb so definirani vhodi s stanjem b'10101010'
;portc so izhodi s stanjem b'11000011'
        movlw '11110000'           ;vrednost v W registu
        andwf PORTB,W              ;nova vrednost v W registru je b'10100000'
        movwf TMP                     ;rezultat shranem v nek začasen register
        movlw b'1111'
        andwf PORTC,W              ;v W registru imamo stanje spodjih bitov, ki jih moramo  ohraniti  torej    W= b'11'
         iorwf TMP,W                   ;"Inclusive OR W with f"  W je sedaj b'10100011'
         movwf PORTC                ;vrednost pošljemo na port



P.S.
To je ena iz med mnogih rešitev.

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mujo
Član
Član



Pridružen-a: Ned 02 Jan 2005 19:24
Prispevkov: 746
Aktiv.: 3.15
Kraj: MB

PrispevekObjavljeno: Tor Jan 17, 2006 7:29 pm    Naslov sporočila:   Odgovori s citatom

eee Silvo! Hvala lepa za ta primer! Si mi odprl še en del logike za programiranje v assemblerju. Moj problem je da mislim preveč visoko (sem pač navajen na visoke programske jezike).

Drugo vprasanje katero imam (prej si rekel da ga nisi razumel - ga bom zdaj probal bolj po domače obrazložit).

TRISC je nastavljen na 0x00 - torej se vseh 8 pinov obnaša kot izhod. Kaj se zgodi če pride na kakteri izmed teh pinov napajalna napetost?

edit: odprava napake


Nazadnje urejal/a mujo Tor Jan 17, 2006 8:05 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Jan 17, 2006 7:40 pm    Naslov sporočila:   Odgovori s citatom

mujo je napisal/a:

TRISC je nastavljen na 0x00 - torej se vseh 8 pinov obnaša kot izhod. Kaj se zgodi če pride na kakteri izmed teh pinov napajalna napetost?


Izhodi so pri picih izgleda kar solidno zaščiteni. V svoji praksi sem jih skuril zelo malo. V opisanem primeru - recimo, da je bil na izhodu stik med dvema izhodoma, pri katerim je eden "vlekel" gor drugi dol, se običajno ni zgodilo nič. Le aplikacija se je čudno obnašala - očitno je prihajalo tudi do motenja programa. Pic pa je "preživel". Enako tudi običajno pri stiku izhoda z Vss oz. Vdd. Izhod pa je "podlegel" če je na njega prišla večja napetost od Vdd.

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Tor Jan 17, 2006 7:42 pm    Naslov sporočila:   Odgovori s citatom

Meni se v navedenem primeru ponavadi PIC resetira, saj ga v večini primerov furam kar z baterijami...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
mujo
Član
Član



Pridružen-a: Ned 02 Jan 2005 19:24
Prispevkov: 746
Aktiv.: 3.15
Kraj: MB

PrispevekObjavljeno: Tor Jan 17, 2006 8:07 pm    Naslov sporočila:   Odgovori s citatom

Najlepša hvala za izčrpne odgovore!
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
bobo01
Neznanec
Neznanec



Pridružen-a: Sob 20 Jan 2007 12:31
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Ned Jan 21, 2007 1:48 pm    Naslov sporočila:   Odgovori s citatom

Na izhodu v seriji priključiš 100E upor, in šele nato priklučiš perifeijo. Karkoli se bo zgodilo, neboš imel problemov (samo v TTL !!!) , razen če dobiš na izhod večje napetostne nivoje (špice iz omrežja, napaka pri priklopu npr. 30V ....) boš izhod sigurno uničil! Podobno je pri vhodih!!!

Poskrbi za stabilizacijo napajalnih napatost (Kar ste v šoli sigurno jemali!), kompenziraj morebitne motnje v napajanju (inducirana napetost na vezju, manjše špice v napajanju, ...) tik ob napajalnih sponkah procesorja in seveda točno se seznani z tem kaj delaš (ka ne zabluzeš kaj)!

bobo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Ned Jan 21, 2007 4:08 pm    Naslov sporočila:   Odgovori s citatom

Od kod si ti to temo povlekel... Very Happy T-1year
_________________
Lp,
Matevž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
mujo
Član
Član



Pridružen-a: Ned 02 Jan 2005 19:24
Prispevkov: 746
Aktiv.: 3.15
Kraj: MB

PrispevekObjavljeno: Ned Jan 21, 2007 5:40 pm    Naslov sporočila:   Odgovori s citatom

uh več kot eno leto stara tema...
Koliko se spomnim smo stvar morali samo teoretično in programsko rešit. Tako da hardwerskih problemov nismo imeli :>
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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: 491 dni


Powered by phpBB © 2001, 2005 phpBB Group