Hejsan.
Jag håller på med ett program till en 8515, men har kört fast på en funktion.
Det är så att jag har ett binärt tal på fyra bitar till fyra ingångar på kretsen. Dessa fyra bitar vill jag koda av till ett decimalt tal men jag vill också ha en minnesfunktion till detta.
Pseudokoden ser alltså ut så här:
1. Koda av de fyra bitarna till decimalt tal. Om avkodningen gav en femma ska talet bli så här 00010000
2. Det tal som redan finns på utgångarna laddas i registret och xnoras sedan med det tal som avkodningen gav d.v.s 00010000.
3. Produkten läggs på portarna.
Detta bör ge den funktion jag är ute efter och jag vet hur man xnorar(!) talen med kommandot EOR. Jag vet dock inte hur man kodar av de fyra binära bitarna till ett decimalt tal. Hur löser jag det?
Demultiplexfunktion i avr
Har aldrig programerat i assembler på AVR antar att det är det du gör.
Men det måste väl finnas ett kommando för att läsa in hela porten i asm också. Sedan tar du bara och andar med dom bitarna du använder tex.
om du använder port 0,1,2,3 så får du 00001111 ( ettorna dom du använder )
och då det du får in ANDar du med 00001111 ( 0x0F) så får du ett decimalt tal, lite jobbigare om du inte har bitarna i början av porten då får du bit förflytta talet efteråt ingen aning om hur du gör det i asm heller. ( du skall helst lägga inportarna tillsammans och inte sprida ut dom tex varannan bit är nog jobbigt att göra en bra lösning på )
Sedan så fattar jag inte riktigt hur du får 5 till 0001000 tänker du att femte biten skall vara hög ? i så fall får du bit förflytta en etta så många gånger som du har fått ut från AND operationen
Tror inte jag fattar din fråga riktigt.
Men det måste väl finnas ett kommando för att läsa in hela porten i asm också. Sedan tar du bara och andar med dom bitarna du använder tex.
om du använder port 0,1,2,3 så får du 00001111 ( ettorna dom du använder )
och då det du får in ANDar du med 00001111 ( 0x0F) så får du ett decimalt tal, lite jobbigare om du inte har bitarna i början av porten då får du bit förflytta talet efteråt ingen aning om hur du gör det i asm heller. ( du skall helst lägga inportarna tillsammans och inte sprida ut dom tex varannan bit är nog jobbigt att göra en bra lösning på )
Sedan så fattar jag inte riktigt hur du får 5 till 0001000 tänker du att femte biten skall vara hög ? i så fall får du bit förflytta en etta så många gånger som du har fått ut från AND operationen
Tror inte jag fattar din fråga riktigt.
Vet inte om jag missupfattat dig, men vad ska hända om talet är större än 8, ska det lagras i två byte då eller?
Så här kan man tex göra eller så roterar du ett register (rol) lika många gånger som svaret ska bli, som nedo skrev:
.def temp = r16
.def resultat = r0
ldi temp,255
out DDRB,temp
multiplex:
ldi ZL,LOW(decimalt*2)
ldi ZH,HIGH(decimalt*2)
in temp,PINA
add ZL,temp
clr temp
adc ZH,temp
lpm
out PORTB,resultat
rjmp multiplex
decimalt:
.db 0b00000000,0b00000001
.db 0b00000010,0b00000100
.db 0b00001000,0b00010000
.db 0b00100000,0b01000000
.db 0b10000000,0
Så här kan man tex göra eller så roterar du ett register (rol) lika många gånger som svaret ska bli, som nedo skrev:
.def temp = r16
.def resultat = r0
ldi temp,255
out DDRB,temp
multiplex:
ldi ZL,LOW(decimalt*2)
ldi ZH,HIGH(decimalt*2)
in temp,PINA
add ZL,temp
clr temp
adc ZH,temp
lpm
out PORTB,resultat
rjmp multiplex
decimalt:
.db 0b00000000,0b00000001
.db 0b00000010,0b00000100
.db 0b00001000,0b00010000
.db 0b00100000,0b01000000
.db 0b10000000,0