Forum: Mikrocontroller und Digitale Elektronik 80c166 Assembler: Erzeugung von Pseudzahlen


von Assembler-honk (Gast)


Lesenswert?

Hallo Leute,

ich habe ein (für mich) mächtiges Problem. Ich soll das aufleuchten 
einer LED mit einer pseudozufälligen Position (0..15) erzeugen. Der 
Ansatz wäre hier über ein rückgekoppeltes Schieberegister (mein Ansatz 
wäre über rol) zu machen. Also linksschieben in einem 16 bit Register 
(und die 12 höchsten Bits löschen, dann erhalte ich die Zahlenwerte 
0..15). Nach dem Linksschieben Abfrage der Bit Nr. 1 und 15 (nicht 0 u. 
14). Bei gleichheit der beiden Bit das Bit 0 setzen. Bei n=15 ergeben 
die Abgriffe k1=14 und k2=0).

Wie kann ich das lösen? Unten könnt ihe mein altes Programm sehen, in 
dem die einzelnen LED's von links nach recht laufen.

Vielen Dank für eure Hilfe


all_out equ     0ffffh          ; Steuerwort für Ausgaberichtung
t2iniw  equ     1000$0010b      ; T2: Timer, f_z = 1,25kHz, rückwärts, 
Stop
tkonst  equ     10000000/1600-1 ; Zählwert für 10 ms: 10E7 ns / 1600 ns 
- 1
;tkonst  equ
startbk equ     0010$0000$0010$0000b      ; Startbitkombination
zwr     equ     14              ; Bit ist zu weit nach rechts geschoben
zwl     equ     8               ; Bit ist zu weit nach links geschoben

fang_asm section code 'ncode'
; Programm:
fangbi  proc interrupt reset=0  ; Generierung des Starteinsprunges, 
!!!!!!! DIES UNTER KEINEN UMSTAENDEN VERAENDERN !!!!!!

start:  or      syscon,#3eH     ; 1 Waits,   !!!!!!! DIES UNTER KEINEN 
UMSTAENDEN VERAENDERN !!!!!!
        diswdt      ; Watchdog aus, !!!!!!!! DIES UNTER KEINEN 
UMSTAENDEN VERAENDERN !!!!!!!

        mov     dp2,#all_out
        mov     t2con,#t2iniw
        mov     r4,#startbk
  mov  v1,r4    ; nur zum Testen




; Rechtsschiebe-Schleife:

loopr1: ror  r4,#1
loopr:  ror     r4,#1
      ;  jb  r4.zwr,loopl1 ; wenn zu weit rechts, zur 
Linksschiebe-Schleife
        mov     p2,r4
        mov     rl2,p5         ; Eingabe N
    calla cc_nz verzoe     ; Aufruf des Unterprogramms
        jmpr    cc_uc,loopr

; Linksschiebe-Schleife:
loopl1:  rol  r4,#1
loopl:  rol     r4,#1
        ;jb  r4.zwl,loopr1
        mov     p2,r4
        mov     rl2,p5
    cmp p5,#0
    calla cc_nz verzoe   ; Aufruf des Unterprogramms
        jmpr    cc_uc,loopl



fangbi  endp                    ; hier endet Prozedur fangbi

verzoe  proc                  ; hier fängt Prozedur verzoe an
push r4
mov     rl4,p5
tloopo1: mov     t2,#tkonst
        bclr    t2ir           ; Fertigmeldungrücksetzen
        bset    t2r            ; Zählfreigabe Timer T2
tloopi1: jnb     t2ir,tloopi1  ; auf T2-Null-Unterschreitung warten
        subb    rl4,#1
        jmpr    cc_nz,tloopo1
      bclr    t2r           ; Zählsperre Timer T2, stoppen
        bclr    t2ir          ; Interrupt-Meldung T2 löschen
    pop r4
        ret


verzoe  endp                  ; hier endet Prozedur verzoe

fang_asm ends

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.