Hallo,
ich verwende in einem Projekt 74ls164p Schieberegister als
Porterweiterung und habe mir die unten gepostete Routine zur Ansteuerung
ausgedacht. In der Simulation im AVR Studio tut sie auch so wie sie
soll, wenn ich sie allerdings in meiner Testschaltung probiere gibt das
Schieberegister entweder nur 8 Low oder nur 8 High aus. Ich verwende
relativ lange Flachbandkabel, vielleicht spinnt der Clock deshalb rum.
Nichtsdestotrotz könnte natürlich auch ein Fehler im Code sein, den ich
nicht sehe.
Danke für die Hilfe!
PS: Beschaltung ist korrekt, habe das manuell ausprobiert, die
Schieberegister tun auch.
CODE:
An Port C habe ich LEDs, hat nichts mit der Funktionalität zu tun. Den
Reset hab ich auf High gelegt. PB5 ist der Eingang des Schieberegisters,
ich habe beide parallel gelegt. PB7 ist CLK. Die Zeitroutine ist da nur
probehalber drin, eigentlich müsste das auch ohne gehn, die
Schieberegister lassen sich ja mit vollen 4mhz des Atmegas ansteuern.
1 | .include "m16def.inc"
|
2 |
|
3 | .def temp = r16
|
4 | .def temp2 = r17
|
5 |
|
6 | ldi temp, 0xFF
|
7 | out DDRC, temp
|
8 | out DDRB, temp
|
9 |
|
10 | ldi temp2, 0x08
|
11 |
|
12 | ldi temp, 0xA0
|
13 |
|
14 | loop: cbi PORTB, 7
|
15 | bst temp,7
|
16 | brts eins
|
17 | cbi PORTB, 5
|
18 | rjmp raus
|
19 |
|
20 | eins: sbi PORTB, 5
|
21 | raus: sbi PORTB, 7
|
22 | rol temp
|
23 | dec temp2
|
24 | brbs 1, retu
|
25 | call zeit
|
26 | call zeit
|
27 | rjmp loop
|
28 | retu: ldi temp, (1<<5)|(1<<7)
|
29 | out PORTB, temp
|
30 | out PORTC, temp
|
31 | rjmp retu
|
32 |
|
33 | zeit:
|
34 | ldi r18, 0xFF
|
35 | zeit1:
|
36 | dec r18
|
37 | brbs 1, aus
|
38 | ldi r19, 0xFF
|
39 | zeit2:
|
40 | dec r19
|
41 | brbs 1, zeit1
|
42 | rcall zeit2
|
43 | aus: ret
|