Hallo allemaal,

weer een klein project van mijn kant waar ik weer niet uitkom.
Op de een of andere manier weigerd mijn AVR2313 om de data die ik aanbied op port D te kopieren naar port B.

De schakeling is super simpel, op port D staan schakelaars die de port aan de +5V of aan de massa hangen, aan port B hangen ledjes.
Als ik FF naar port B stuur gaan alle ledjes branden, dus dat werkt.
Ik heb de onderstaande paar regels als programma.

.nolist
.include 2313def.inc
.list
ldi r16,0x00
out ddrb,r16 ;port b is uitgang
ldi r16,0xff
out ddrd,r16 ;port d is ingange

lus: in r16,portd ;lees port d -> r16
out portb,r16 ;schrijf r16 -> port b
rjmp lus ;en nog een keer

heeft er iemand een idee wat ik hier over het hoofd zie?

alvast bedankt.

Ronald

Je doet het net verkeerdom!

ldi r16,0xff
out ddrd,r16 ;port d is ingange

Dat moet dus ldi r16, 0x00 zijn en andersom!!!

EDIT: Dat de LEDs wel aan en uit gaan komt doordat je de pullups aan het schakelen bent van de ingang.

Je hebt trouwens kans dat je nu PORTD hebt opgeblazen! Je hebt ze als uitgang gezet en daar met schakelaars hard een waarde opgezet. Het veiligste is altijd een weerstandje te nemen na de schakelaar, dan kan het niet veel kwaad.

[Bericht gewijzigd door Benadski op ]

Er zijn volgens mij 2 fouten :

-De configuratie van de datadirectie registers moet inderdaad omgekeerd zijn

en

lus: in r16,portd ;lees port d -> r16

werkt niet maar wel

lus: in r16,pind ;lees port d -> r16

omdat je met portd het uitgangsregister leest en niet het ingangsregister.

.nolist
.include 2313def.inc
.list

rjmp reset

reset:
ldi temp, RAMEND ;stack space -> end SRAM
out SPL, temp
clr r16
out ddrd,r16 ;port d is input
ser r16
out ddrb,r16 ;port b is output

lus: in r16,PIND ;lees pinnen port d -> r16
out portb,r16 ;schrijf r16 -> port b
rjmp lus ;en nog een keer

Zo zou ie moeten werken. Data op de pinnen van PORTD direct op de pinnen van PORTB.
(verders was de reset er niet en de stack setup)

[Bericht gewijzigd door RES op ]

lang leve C:

PORTB = PORTD;

Oja, er staat nog wel meer fout in... Ik ben niet meer zo goed in asm geloof ik. :P

allereerst iedereen bedankt voor het meedenken.

aan het schakelen met een weerstandje had ik wel gedacht, dus poort D is nog gewoon in leven.
Het probleem zat hm voor al in het lezen van de port met het commando pind, maar das nu ook weer duidelijk en opgelost.

Bedankt