Speicherleerung ext.Ram 80c517A

Gast #3472749
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
Gast #3472805
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.
Gast #3472954
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
#3474104
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.