Friday, February 08, 2013

DS89C450 SDCC getchar() function

After the putchar() function you probably need the getchar() function.  The function is also quite simple. Just check the Receive Interrupt flag instead of Transmit Interrupt in the putchar().  I'm using mode 0 for the serial port, the RI_0 is set at the end of the 8th bit. When the flag is set, clear it then read and return the data:
char getchar(void) {
        char c;
        while (!RI_0)
        ;
        RI_0 = 0;
        c = SBUF0;
        return c;
}

If you want to read a line input you can use gets():
char line[100];

gets(line);

Thursday, February 07, 2013

DS89C450 SDCC serial init and printf putchar functions

sdcc is a very handy tool but it isn't magic.  For embedded system even a "hello world" printf function isn't easy. If you just put printf in your code and ask sdcc to compile, it will complain because it doesn't know how the system connects to the serial port:
?ASlink-Warning-Undefined Global '_putchar' referenced by module 'hello'
make: *** [hello] Error 1
You get the same error for similar printf stdio.h functions (e.g. vprintf, sprintf, vsprintf, puts etc...)

The solution is easy; just define the putchar() function to describe which buffer (e.g. UART0 or UART1) the characters should go to.  Here is my example code of "Hello World" and blinking some LED on the DS89C450 evaluation kit:
#include <stdio.h>
#include "sdcc_reg420.h"

void delay(void)
{
 unsigned int i, j;

 for(j=0; j<12; j++)
 {
  for(i=0; i<3000; i++)
  {
  }
 }
}

void serialInit()
{
 TMOD = 0x21;    // Timer 1: 8-bit autoreload from TH1
 TH1 = 220;      // 14400 baud rate
 CKMOD = 0x38;   // Use system clock for timer inputs
 T2CON = 0x00;   // Serial 0 runs off timer 1 overflow
 TCON = 0x50;    // Enable timers 0 and 1
 SCON0 = 0x50;   // Enable serial port 0
 SBUF0 = ' ';
}

void putchar (char c) {
 while (!TI_0) /* assumes UART is initialized */
 ;
 TI_0 = 0;
 SBUF0 = c;
}

void main(void)
{
 serialInit(); // Initialize serial port 0

 printf("\rHello World!!\n");

 while(1)
 {
  P1 = 0x01;
  delay();
  P1 = 0x02;
  delay();
  P1 = 0x04;
  delay();
  P1 = 0x08;
  delay();
 }
}
Then it works! Download your firmware to the evKit and then you can see the "Hello World" displaying on your terminal! If nothing comes up then check if the LED are blinking. If LED are not blinking then the firmware is not running.. something is probably really wrong. I set 14400 as baudrate because the evKit uses the same baudrate for the in-system programming. I just don't want the hassles of changing the baudrate of my terminal all the time. If you need the register file sdcc_reg420.h of the above example code, you can get it in the following link:

http://www.maximintegrated.com/app-notes/index.mvp/id/3477

Only this document was written some time ago and now sdcc will warn it uses some deprecated macros. But the file still works fine and updating the keywords are trivial task.

Wednesday, February 06, 2013

git clone --mirror and update

To create a git repository mirror is fairly easy:
$ git clone --mirror ssh://user@example.com/path/to/repo
To update the mirror from the original source:
$ git remote update



ssh-add "Could not open a connection to your authentication agent"


I came accross some occurence when I use ssh-add to add a ssh key it gives me the following error:

Could not open a connection to your authentication agent.



and the following command did the trick sometimes...
$ exec ssh-agent bash
but I still have the problem when I use ssh-add under Cygwin in Windows system.... couldn't find a solution :(

Saturday, February 02, 2013

Linux serial baud 14400 and DS89C450 development

For some freaking reason Linux couldn't support 14400 baud rate on it's serial connection.  I was doing some development based on Maxim's DS89C450 , as it is one of the highest performance 8051 compatible microcontrollers in the market. The nice thing of this DS89C450 is that it has a boot ROM which allows me to program the chip using serial port (instead of an expensive programmer).  However, the boot ROM only allows COM port connections at 14400 and Linux doesn't support this baud rate. (dear Maxim friends, can you change the baud rate to a standard one?)

I was desperate and trying through different bauds, surprisingly I found that it can work under 2400bps instead of 14400. (Anyone can explain to me why?)

If you are interested, there are a few more further readings of development using DS89C450 under Linux: