Forum: Mikrocontroller und Digitale Elektronik Routine zum Ansteuern von Schieberegistern


von Malte B. (oberammergau)


Lesenswert?

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
von spess53 (Gast)


Lesenswert?

Hi

Ein paar sinnvolle Kommentare wären hilfreich.

MfG Spess
von Karl H. (kbuchegg)


Lesenswert?

Deine BRBS machen mich wahnsinnig. Ist dir da nichts besseres 
eingefallen, als die Belegung der Bits im Statusregister auswendig 
können zu müssen?

Was denkst du, warum es im Befehlssatz Befehle wie

   BREQ     Branch if equal
   BRNE     Branch if not equal
   BR...

gibt? Gut, Atmel hätte noch einen BRZ (Branch if Zero) bzw BRNZ (Branch 
if not Zero mit aufnehmen können, der einem BREQ entspricht. Aber es 
geht auch so, wenn man einfach nur bedenkt, dass mit EQ in manchen 
Fällen einfach nur EQUAL TO ZERO gemeint ist.
von Karl H. (kbuchegg)


Lesenswert?

Aber abgesehen davon, denke ich der Code ist soweit korrekt. Was sagt 
denn der Simulator? Schalten die Pins in der richtigen Reihenfolge?
von Falk B. (falk)


Lesenswert?

@  Malte B. (oberammergau)

>Schieberegister entweder nur 8  Low oder nur 8  High aus. Ich verwende
>relativ lange Flachbandkabel, vielleicht spinnt der Clock deshalb rum.

Wie lang? Teste mal mit kurzen Kabeln, so 50mm oder so. Siehe auch 
Wellenwiderstand.

MFG
Falk
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.