PIC Assembly fråga ***NYA FRÅGOR****
PIC Assembly fråga ***NYA FRÅGOR****
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
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
Senast redigerad av jonkers 25 november 2004, 14:32:40, redigerad totalt 1 gång.
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
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
Snarare såhär:
eller såhär:
Eventuella fel skyller jag på trötthet.
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
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
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
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
Senast redigerad av jonkers 4 november 2004, 21:50:52, redigerad totalt 1 gång.
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
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
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
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.
jag upptäckte att ClasseMan´s andra (då felaktiga) algoritm är precis det jag vill uppnå i första steget nu

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.
Det är samma sak som "open collector" fast eftarsom man inte använder bipolära transistorer så blir det 'drain'.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
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.