/* * * doug_at.c * * usage: sdcc -mmcs51 doug_at.c * * Getting FLIP to work is troublesome. * * The chip needs 5V, a 5V power pack into the powerjack is not good enough. * * Use a USB serial lead connected to the RS232 headers with MAX232 chip removed and socket strapped. * * To put chip into boot mode, use this sequence. * * turn USB off, press reset and PSEN and release reset when PSEN, then turn on USB switch. * * use lsusb to check. * * It is important to use sudo, othewise dfu-programmer reports device not present. * rem rem compile doug_at.c and uses dfu-programmer to program the chip. rem https://sourceforge.net/projects/dfu-programmer/ rem sdcc -mmcs51 --std-c99 doug_at.c lsusb sudo dfu-programmer at89c5131 get sudo dfu-programmer at89c5131 erase sudo dfu-programmer at89c5131 flash doug_at.ihx sudo dfu-programmer at89c5131 launch * http://www.futurlec.com/USBDevBoard.shtml * * at89_UART_doc4346.pdf * * remove rs232 chip * * strap * * . u . * . . * . . * . . * . . * . . * .---. - strap * .---. - strap * * . . . . * R G W B * * connect ttl serial lead to header : red, green, white, black * * My PL2303HX TTL leads do not work with windows 10 but with LINUX * * https://github.com/dfu-programmer/dfu-programmer * */ /* ========================== SEC 1.0 Includes ========================== */ #include #include /* ========================== SEC 2.0 Globals ========================== */ /* globals used in interrupts */ volatile int intFlag; volatile char intCounter; volatile char uart_data; /* ========================== SEC 3.0 Interupt routines ========================== */ /* The Interrupts defines in the include are one out and start at 0. */ /* Interrupts #define INT_RESET 0 // Reset #define INT_EXT0 1 // External Interrupt 0 #define INT_TIMER0 2 // Timer0 Overflow #define INT_EXT1 3 // External Interrupt 1 #define INT_TIMER1 4 // Timer1 Overflow #define INT_UART0 5 // Serial Port 0 #define INT_TIMER2 6 // Timer2 Overflow #define INT_PCA 7 // Programmable Counter Array #define INT_KEYBOARD 8 // Keyboard on P1 #define INT_TWI 9 // Two Wire Interface #define INT_SPI 10 // Serial Peripheral Interface // 11 Reserved // 12 Reserved // 13 Reserved #define INT_USB 14 // USB events // 15 Reserved */ //INTERRUPT(int0_IT, 0 ) void int0_IT(void) __interrupt 0 { //SBUF = uart_data; intCounter += 10; intFlag = 1; } //INTERRUPT(intTmr0_IT, 1 ) void intTmr0_IT(void) __interrupt 1 { SBUF = uart_data; intCounter +=2; } //INTERRUPT(intExt1_IT, 2 ) void intExt1_IT(void) __interrupt 2 { SBUF = uart_data; intCounter +=3; } //INTERRUPT(intTmr1_IT, 3 ) void intTmr1_IT(void) __interrupt 3 { SBUF = uart_data; intCounter +=4; } void serial_IT(void) __interrupt 4 //INTERRUPT( serial_IT , 4 ) { //char uart_data; //intFlag = 1; if (RI == 1) { /* if reception occur */ RI = 0; /* clear reception flag for next reception */ uart_data = SBUF; /* Read receive data */ SBUF = uart_data; /* Send back same data on uart*/ intCounter ++; } //else TI = 0; /* if emission occur */ } /* clear emission flag for next emission*/ /* ========================== SEC 4.0 helper functions ========================== */ /* putchar is called by printf(); */ //int putchar(int c) void putchar( char c) { while(!(SCON & 0x02)); SCON &= ~0x02; SBUF = c & 0xff; //return (c); } /* ========================== SEC 5.0 main function ========================== */ void main(void) { unsigned long int i = 0; short x ; /* ;************************************************* ; UART 115200bps ;************************************************* ORL CKCON0,#00000001B ; 6 CLK PERIOD/MACHINE ORL PCON,#11000000B ; ENABLE THE FRAMING BIT ERROR DETECTION, DOUBLE BAUD RATE ; AND CHECK FE BIT OF SCON SFR ORL BDRCON,#00001110B ; SPD=1,RBCK =1, TBCK =1 MOV SCON,#01010000B ; uart in mode 1 (8 bit), REN=1 MOV BRL,#243 ; U CAN SEE THIS VALUE FROM PAGE 71 OF DATASHEET ORL BDRCON,#00010000B ; BRR = 1 , START BAUD RATE RUN */ // this works. CKCON0 = 1; PCON = 0xC0; BDRCON = 0x0E; SCON = 0X50; BRL = 0xF3; // 243; BDRCON = BDRCON | 0x10; // TCON |= 0x40; SCON |= 0x02; // Tell putchar() the UART is ready to send. ES = 1; /* Enable serial interrupt */ /* enable INT0 interrupt */ P3_2 = 1; TMOD = 0x08; // PORT3.2 use set GATE0 in TMOD. IT0 = 1; /* 1 = edge, 0 = low */ EX0 = 1; /* enable INT0 */ EX1 = 1; ES = 1; EA = 1; /* Enable global interrupt */ P0 = 0xff; P1 = 0xff; P2 = 0xff; P3 = 0xff; x = 0x0 ; //intCounter = 0; for(;;) { // set PORT 0 to count LED. PORT 0 is open drain. x++; P0 = x+x | ( ~( intCounter > 0 ) & 1) ; printf("UUU 555 Hello World! x= %04X %04x %d %d %d \n\r",x ,intCounter ,IE0 ,IT0 ,P3_2 ); printf("IEN0: %02x TCON: %02x TMOD: %02x SCON: %02x RI: %02x TI: %02x %02x \n\r",IEN0 ,TCON, TMOD, SCON, RI ,TI ,uart_data ); if ( intCounter > 0 ){ intCounter += -1; } // for(i = 0; i < 147456; i++); // Sleep for(i = 0; i < 14745; i++); // Sleep } }