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 :)

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...