Sida 1 av 1

PIC Assembly fråga ***NYA FRÅGOR****

Postat: 4 november 2004, 17:59:21
av jonkers
Håller på och skriver kod för att snacka med en hitachi 44780-kompatibel LCD och nybörjare som man är så stöter man på patrull ganska snart.

Jag vill sätta in ett värde i minne x, jag vill kopiera HÖGA nibblen i det minnet till PORTB´s LÅGA nibble UTAN att påverka PORTB´s höga nibble, sedan ska lite annat hända, sen vill jag kopiera LÅGA nibblen till PORTB´s LÅGA nibble utan att påverka PORTB´s höga nibble.

Lite knökigt att förklara så jag ska försöka säga det i pseudo-kod.

Så här vill jag att det ska funka:



movlw B'01001010'
movwf x
kopiera x höga nibble till PORTB´s låga nibble på ngt sätt
call göraliteannanskit
kopiera x låga nibble till PORTB´s låga nibble



Hoppas ni förstår vad jag menar och tack på förhand för ev hjälp.

eder-Jonkers

Postat: 4 november 2004, 19:19:40
av ClasseMan
Vet inte om detta är det smartaste sättet men det funkar.


highnib = 11110000
lownib = 00001111

;Här sätter jag den lägre nibblen
movf PORTB, w
andwf highnib, w
movwf temp
movlw b'11111111' ;Detta är talet som skall till portb
andwf lownib,w
iorwf temp,w
movwf PORTB

;och här sätter jag den högre
movf PORTB, w
andwf lownib, w
movwf temp
movlw b'11111111' ;Detta är talet som skall till portb
andwf highnib,w
iorwf temp,w
movwf PORTB

Postat: 4 november 2004, 21:34:04
av Chribbe76
Snarare såhär:

Kod: Markera allt

;och här sätter jag den högre 
movf	PORTB, w 
andlw	b'11110000'
movwf	temp 
swap	data,w ;Detta är talet som skall till portb 
andlw	b'00001111'
iorwf	temp,w 
movwf	PORTB 

;Här sätter jag den lägre nibblen 
movf PORTB, w 
andlw	b'11110000'
movwf	temp 
movf	data,w ;Detta är talet som skall till portb 
andlw	b'00001111'
iorwf	temp,w 
movwf	PORTB 
eller såhär:

Kod: Markera allt

swapf	data,w
iorlw	b'11110000'
andwf	PORTB
andlw	b'00001111'
iorwf	PORTB

movf	data,w
iorlw	b'11110000'
andwf	PORTB
andlw	b'00001111'
iorwf	PORTB
Eventuella fel skyller jag på trötthet.

Postat: 4 november 2004, 21:42:36
av jonkers
ClasseMan>>>>>

Tusen tack för snabbt svar!!!!!

Detta funkar juh bra i simulatorn sånär som på två små detaljer:

Den första kodsnutten gör nästan precis det jag vill, förutom att den tar den låga (vill att det ska vara höga) nibblen utav värdet och sätter i
låga nibblen på PORTB utan att jiddra med den höga nibblen.

Den andra kodsnutten sätter den höga (vill att det ska vara låga)
nibblen i den HÖGA nibblen på PORTB, det blir fel, jag vill alltså att
bara den låga nibblen på PORTB ska påverkas i båda fallen.

Nu har juh jag fått ett recept på hur det ska vara så jag borde kunna
korrigera själv men dels börjar jag bli mjuk i skallen (har kodat sen 09.00
imorse =) ) och dels har jag jävligt svårt för att ta till mig hur andwf, iorwf och dom där funkar.

Jag har plöjt massa om boolean algebra och logiska grindar och förstår
i teorin men tycker det är svårt att använda. Kanske en vanesak.

Jaja, blablabla, nu ska jag gå och lägga mig. =)

eder-jonkers

Postat: 4 november 2004, 21:44:54
av jonkers
Jaha fick ett till svar medans jag skrev mitt svar.

Ska prova din(a) variant(er) Chribbe76


Nu blir det inge sova iallafall =)

Postat: 4 november 2004, 23:02:04
av jonkers
Chribbe76>>>>>

SWEET!!!!

Jag gick rakt på ditt andra alternativ och det funkar som en klocka + att det var väldigt tjusigt.

swapf var en ny instruktion för mig, får plugga på lite

det här är lite annorlunda än att blinka med några LED´s måste jag erkänna =)

nu kan jag sova gott

Postat: 25 november 2004, 14:44:16
av jonkers
jaha så nu har jag alltså kommit längre i projektet och vill styra LCD´n
seriellt från datorn (via picen då)

i och med att jag använder en PIC16F628A så märker jag nu att jag har
begått ett smärre misstag när jag använder lägre nibblen på portB
som styrning till LCD´n för där finns juh USARTens RX och TX pinnar.

jag försöker verkligen klura ut det här själv men jag hittar inte riktigt
tråden i det hela och otålig som jag är måste jag ta hjälp av er igen....

jag använder då chribbe76´s lösning för att trixa med nibblarna (se första frågan)

swapf data,w
iorlw b'11110000'
andwf PORTB
andlw b'00001111'
iorwf PORTB

movf data,w
iorlw b'11110000'
andwf PORTB
andlw b'00001111'
iorwf PORTB

nu är det så att jag har bestämt mig för att använda HÖGA nibblen på PORTB som styrning så jag vill att allt ska dit istället för låga nibblen som det är nu. (läs hela tråden för att fatta vad jag snackar om).

jag har som sagt provat lite men får inte ihop det.......

chribbe76...... någon...... help me

när jag ändå har er uppmärksamhet så kan ni väll förklara vad open drain (pinne RA4) är för ngt


eder - jonkers

Postat: 25 november 2004, 15:29:46
av jonkers
med risk för att göra hela den här tråden till en monolog från min sida så måste jag bara köra en update:

jag upptäckte att ClasseMan´s andra (då felaktiga) algoritm är precis det jag vill uppnå i första steget nu 8)

så jag kör på:

movf PORTB,W
andwf LOWNIB,W
movwf TEMP
movf LCDMEM,W
andwf HIGHNIB,W
iorwf TEMP,W
movwf PORTB

= LCDMEM höga nibble till PORTB höga nibble



sen gör jag (observera swapf i början):

swapf LCDMEM,F
movf PORTB,W
andwf LOWNIB,W
movwf TEMP
movf LCDMEM,W
andwf HIGHNIB,W
iorwf TEMP,W
movwf PORTB

= LCDMEM låga nibble till PORTB höga nibble???????????


eller?

borde funka tycker jag.

Postat: 25 november 2004, 15:33:15
av ClasseMan
Annars kan du nog bara ändra Chribbe76 kod till detta


movf data,w
iorlw b'00001111'
andwf PORTB
andlw b'11110000'
iorwf PORTB

swapf data,w
iorlw b'00001111'
andwf PORTB
andlw b'11110000'
iorwf PORTB

Postat: 25 november 2004, 16:50:13
av Xyzzy
jonkers skrev:när jag ändå har er uppmärksamhet så kan ni väll förklara vad open drain (pinne RA4) är för ngt
Det är samma sak som "open collector" fast eftarsom man inte använder bipolära transistorer så blir det 'drain'.
Porten kan alltså bara "dra ner" signalen mot GND, ej upp till VCC, du behöver därför ett sk. pulluppmotstånd (antagligen finns det inbyggt i PICen)
-Detta behöver du bara bry dig om då du använder pinnen som UTGÅNG.