89C4051 wie 80535

E

Edgar Steffen

Guest
Hallo,
versuche in C über printf Zeichen über den seriellen ausgang auszugeben,
beim 80C535 gehts prima, der 4051 bringt nichts raus. Nach den Unterlagen
hat der 4051 einen 51er Kern, auch die notwendigen Register sind an gleicher
Adresse

Programm:

#include <stdio.h> /* prototype declarations for I/O
functions */


/****************/
/* main program */
/****************/
void main (void) {
BD = 1; PCON = 0x80; SCON = 0x50; TI = 1;

printf ("Hello World\n");

while (1) {
; /* ... */
}}


--
--
Greetings... Edgar Steffen {Ed.Steffen@t-online.de}
siehe auch:
http://ed.steffen.bei.t-online.de/dsw.htm
 
Edgar Steffen wrote:
Hallo,
versuche in C über printf Zeichen über den seriellen ausgang auszugeben,
beim 80C535 gehts prima, der 4051 bringt nichts raus. Nach den Unterlagen
hat der 4051 einen 51er Kern, auch die notwendigen Register sind an gleicher
Adresse

Programm:

#include <stdio.h> /* prototype declarations for I/O
functions */


/****************/
/* main program */
/****************/
void main (void) {
BD = 1; PCON = 0x80; SCON = 0x50; TI = 1;

printf ("Hello World\n");

while (1) {
; /* ... */
}}
Wo wird die Baudrate gesetzt ? BD = 1 ???
Wo der Timer dafür freigegeben ?
Macht das der Compiler oder hast du es nicht gemacht ?
Welcher C-Compiler ?
Mit etwas mehr Info könnte dir geholfen werden.....

Andreas
 
Edgar Steffen schrieb:
Hallo,
versuche in C über printf Zeichen über den seriellen ausgang auszugeben,
beim 80C535 gehts prima, der 4051 bringt nichts raus.

void main (void) {
BD = 1; PCON = 0x80; SCON = 0x50; TI = 1;

printf ("Hello World\n");

while (1) {
; /* ... */
}}
Du hast den Timer 1 nicht mit Wert für die Baudrate geladen und ihn
nicht gestartet.
Der 535 hat einen Extratimer für die Baudrate.

Ausschnitte aus der chio.c meines MI-C Compilers dazu:


#define BETRIEBSART 1

/*=============================================*/
/* FESTLEGEN DER BAUDRATE:

Fuer die Betriebsart 0 gilt: F = XTAL/12 fest;

fuer die Betriebsart 2 gilt: F = XTAL/64 fest;

fuer die Betriebsarten 1+3 gilt:

bei gewuenschter Baudrate F ist der Timer T1 mit dem
negativen Wert der ganzzahligen Konstanten

@baud = K * 1 / ( 32 * F )

zu laden,
wobei K = XTAL/12 bei internem Takt fuer Timer 1
oder K = externer Takt fuer Timer 1.



Beispiel fuer 11.0592 MHz Prozessortakt: */
#ASM

;@baud EQU -3 ;9600 baud
;@baud EQU -6 ;4800
;@baud EQU -12 ;2400
;@baud equ -24 ;1200

ext @baud:byte

#ENDASM




#if BETRIEBSART == 1

#ASM
; Initialisierung fuer Betriebsart 1:
; asynchrone Datenuebertragung mit 10-Bit Frames
; und variabler Uebertragungsrate

mov SCON,#01010010B ; BETRIEBSART 1
; Empfaengerfreigabe
; set Transmitter-Interrupt
; reset Receiver-Interrupt
mov TMOD,#00100000B ; TIMER 1 in MODE 2
; AUTORELOAD
; interner Takt
mov TH1,#@baud ; lade Timer mit Teiler
clr 0ABH ; sperre Interrupt (ET1)
setb TR1 ; Start Timer 1
#ENDASM

#endif



Gruß

Uwe
 
In article <ccmtiq$1sg$07$1@news.t-online.com>,
"Edgar Steffen" <edgar.steffen@gmx.de> writes:
Hallo,
versuche in C über printf Zeichen über den seriellen ausgang auszugeben,
beim 80C535 gehts prima, der 4051 bringt nichts raus. Nach den Unterlagen
hat der 4051 einen 51er Kern, auch die notwendigen Register sind an gleicher
Adresse

BD = 1; PCON = 0x80; SCON = 0x50; TI = 1;
Du verwendest einen 535 spezifischen Baudrategenerator (clock/39).
Beim 4051 mußt du T1 dafür verwenden.

void ser_init (void)
{
ES = 0;
SCON = 0x50;
PCON |= 0x80; /* SMOD = 1; */
TMOD &= 0x0f; /* use timer 1 */
TMOD |= 0x20;
TH1=256-((clock+baudrate*6*16)/16/12/baudrate);
ES = 1;
}

--
MFG Gernot
 

Welcome to EDABoard.com

Sponsor

Back
Top