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.
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 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 $outEinen TCL-Interpreter hat jedes Linux-Betriebssystem on Board. Für Microsoft'sche OS gibts einen von dev.scriptics.com. |
|
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 |