00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "uart_i.h"
00010 #include <stdlib.h>
00011 #include <avr/interrupt.h>
00012
00013 struct fifo{
00014 uint8_t * data;
00015 uint8_t read;
00016 uint8_t write;
00017 uint8_t count;
00018 uint8_t size;
00019
00020 };
00021
00022 volatile struct fifo send;
00023 volatile struct fifo receive;
00024
00025
00026 void put_regh_i(uint8_t byte){
00027 char i[4];
00028 itoa((char)byte,i,16);
00029 puts_i(i);
00030
00031
00032
00033 }
00034
00035 void put_regb_i(uint8_t byte){
00036 char i[9];
00037
00038 itoa(byte,i,2);
00039 puts_i(i);
00040 }
00041 int8_t fifo_putc(volatile struct fifo * f, int8_t data){
00042 if(f->count>=f->size)
00043 return 1;
00044 f->data[f->write]=data;
00045 f->write++;
00046 if((f->write)>(f->size-1)){
00047 f->write=0;
00048 }
00049
00050 cli();
00051 f->count++;
00052 sei();
00053
00054 return 0;
00055 }
00056
00057 int8_t fifo_getc(volatile struct fifo * f){
00058 int8_t data;
00059 if(f->count<=0)
00060 return 0;
00061 data=f->data[f->read];
00062 f->read++;
00063 if(f->read>f->size-1){
00064 f->read=0;
00065 }
00066 cli();
00067 f->count--;
00068 sei();
00069
00070 return data;
00071 }
00072
00073
00074 static inline int8_t init_fifos(int8_t send_size, int8_t receive_size ){
00075 int8_t ret=0;
00076
00077 send.data=malloc(send_size);
00078 if(send.data==NULL)
00079 ret -=1;
00080 send.count=0;
00081 send.size=send_size;
00082 send.read=0;
00083 send.write=0;
00084
00085
00086
00087 receive.data=malloc(receive_size);
00088 if(receive.data==NULL)
00089 ret -=2;
00090 receive.count=0;
00091 receive.size=receive_size;
00092 receive.read=0;
00093 receive.write=0;
00094
00095
00096 return ret;
00097 }
00098
00099
00100
00101 int8_t init_uart_int(int16_t ubrr,int8_t sendbuffersize, int8_t receivebuffersize){
00102
00103 int8_t ret=init_fifos(sendbuffersize, receivebuffersize);
00104 if(ret<0)
00105 return ret;
00106
00107
00108 UBRRH = (unsigned char)(ubrr>>8);
00109 UBRRL = (unsigned char)ubrr;
00110 cli();
00111
00112 UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
00113
00114 UCSRC = (1<<URSEL)|(3<<UCSZ0);
00115
00116
00117
00118 do
00119 {
00120
00121 UDR;
00122 }
00123 while (UCSRA & (1 << RXC));
00124 sei();
00125 return 1;
00126 }
00127 int8_t init_uart_int_default(){
00128 return init_uart_int(51,30,20);
00129 }
00130
00131 int8_t putc_i(volatile int8_t c){
00132 int8_t ret=fifo_putc(&send,c);
00133 sei();
00134 UCSRB |= (1<<UDRIE);
00135 return ret;
00136 }
00137
00138 int8_t getc_i(){
00139 int8_t ret=fifo_getc(&receive);
00140 return ret;
00141 }
00142
00143
00144 int8_t gets_i(int8_t * string,uint8_t length){
00145 int8_t c;
00146 int8_t i=0;
00147 while((c=getc_i())!=0&&i<=length){
00148 string[i]=c;
00149 i++;
00150 }
00151 return i;
00152 }
00153
00154 int8_t puts_i(char * string){
00155 int i;
00156
00157 for(i=0; string[i]!='\0';i++){
00158 if(putc_i((string[i]))!=0){
00159 return --i;
00160 }
00161
00162 }
00163
00164 return 0;
00165
00166 }
00167
00168 int8_t put_data_i(uint8_t * string, uint8_t length){
00169 int i;
00170
00171 for(i=0;(i<=length-1);i++){
00172 if(putc_i((string[i]))!=0){
00173 return --i;
00174 }
00175 UCSRB |= (1<<UDRIE);
00176 }
00177
00178 return 0;
00179
00180 }
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 ISR(SIG_UART_RECV){
00194 fifo_putc(&receive, UDR);
00195 }
00196
00197
00198
00199
00200
00201 ISR(SIG_UART_DATA){
00202 volatile int8_t c;
00203 c=fifo_getc(&send);
00204 if(c!=0){
00205 UDR=c;
00206 UCSRB |= (1<<UDRIE);
00207 return;
00208 }
00209
00210 }