Stránka 1 z 1
assembler
Napsal: 04 úno 2007, 10:22
od xp
mám pár problémù:
1.AS51 mi nechce pøeložit "port equ p1", akorat píše syntax error; ale ASM51 to zase pøeloží bezproblému, mùžete mi nìkdo øíct v èem je problém?
2.jak se dá pøistupovat k jednotlivým bitum v bitovì adresovatelném protoru? nechci to pøes indexi jako(20h.1), ale místo jednièky promìnou
Kód: Vybrat vše
BUFFER EQU 20H
xBIT EQU 30H
MOV xBIT,#1
SETB BUFFER.#xBIT
Napsal: 04 úno 2007, 16:00
od alles
port equ p1 je nesmysl equ muzes pouzit pro 1 adresu treba port equ p1.1, ted to pouzivas pro 8 bitu
Napsal: 04 úno 2007, 19:44
od Aqarel
nemá tam být při pojmenování bitů bit místo equ, protože s equ to hlásí chybu xBit equ p1.1
Napsal: 04 úno 2007, 20:36
od MiLe
1) problem moze byt v tom, ze ten prekladac nepozna to priradenie (pseudoinstrukciu) pomocou EQU, alebo nepozna co je P0 - skus tam dat ciselnu adresu miesto P0... syntax tychto "pomocnych" instrukcii nemusi byt vzdy uplne rovnaka!
2) definicia BITU:
napr. 6ty bit Bytu na adrese 20h:
meno_bitu BIT 20h6
Za malo
![Smile :)](./images/smilies/icon_smile.gif)
Napsal: 04 úno 2007, 20:41
od MiLe
Alles:
nezavadzaj tu ludi! svoj_nazov EQU P0 je absolutne korektne... EQU sa pouziva s 8bitovou hodnotou coz je 1Byte...
Napsal: 04 úno 2007, 21:08
od Aqarel
zase to hazi syntax error pro xbit bit 20h6; zkusim to naspat ještě trochu jinak co potřebuju, dejme tomu že bajtu bude zastupovat pole o 8 buněk, kde jedna buňka je jako jeden bit, takže pole, kde i je proměná pomocí níž přistupuji k jednotlivym buňkám/bitum podle toho jakou má hodnotu proměná i(0-7), takže potom ve smyčce mužu i zvětšovat o jedna a postupně tak uložit 1/0 v celém poli, snad je to pochopitelný, děkuji za snahu
Napsal: 04 úno 2007, 21:28
od alles
MiLe píše:Alles:
nezavadzaj tu ludi! svoj_nazov EQU P0 je absolutne korektne... EQU sa pouziva s 8bitovou hodnotou coz je 1Byte...
no pardon opravdu to byla nějaka zcestná úvaha
Napsal: 05 úno 2007, 18:23
od Aqarel
v minulym přispěvku jsem zapoměl dodat že pojmenovaní bitu se provadi takto: jmeno bit 20h.1
k ad 2 nikdo neví?
Napsal: 05 úno 2007, 21:30
od ZdenekHQ
Bity se číslují přímo a překladačem se adresují se od 20H, čili příkaz
X BIT 0
je v podstatě 20h.0
A pak už přes SETB X, CLR X
Platí pro ATMEL, nevím, jak je na tom PIC.
Napsal: 06 úno 2007, 20:52
od Aqarel
asi by bylo nejlepší napsat pro co přesně to potřebuju: např. na P3.0 budou vstupní data, odkuď budu bit po bitu postupně ukládat do C a z něho potom budu ukládat ty jednotlivy bity na adresu třeba těch 20h, kde je bitově adresovatelný prostor; no a tady je ten problém buď můžu napsat zbytečně dlouhý program, kde to budu muset vše rozepsat( pro první bit mov 20h.0,c; mov 20h.1,c pro druhy bit a tak dál) nebo napsat mov 20h.x,c
inc x
kde to x by bylo od 0-7 a program by byl mnohem jednoduši, ví někdo jestli to jde takhle realizovat, pokud ano tak jak?
Napsal: 06 úno 2007, 22:18
od MiLe
sorac kamosi aj ja som v prispevku vyzsie spravil chybu!!! Pri definicii bitu ma by tak ako tu uz niekto spravne napisal za hckom este bodka, cize: napr. moj_bit bit 20h.1
Napsal: 07 úno 2007, 14:41
od Aqarel
k ad 2 už jem to vyřešil a nic takovýho nejde, takže mi nezbyde než to rozepsat
Napsal: 07 úno 2007, 15:24
od ZdenekHQ
Něco podobnýho jsem řešil tahle:
začátek programu :
****************
setb Log_1
clr Log_0
a pak už v programu přes mov .
Když bylo potřeba přehodit stavy, jenom se přehodil setb a clr nebo se přímo Log_0 vyrobila negací Log_1.
Napsal: 18 úno 2007, 15:22
od Aqarel
tak jsem to vyřešil tímto způsobem, kdyby někdo věděl jak to zjednodušit nebo vylepšit tak mi to prosím řekněte
čtení a zapis jednotlivych bitu v bajtu, R7 se nastavi na index bitu se kterym se ma pracovat (pro 20h.4, R7=4), takhle nějak jsem si to představoval, akorát se mi to zdá celkem velký
Kód: Vybrat vše
ad0 bit 20h.0
ad1 bit 20h.1
ad2 bit 20h.2
ad3 bit 20h.3
ad4 bit 20h.4
ad5 bit 20h.5
ad6 bit 20h.6
ad7 bit 20h.7
MOV R7,#0 ;posunuti v bitovem poli
;1) ZAPIS:
bitPoleZ:
CJNE R7,#0,bit1 ;postupne se testuje, kterymu bitu odpovida #R7
MOV ad0,C
RET
bit1: CJNE R7,#1,bit2
MOV ad1,C
RET
bit2: CJNE R7,#2,bit3
MOV ad2,C
RET
bit3: CJNE R7,#3,bit4
MOV ad3,C
RET
bit4: CJNE R7,#4,bit5
MOV ad4,C
RET
bit5: CJNE r7,#5,bit6
MOV ad5,C
RET
bit6: CJNE R7,#6,bit7
MOV ad6,C
RET
bit7: CJNE R7,#7,ERROR
MOV ad7,C
RET
ERROR: RET ;pokud hodnota v R7 neodpovidala zadnymu bitu
;2) CTENI:
bitPoleC:
CJNE R7,#0,bit01 ;postupne se testuje, kterymu bitu odpovida #R7
MOV C,ad0
RET
bit01:CJNE R7,#1,bit02
MOV C,ad1
RET
bit02:CJNE R7,#2,bit03
MOV C,ad2
RET
bit03:CJNE R7,#3,bit04
MOV C,ad3
RET
bit04:CJNE R7,#4,bit05
MOV C,ad4
RET
bit05:CJNE r7,#5,bit06
MOV C,ad5
RET
bit06:CJNE R7,#6,bit07
MOV C,ad6
RET
bit07:CJNE R7,#7,ERROR0
MOV C,ad7
RET
ERROR0: RET ;pokud hodnota v R7 neodpovidala zadnymu bitu
Napsal: 18 úno 2007, 17:37
od ZdenekHQ
Zatím nejzásadnější chyba je to , že CJNE ti přepíše C, tudíž MOV ad,c nebude fungovat správně.
Jinak existuje skok na adresu @A+DPTR, takže se dá napsat něco takovýho :
mov a,r7
anl a,#00001111b ;maska, aby to neskakalo dal do programu (0..7)
mov b,#3 ;coz je pocet byte jednoho "bloku"
mul ab
mov dptr,#Blok ;kde zacina blok
mov c,#nejakej_bit
jmp @a+dptr
Blok: ;label
MOV ad0,C ;2 byte
RET ;1 byte
MOV ad1,C
RET
atd...