diff --git a/boostc/lcd.c b/boostc/lcd.c new file mode 100644 index 0000000..0f882c0 --- /dev/null +++ b/boostc/lcd.c @@ -0,0 +1,152 @@ +#include +#include "lcd.h" +#include "util.h" +/******************************************************************* +http://forum.sparkfun.com/viewtopic.php?p=33650 +EXAMPLE: + +const unsigned char LCD_CHAR_BAR1[] = { + 0x1F, // ---11111 + 0x10, // ---10000 + 0x10, // ---10000 + 0x10, // ---10000 + 0x10, // ---10000 + 0x10, // ---10000 + 0x10, // ---10000 + 0x1F // ---11111 +}; + + LCD_Init(); + LCDCls(); + x = 0; + LCD_DefineChar (1, LCD_CHAR_BAR1); + LCD_DefineChar (2, LCD_CHAR_BAR3); + LCD_DefineChar (3, LCD_CHAR_BAR2); + LCD_DefineChar (4, LCD_CHAR_BAR4); + LCD_DefineChar (5, LCD_CHAR_BAR5); + + LCD_SetPosition ( LINE_1 + 0 ); + printf("\1\5\2 RF Terminal", 0, LCD); +*****************************************************************/ + +/*******************************************************************/ +// Prototypes +/*******************************************************************/ +void lcd_init ( void ){ + lcd_setData (0x00); + delay_ms (200); /* wait enough time after Vdd rise */ + LCD_RS = 0; + lcd_setData (0x03); /* init with specific nibbles to start 4-bit mode */ + lcd_pulseEnable(); + lcd_pulseEnable(); + lcd_pulseEnable(); + lcd_setData (0x02); /* set 4-bit interface */ + lcd_pulseEnable(); /* send dual nibbles hereafter, MSN first */ + lcd_putChar (0x2C, CMD);/* function set (all lines, 5x7 characters) */ + lcd_putChar (0x0C, CMD);/* display ON, cursor off, no blink */ + lcd_putChar (0x01, CMD);/* clear display */ + lcd_putChar (0x06, CMD);/* entry mode set, increment & scroll left */ +} + +/*******************************************************************/ +void lcd_setPosition ( unsigned char cX ){ +/* this subroutine works specifically for 4-bit Port A */ + lcd_setData ((cX >> 4) | 0x08); + lcd_pulseEnable(); + lcd_setData (cX);//(swap(cX)); + lcd_pulseEnable(); +} + +/*******************************************************************/ +void lcd_putChar (unsigned char cX, unsigned char cmd){ +// this subroutine works specifically for 4-bit Port A + if (cmd == DATA) LCD_RS = 1;// data? + lcd_setData (cX >> 4); // Send high nibble + lcd_pulseEnable(); + lcd_setData (cX); // Send low nibble + lcd_pulseEnable(); + if (cmd == DATA) LCD_RS = 0; +} + +/*******************************************************************/ +void lcd_pulseEnable (void){ + LCD_EN = 1; + delay_us (5); + LCD_EN = 0; + delay_us (5); +} + +/*******************************************************************/ +void lcd_setData (unsigned char cX){ + LCD_D0 = cX.0; + LCD_D1 = cX.1; + LCD_D2 = cX.2; + LCD_D3 = cX.3; +} + +/*******************************************************************/ +void lcd_cls(void){ + lcd_putChar(CLEAR_DISP, CMD); +} + +/*******************************************************************/ +/* +** LCD_DefineCharacter: Define dot pattern for user-defined character. +** +** inputs: address = address of character (0x00-0x07) +** pattern = pointer to 8-byte array containing the dot pattern +*/ +void lcd_defineChar (unsigned char address, const unsigned char *pattern){ + char i, addr; + + addr = (address << 3); + lcd_putChar(0x40 + addr, CMD); + for (i=0; i<8; i++) { + lcd_putChar(*pattern++, DATA); + } +} + +/*******************************************************************/ +/*******************************************************************/ + +void lcd_putc (char ch){ // Char to send thru rs-232 + lcd_putChar (ch, DATA); +} + +/*******************************************************************/ +void lcd_puts (const char *str){ // String to send thru rs-232 + char ps; + ps = *str; // Pointer to the string start in ps + while( ps>0 ){ // While not end... + str++; // Increment pointer + if (ps== 0) break; // If end of string... finish. + lcd_putc (ps); + ps = *str; // Point to new char + } +} + +/*******************************************************************/ +void lcd_putd(int decimal){ // prints a decimal number + unsigned char decimal_output[5]; + unsigned char m, temp; + //Print negative sign and take 2's compliment + if(decimal < 0){ + lcd_putc ('-'); + decimal *= -1; + } + if (decimal == 0) + lcd_putc ('0'); + else{ + //Divide number by a series of 10s + for(m = 4 ; decimal > 0 ; m--){ + temp = decimal % (unsigned int)10; + decimal_output[m] = temp; + decimal = decimal / (unsigned int)10; + } + + for(m++ ; m < 5 ; m++) + lcd_putc(bin2Hex(decimal_output[m])); + } +} + +/*******************************************************************/ diff --git a/boostc/lcd.h b/boostc/lcd.h new file mode 100644 index 0000000..fa7e2a2 --- /dev/null +++ b/boostc/lcd.h @@ -0,0 +1,35 @@ +/*******************************************************************/ +// Defines +/*******************************************************************/ +#define LCD_RS porta.0 +#define LCD_EN porta.1 +#define LCD_D0 porta.2 +#define LCD_D1 porta.3 +#define LCD_D2 porta.4 +#define LCD_D3 porta.5 +#define DISPLAY_COLS 16 + +#define LINE_1 0x00 +#define LINE_2 0x40 +#define LINE_3 0x10 +#define LINE_4 0x50 +#define CLEAR_DISP 0x01 +#define ACTIVITY_SYMBOL 0xFF +#define DATA 1 +#define CMD 0 + +/*******************************************************************/ +// Functions +/*******************************************************************/ +void lcd_init (void); +void lcd_setPosition (unsigned char cX); +void lcd_putChar (unsigned char cX, unsigned char cmd); +void lcd_pulseEnable (void); +void lcd_setData (unsigned char cX); +void lcd_cls (void); +void lcd_defineChar (unsigned char address, const unsigned char *pattern); + +void lcd_putc (char ch); +void lcd_putd (int decimal); +void lcd_puts (const char *str); +void lcd_printf (const char *nate, int my_byte); diff --git a/boostc/sdcard.c b/boostc/sdcard.c new file mode 100644 index 0000000..0ae21ef --- /dev/null +++ b/boostc/sdcard.c @@ -0,0 +1,232 @@ +/* + * http://ghmicro.com/index.php/pic/13-18f4620/11-18f4620-a-sd-card + */ + +#include +#include +#include "sdcard.h" +#include "spi.h" + +char sd_output_buffer1[256]; +char sd_output_buffer2[256]; +char sd_input_buffer1[256]; +char sd_input_buffer2[256]; + +void sd_init(void){ + int i,r; + CSel=1; //init chip select (active low) + SD_LED=0; //LED off + + for(i=0; i<256 ;i++){ //fill the send buffers + sd_output_buffer1[i]=0; + sd_output_buffer2[i]=0; + sd_input_buffer1[i]=0; //and clear the receive buffers + sd_input_buffer2[i]=0; + } + r = sd_initMedia(); + if(r){ //card init failed - 1 blink + while(1){ + SD_LED = 1; + delay_ms(150); + SD_LED = 0; + delay_s(1); + } + } +} + +int sd_initMedia(void){ + int i,r; + CSel = 1; + spi_putc(0xff); //while card is not selected + + for(i=0;i<16;i++) //send 80 clock cycles to start up + spi_putc(0xff); + CSel = 0; //then select the card + r = sd_sendCmd(0,0); //send reset command to enter SPI mode + + CSel = 1; + spi_putc(0xff); //disable SD + if(r != 1) //error check - need 1 + return 0x84; + + i = 10000; //send init for up to 0.3s + CSel = 0; + do{ + r = sd_sendCmd(1,0); //send init command + CSel = 1; + spi_putc(0xff); //disable SD + if(!r) break; + }while(--i > 0); + + if(i==0) //time out error 0x85 + return 0x85; + sspcon1 = 0b00010000; //speed up spi clock + sspcon1.SSPEN = 1; + return 0; +} + +int sd_writeSector(LBA a, char *p1, char *p2){ + unsigned r,i; + SD_LED = 1; //turn on write LED + r = sd_sendCmd(24,(a<<9)); + if(r == 0){ + spi_putc(0xfe); //send Data Start byte + for(i=0;i<256;i++) //first 256 bytes + spi_putc(*p1++); + for(i=0;i<256;i++) //second 256 bytes + spi_putc(*p2++); + spi_putc(0xff); //send dummy CRC + spi_putc(0xff); + if((r=spi_putc(0xff) & 0x0f) == 0x05){ //check if data accepted + for(i=10000;i>0;i--){ + if(r=spi_putc(0xff)) + break; + } + } + else + r=0; //fail + } + CSel = 1; spi_putc(0xff); //disable SD + SD_LED = 0; //LED off + return(r); +} + +int sd_readSector(LBA a, char *p1, char *p2){ + int r,i; + SD_LED = 1; //turn on read LED + r = sd_sendCmd(17,(a<<9)); + if(r == 0){ //check if command was accepted + i=10000; //wait for a response + do{ + r = spi_putc(0xff); + if(r==0xfe) + break; + }while(--i > 0); + if(i){ //if no timeout, read 512 byte sector + for(i=0;i<256;i++) + *p1++ = spi_putc(0xff); + for(i=0;i<256;i++) + *p2++ = spi_putc(0xff); + spi_putc(0xff); //ignore CRC + spi_putc(0xff); + } + } + CSel = 1;spi_putc(0xff); //disable SD + SD_LED = 0; //read LED off + return(r == 0xfe); +} + +int sd_sendCmd(unsigned char c, LBA a){ + int i,r; + CSel = 0; //send command packet (6 bytes) + spi_putc(c|0x40); //send command & frame bit + spi_putc(a>>24); //send 32-bit address + spi_putc(a>>16); + spi_putc(a>>8); + spi_putc(a); + spi_putc(0x95); //send CRC + i = 9; //wait for response + do{ + r = spi_putc(0xff); //check if ready + if(r != 0xff) + break; + }while(--i > 0); + return(r); +} + +/* + void main(void){ + LBA addr; + int i,r; + trisd=0; + trisc=0b00010000; + CSel=1; //init chip select (active low) + LED=0; //LED off + osccon=0x72; //8MHz clock + osctune.6=0; //disable PLL + while(!osccon.IOFS); //wait for osc stable + sspstat = 0b00000000; //SMP(7)=0, CKE(6)=0 (clock edge idle to active) + sspcon1 = 0b00010010; //CKP(4)=1 clock polarity (idle high) + //SSPM3:SSPM0(3:0)=010 spi clock FOSC/64 (<400kHz) + sspcon1.SSPEN=1; //SSPEN(5)=1 enable SPI + for(i=0;i<256;i++){ //fill the send buffers + data1[i]=i; + data2[i]=i; + buffer1[i]=0; //and clear the receive buffers + buffer2[i]=0; + } + r=initMedia(); + if(r){ //card init failed - 1 blink + while(1){ + LED=1; + delay_ms(150); + LED=0; + delay_s(1); + } + } + else{ //write card + addr = 10000; + for(i=0;i<1000;i++){ + if(!writeSector(addr+i,data1,data2)){ + while(1){ //write failed - 2 blinks + LED=1; + delay_ms(150); + LED=0; + delay_ms(150); + LED=1; + delay_ms(150); + LED=0; + delay_s(1); + } + } + } + addr=10000; //verify write + for(i=0;i<1000;i++){ + if(!readSector(addr+i,buffer1,buffer2)){ + while(1){ //verify failed - 3 blinks + LED=1; + delay_ms(150); + LED=0; + delay_ms(150); + LED=1; + delay_ms(150); + LED=0; + delay_ms(150); + LED=1; + delay_ms(150); + LED=0; + delay_s(1); + } + } + + //verify + if(memcmp(data1,buffer1,256)||memcmp(data2,buffer2,256)){ + while(1){ //mismatch - 4 blinks + LED=1; + delay_ms(150); + LED=0; + delay_ms(150); + LED=1; + delay_ms(150); + LED=0; + delay_ms(150); + LED=1; + delay_ms(150); + LED=0; + delay_ms(150); + LED=1; + delay_ms(150); + LED=0; + delay_s(1); + } + } + } + } + while(1){ //success! + LED=1; + delay_s(1); + LED=0; + delay_s(1); + } +} +*/ \ No newline at end of file diff --git a/boostc/sdcard.h b/boostc/sdcard.h new file mode 100644 index 0000000..47a8f4d --- /dev/null +++ b/boostc/sdcard.h @@ -0,0 +1,10 @@ +#define CSel latd.2 //chip select line +#define SD_LED latd.1 + +typedef unsigned long LBA; + +void sd_init(void); +int sd_initMedia(void); +int sd_writeSector(LBA,char *,char *); +int sd_readSector(LBA, char *,char *); +int sd_sendCmd(unsigned char,LBA); \ No newline at end of file diff --git a/boostc/spi.c b/boostc/spi.c new file mode 100644 index 0000000..8d85f92 --- /dev/null +++ b/boostc/spi.c @@ -0,0 +1,17 @@ +#include +#include "spi.h" + + +void spi_init(){ + while(!osccon.IOFS){} //wait for osc stable + sspstat = 0b00000000; //SMP(7)=0, CKE(6)=0 (clock edge idle to active) + sspcon1 = 0b00010010; //CKP(4)=1 clock polarity (idle high) + //SSPM3:SSPM0(3:0)=010 spi clock FOSC/64 (<400kHz) + sspcon1.SSPEN=1; //SSPEN(5)=1 enable SPI +} + +unsigned char spi_putc(unsigned char send){ + sspbuf=send; + while(!sspstat.BF){} + return sspbuf; +} \ No newline at end of file diff --git a/boostc/spi.h b/boostc/spi.h new file mode 100644 index 0000000..cf75129 --- /dev/null +++ b/boostc/spi.h @@ -0,0 +1,3 @@ + +void spi_init(void); +unsigned char spi_putc(unsigned char); \ No newline at end of file diff --git a/boostc/usart.c b/boostc/usart.c new file mode 100644 index 0000000..1a019b6 --- /dev/null +++ b/boostc/usart.c @@ -0,0 +1,116 @@ +#include +#include "usart.h" +#include "util.h" + +void usart_init_core(void){ + // pins + trisc.7 = 1; + trisc.6 = 0; + + // baud rate + txsta.BRGH = BAUD_BRGH; + baudcon.BRG16 = BAUD_BRG16; + baudcon.WUE = 0; + + txsta.SYNC = 0; + rcsta.SPEN = 1; + + // transmitter + txsta.TXEN = 1; + pie1.TXIE = 0; + txsta.TX9 = 0; + + // reception + pie1.RCIE = 0; + rcsta.RX9 = 0; + rcsta.CREN = 1; +} + +void usart_init(void){ + // baud rate + spbrgh = (BAUD_RATE >> 8) & 0xff; + spbrg = BAUD_RATE & 0xff; + + usart_init_core(); +} + +/* +The Auto-Baud Rate Detection must receive a +byte with the value 55h (ASCII U) +*/ +void usart_init_auto(void){ + spbrg = 0; + spbrgh = 0; + + //baudcon.WUE = 1; + baudcon.ABDEN = 1; + + usart_init_core(); + + while(baudcon.ABDEN == 1){ + usart_getc(); + } +} + +void usart_putc(unsigned char data){ + while(!pir1.TXIF){ + delay_ms(1); + } + txreg = data; + + #ifdef TX_LED + TX_LED = 1; + delay_us(1); + TX_LED = 0; + #endif +} + +unsigned char usart_getc(void){ + while(!pir1.RCIF){ + delay_ms(1); + } + #ifdef RX_LED + RX_LED = 1; + delay_us(1); + RX_LED = 0; + #endif + + if (rcsta.OERR){ + rcsta.CREN = 0; + rcsta.CREN = 1; + } + return rcreg; +} + +void usart_gets(unsigned char *destination){ + while ((*destination++ = usart_getc()) != 0x0d); // wait until tx register is empty + *--destination = 0; +} + +void usart_puts(unsigned char *source){ + while (*source != 0) // wait until tx register is empty + usart_putc(*source++); +} + +void usart_putsln(unsigned char *source){ + usart_puts(source); + usart_put_newline(); +} + +void usart_put_newline(){ + usart_putc(0x0d); + usart_putc(0x0a); +} + +void usart_waitfor(unsigned char c){ + while(usart_getc() != c){} +} + +void usart_put_baoud(){ + usart_puts("Baud rate: 0x"); + usart_putc(bin2Hex( (spbrgh>>0x4) & 0x0f )); + usart_putc(bin2Hex( spbrgh & 0x0f )); + usart_putc(bin2Hex( (spbrg>>0x4) & 0x0f )); + usart_putc(bin2Hex( spbrg & 0x0f )); + usart_put_newline(); +} \ No newline at end of file diff --git a/boostc/usart.h b/boostc/usart.h new file mode 100644 index 0000000..ed60c1e --- /dev/null +++ b/boostc/usart.h @@ -0,0 +1,33 @@ +/*******************************************************************/ +// Defines +/*******************************************************************/ +//******* usart_init +// (FOSC/(4 x Baud rate)) -1 BRGH=1 BRG16=1 +// (FOSC/(16 x Baud rate)) -1 (BRGH=1 BRG16=0) or (BRGH=0 BRG16=1) - High speed +// (FOSC/(64 x Baud rate)) -1 BRGH=0 BRG16=0 - Low speed +//******* usart_init_auto +// BRG16=0 BRGH=0 => FOSC/512 +// BRG16=0 BRGH=1 => FOSC/128 +// BRG16=1 BRGH=0 => FOSC/128 +// BRG16=1 BRGH=1 => FOSC/32 +#define BAUD_RATE 0x0196 //0x0065 // 4800 +#define BAUD_BRGH 1 +#define BAUD_BRG16 1 + +#define TX_LED portb.4 +#define RX_LED portb.4 + +/*******************************************************************/ +// Functions +/*******************************************************************/ +void usart_init(void); +void usart_init_auto(void); +void usart_putc(unsigned char data); +unsigned char usart_getc(void); + +void usart_gets(unsigned char *destination); +void usart_puts(unsigned char *source); +void usart_putsln(unsigned char *source); +void usart_put_newline(void); +void usart_waitfor(unsigned char c); +void usart_put_baoud(void); diff --git a/boostc/util.c b/boostc/util.c new file mode 100644 index 0000000..92b3e51 --- /dev/null +++ b/boostc/util.c @@ -0,0 +1,39 @@ +#include +#include "util.h" +/*******************************************************************/ + +//Returns ASCII Decimal and Hex values +unsigned char bin2Hex(unsigned char x){ + //skip(x); + //#pragma return[16] = "0123456789ABCDEF" + + switch(x){ + case 0: return '0'; + case 1: return '1'; + case 2: return '2'; + case 3: return '3'; + case 4: return '4'; + case 5: return '5'; + case 6: return '6'; + case 7: return '7'; + case 8: return '8'; + case 9: return '9'; + case 10: return 'A'; + case 11: return 'B'; + case 12: return 'C'; + case 13: return 'D'; + case 14: return 'E'; + case 15: return 'F'; + } + + return '?'; +} +/*******************************************************************/ + +unsigned char swap ( unsigned char cX ){ + unsigned char tmp = (cX >> 4) & 0x0f; + cX = (cX << 4) & 0xf0; + cX = cX | tmp; + return cX; +} +/*******************************************************************/ \ No newline at end of file diff --git a/boostc/util.h b/boostc/util.h new file mode 100644 index 0000000..bdca3f5 --- /dev/null +++ b/boostc/util.h @@ -0,0 +1,10 @@ +/*******************************************************************/ +// Defines +/*******************************************************************/ + +/*******************************************************************/ +// Functions +/*******************************************************************/ +//unsigned char* bin2Hexs(unsigned char x); +unsigned char bin2Hex(unsigned char x); +unsigned char swap ( unsigned char cX ); diff --git a/c/util_z.c b/c/util_z.c deleted file mode 100644 index d68b6ae..0000000 --- a/c/util_z.c +++ /dev/null @@ -1,14 +0,0 @@ -// Delays a multiple of 1 milliseconds at 4 MHz -// using the TMR0 timer -void delay_ms( uns16 millisec){ - char next = 0; - - OPTION = 2; // prescaler divide TMR0 rate by 8 - TMR0 = 2; // deduct 2*8 fixed instruction cycles delay - do { - next += 125; - clrwdt(); // needed only if watchdog is enabled - while (TMR0 != next) // 125 * 8 = 1000 (= 1 ms) - ; - } while ( -- millisec != 0); -} \ No newline at end of file