Auslesen eines programmierten AT89Cx051

  Allgemeines und Aufbau   Programm
Verschiedentlich wurde Bedauern laut, dass der auf meiner Seite vorgestellte Programmer keine Möglichkeit bietet, einen bereits beschriebenen Controller wieder auszulesen. Über die Notwendigkeit dazu mag man geteilter Meinung sein, da in den eigenen Bausteinen nur eigene Programme sind und Controller von Fremdfirmen immer per Lock-Bit geschützt sind. Wie dem auch sei, auf dieser Seite wird ein kleines Progrämmchen vorgestellt, mit dem sich ein 89C1/2/4051 auslesen lässt.

Allgemeines und Aufbau

Das Auslesen des Speicherinhalts eines 89C2051 verläuft so ähnlich wie das Schreiben: zuerst wird beim Zielcontroller durch Pulsen der RST-Leitung an Pin 1 der interne Bytezähler zurückgesetzt.

Beschaltung des Zielcontrollers

Anhand der gesetzten Mode-Bits P3.3/4/5/7 auf L/L/H/H erkennt der Zielcontroller, nachdem RST wieder auf 1 gesetzt wurde, den gewünschten Auslesemodus, und schreibt das mit dem internen Zähler referenzierte Byte im Programmspeicher nach P1, wo es dann weiterverarbeitet werden kann.

Bei jedem Pulsen von XTAL1 des Zielcontrollers wird dann der interne Bytezähler weitergesetzt, das nächste Byte nach P1 geschrieben und so weiter und so fort.

Um diese Daten nun auszulesen und an den PC zu schicken, brauchen wir dreierlei: ein kleines Experimentierboard für einen Controller, der den Vorgang steuert, ein Modul mit einem MAX232, der die Pegelkonvertierung der seriellen Schnittstelle übernimmt und sowieso auf keinem uC-Experimentiertisch fehlen darf, sowie eine Testplatine für den auszulesenden Controller. Dazu noch eine handvoll Klemmen, um die Schaltungskomponenten zu verbinden - fertig. Die untenstehende Abbildung zeigt, wie das bei mir aussieht.

Die Abfrage der Daten erfolgt nun derart, dass ein Programm an der seriellen Schnittstelle lauscht und alle einkommenden Daten mitschneidet.

Linux-Besitzer haben es da wieder einmal am einfachsten: einfach mit

stty -F /dev/ttyS1 ispeed 9600 ospeed 9600 raw
die serielle Schnittstelle auf 9600 Baud im raw-Modus stellen und mit
hexdump -v -f format.txt /dev/ttyS1
die eingehenden Daten auslesen. Die Formatdatei format.txt enthält bei mir folgende Formatieranweisungen:
"%04.4_ax %6_ad: " 8/1 "%02x " " - " 8/1 "%02x " "\n"

Unter Microsoft-Betriebssystemen muss man sich mit Terminal-Programmen, die Binärdaten mitloggen können, behelfen, oder ein kleines Progrämmchen schreiben, das diese Daten aufnimmt.

Der folgende TCL-Code funktioniert unter Windows ebenso wie unter Unix. Einzig der Name der Schnittstelle ist für das jeweilige Betriebssytem anzupassen: COM_ für Microsoft-Betriebssysteme, /dev/ttyS_ für Linux.

	set inp [open "COM1" r]
	set out [open "out.bin" w]
	fconfigure $inp -mode 9600,n,8,1
	set cont [read $inp 1000]
	puts -nonewline $out $cont
	close $inp
	close $out
Einen TCL-Interpreter hat jedes Linux-Betriebssystem on Board. Für Microsoft'sche OS gibts einen von dev.scriptics.com.
Schaltungsaufbau

Das Programm

Das Programm ist trivial, daher habe ich es hier einfach unkommentiert aufgeführt. Der Großteil ist unverändert vom Code-Generator übernommen.

;Autor     : Erik Buchmann
;Projekt   : 89Cx051 auslesen
; Quarz    : 24.000 MHz
; Generator: CodeGen Stable Version 1.0, Erik Buchmann '01
; Assembler: AS bzw. ASL
; Datum    : 21.9.01
;---------------------------------------------------------------
 CPU 8051
 INCLUDE stddef51

; Konstanten-, Speicher- und Portbelegung
;---------------------------------------------------------------
C_RST   EQU    P3.7
C_XTAL  EQU    P3.5

; Programmbeginn
;---------------------------------------------------------------
 SEGMENT code
 ORG 0h
        jmp start

; Funktionen
;---------------------------------------------------------------
; ein Byte aus ACC ausgeben
serial_out:
;  auf Abschlu des letzten Sendevorganges warten
        jnb SCON.1,serial_out
        clr SCON.1
;  senden
        mov SBUF,a
        ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

; Warteschleife: 10 ms
;  Anzahl Maschinenzyklen: 20000
ws:
        push PSW
        push 0
        push 1
        mov 1,#194
ws_labelB1:
        mov 0,#9
ws_labelB0:
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        djnz 0,ws_labelB0
        djnz 1,ws_labelB1
        pop 1
        pop 0
        pop PSW
        ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

; Initialisierung
;---------------------------------------------------------------
start:

; serielle Schnittstelle aktivieren
;  9600 Baud, Modus 1
        mov TL1, #243
        mov TH1, #243

; die SFR's initialisieren
        mov SP,  #20h
        mov SCON,#82
        mov PCON,#128
        mov TMOD,#32
        mov TCON,#64

; Hauptprogramm
;---------------------------------------------------------------
main:
        call ws             ; initialisieren
        clr C_RST    
        clr C_XTAL

        mov DPTR,#0
        call ws 

        setb C_RST        

loop:
        call ws             ; warten bis Daten stabil

        mov a,P1            ; Daten an serielle Schnittstelle
        call serial_out

        setb C_XTAL         ; Zähler weitersetzen
        nop
        clr C_XTAL

        inc DPTR
        mov a,#010h         ; Ende bei 1000h (4096)
        cjne a,DPH,loop

        clr P3.0            ; Signal Ende

; Programmende
;---------------------------------------------------------------
ende:
        jmp ende
END

Seite zurück Startseite Seite vor
Erik Buchmann
EMail an: Owner@ErikBuchmann.de