Forum: Mikrocontroller und Digitale Elektronik Speicherleerung ext.Ram 80c517A


von blutengel (Gast)


Lesenswert?

Hallo,

ich bin dabei eine Lichsteuerung für den DMX Bus mit einem 80C517A zu 
programmieren.
Die DMX Ausgabe funktioniert. Ich kann beliebige Werte auf 512 Kanälen 
ausgeben. Die Werte der Kanäle speichere ich auf einem ext.Ram.
Mein Problem war das ich anfangs Datenmüll im Speicher stehen hatte.

Ich habe ein Unterprogramm zum 0 setzen geschrieben. Dies wird einmalig 
nach dem einschalten aufgerufen. Schein auch alles zu funktionieren.

Meine Frage an Euch: Kan ich das so machen oder gibt es 
Verbesserungsmöglichkeiten, oder sogar eine Fehler den ich nicht finde?

Hier werden nur 255 Kanäle genutzt, da nicht mehr benötigt werden.


Hier mal der Code:
1
dmx_clear:
2
      mov    DPTR,#00fah  ; Datenpointer Adresse 0000
3
  
4
      mov    a,#0000h  ; zu speichernde Wert setzen
5
Loop3:    
6
      movx  @DPTR,a    ; Wert in die Speicherstelle (auf die der 
7
                ; DPTR zeigt) speichern, Anfangsadresse=0000h      
8
              
9
      INC DPTR      ;Adresse um 1 erhöhen
10
      
11
      mov    a,dpl    ;Adresse in Akku schreiben
12
      
13
      jz ende        ;Der Inhalt des Akku wird auf 0 abgefragt.Wenn Ja Schleife beenden, wenn Nein....
14
      
15
      mov a,#0000h    ;den zu speichernden Wert wiederherstellen
16
      
17
      SJMP Loop3      ;....wird die Schleife neu gestartet
18
      
19
    
20
      
21
ende:
22
23
      LCALL Start_DMX
24
ret

von Wilhelm F. (Gast)


Lesenswert?

Gewöhnlich ließt man ja nicht Daten aus einem RAM, was nach Einschaltung 
zufällige Daten enthält. Entweder initialisiert man es komplett, oder 
den Bereich, den man nutzt. Compiler machen das teils auch automatisch 
während der Initialisierung.

von blutengel (Gast)


Lesenswert?

blutengel schrieb:
> fa

blutengel schrieb:
> dmx_clear:
>       mov    DPTR,#00fah  ; Datenpointer Adresse 0000

es muss natürlich
1
DPTR,#0000h
 sein.

von Wilhelm F. (Gast)


Lesenswert?

Mit DPTR und MOVX-Befehlen wird es schon richtig sein. Man setzt den 
DPTR auf die gewünschte Anfangsadresse, und vergleicht nach jedem Byte 
DPH und DPL mit der Endadresse.

von bko (Gast)


Lesenswert?

>Verbesserungsmöglichkeiten,...
  DJNZ:
1
dmx_clear:
2
      mov    DPTR,#00fah  ; Datenpointer Adresse 0000
3
      mov    R0,#0Fah     ; <<<< oder R1...7, oder direct max 256 mal
4
      mov    a,#0000h     ; zu speichernde Wert setzen
5
Loop3:    
6
      movx  @DPTR,a       ; Wert in die Speicherstelle (auf die der 
7
                          ; DPTR zeigt) speichern, Anfangsadresse=0000h   
8
      INC DPTR            ;Adresse um 1 erhöhen      
9
      djnz r0, Loop3      ; <<<<<<< r0--, und Sprung wenn R0 nicht Null
10
ende:
djnz, siehe hier:
http://www.self8051.de/djnz_____%3Cbyte%3E.%3Crel%3E,13474.html

von R. W. (quakeman)


Lesenswert?

Nur mal so eine Frage am Rande, wieso benutzt du #0000h und nicht #00h 
als Konstante für den Akkumulator?
Der Akku ist 8Bit breit, weshalb es sinnvoll wäre auch die Notation 
dementsprechend anzupassen. Das Ergebnis ist zwar das Gleiche, aber 
zumindest wäre dann die Schreibweise korrekt.

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.