www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik alle SFR auslesen, wie?


Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe folgendes Problem, ich soll eine Monitorprogramm schreiben.
Dafür muss ich die SFR auslesen können. Das soll durch Eingabe der
SFR-Adresse erfolgen. Irgendwie bekomme ich da nicht hin.
Hat jemand eine Idee? Assembler oder besser in C.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Häh?
Das steht doch in jedem Datenblatt.
Nimm Dir also das von Deinem Controller und los geht es.

Wer zwingt Dich denn, so ein Programm zu schreiben?

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau das steht nicht so nicht drin.
Klar kann ich in Assembler folgendes machen:

mov SBUF, SP
oder
mov SBUF, 0x81

Nur wenn die Sache variabel werden soll wird schwierig. Also angenommen
ich will die SFR's von 0x81h bis 0xFEh ausgeben. Wie realisiert man
das?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Schleife und dann jeweils um eins erhöhen?
Das Problem sehe ich immer noch nicht.

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ganz einfach: du schreibst ein programm bei dem du die start und die
endadresse eingeben musst.

dann initialisierst du einen byte pointer mit der startadresse und
lässt in einer schleife solange alle werte ausgeben bis der pointer auf
die endadresse zeigt (mit auto increment natürlich )

mfg, Mathias

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die SFRs lassen sich nur direkt adressieren, d.h. Du brauchst für jede
Adresse einen eigenen Befehl, z.B.:

cjne r0, #80h, m80
mov a, 80h
m81:
cjne r0, #81h, m82
mov a, 81h
m82:
...
cjne r0, 0FFh, mend
mov a, 0FFh
mend:


Peter

Autor: Niels Huesken (monarch77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sich jedes SFR nur über direkte Adressierung auslesen lässt, wage
ich zu bezweifeln, zumal hier noch kein Ton über die verwendete
Plattform gefallen ist.

Vieleicht nochn kleiner Tipp:

Es gibt SFRs, die nur WriteOnly sind bzw bei Lesezugriffe andere Werte
ausgeben.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das Ganze muss auf einem MSC1211 von TI laufen (8051 kompatibler
Kern).
Meine neue Idee wäre eine Tabelle:
   .
   .
 mov DPTR, #sfread_tab
 movc A, @A+DPTR
   .
   .
   .
.macro sfread    ; Erg. in R0
    mov A,@1
  ret
  .endmacro

sfread_tab:    ;(>=128)
  sfread $80  ; P0
  sfread $81  ; SP
  sfread $82  ; DPL
  sfread $83  ; DPH
        .
        .
        .

Also zuerst einmal Akku erhöhen und abschließend Akku über UART senden.
Habee ich nur noch nicht ausprobiert.

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Niels

"Das sich jedes SFR nur über direkte Adressierung auslesen lässt,
wage
ich zu bezweifeln, zumal hier noch kein Ton über die verwendete
Plattform gefallen ist."


Nun, beim 8051 sind Deine Zweifel falsch, sonst hätte ich es ja nicht
geschrieben.

Und "SFR", "SBUF", "SP" legen einen 8051 nahe.


Daher geht es eben nicht so wie Dirk schreibt bzw. er liest damit immer
den indirekten SRAM.


Peter

Autor: Thomas K. (thkais)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von hinten durch die Brust ins Auge gehts doch. Voraussetzung: Ein RAM,
der sowohl als Daten- als auch als Codespeicher geschaltet ist (mache
ich der Bequemlichkeit halber eigentlich immer).
Dann kann man den entsprechenden Programmcode ins RAM schreiben und
entsprechend verändern. Ist zwar kein "sauberer" Programmierstil,
geht aber.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe erst einmal folgende Lösung in Assembler gefunden:

MAIN_PROG:

    mov R0, #0x00
Erh:
    mov A, R0
    mov DPTR, #Tabelle
    LCALL SFRREAD
    mov SBUF, A
    inc R0
    inc R0
    inc R0
    sjmp Erh
    jmp MAIN_PROG

SFRREAD:
    jmp @A+DPTR


  .segment tabelle, org $9A

  .macro ReadSFR
     mov A, @1
     ret
  .endmacro

Tabelle:
      ReadSFR 0x80    //Port 0
      ReadSFR 0x81    //SP
      ReadSFR 0x82
      ReadSFR 0x83
      ReadSFR 0x84


Vielleicht finde ich noch eine  kürzere Variante, die auch unter C zu
realisieren ist.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Dirk

Daher geht es eben nicht so wie Dirk schreibt bzw. er liest damit
immer
den indirekten SRAM.


@Thomas

also ehe ich da noch nen Haufen Hardware ranpappe, schreibe ich doch
lieber ein paar Zeilen Code. Mit einem Repeat-Macro ist das ruckzuck
erledigt.
Wem die 5 Byte pro SFR zuviel sind, man kanns auch auf 3 Byte ("mov a,
sfr" + "ret") reduzieren und indiziert anspringen.


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Dirk,

jetzt sehe ich es erst, Du machst es schon so.

Du hast bloß nen völlig anderen Assembler, deshalb habe ich es nicht
erkannt.

Ein Fehler ist aber doch noch drin:

Wenn Du alle 128 SFRs lesen willst, dann ergibt 3* "inc R0" einen
Überlauf. Dann mußt Du noch DPH erhöhen.



Peter

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt nur die Möglichkeit beim 8051 für jedes SFR einen Befehl zu
schreiben. Der Ansatz von Dirk ist bestens. Nur noch die 16 Bit
Korrektur, dann sollte das tun. @Thomas meinem Namensvetter: Die
"von-Neumann" Umbauerei von 8051 geht nur bei externem
Programmspeicher. Intern gibt das ein Problem und bei einem
"universellen" Monitor sollte das auch dann funktionieren.

Gruß THomas

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, hier mal, wie ich das mit dem Keil-Assembler machen würde:

; input: a = index (0 = sfr 80h ... 7fh = sfr 0FFh)
; output: r7
getsfr:
        mov     dptr, #sfrtab
        mov     b, #3
        mul     ab
        jnb     ov, _gsf1       ; > 255 ?
        inc     dph             ; + 256
_gsf1:  jmp     @a+dptr

sfrtab:
        sfrnum  set 80h
        rept    128
        mov     r7, sfrnum
        ret
        sfrnum  set sfrnum + 1
        endm

end

Je nach Derivat sind natürlich nicht alle SFRs belegt, dann kommt
meistens 0 oder FFh zurück.

"mov a, acc" ist keine gültige Instruktion, deshalb habe ich R7
genommen.


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.