123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- /*----------------------------------------------------------------------------
- Copyright: Radig Ulrich mailto: mail@ulrichradig.de
- Author: Radig Ulrich
- Remarks:
- known Problems: none
- Version: 24.10.2007
- Description: RS232 Routinen
- Dieses Programm ist freie Software. Sie können es unter den Bedingungen der
- GNU General Public License, wie von der Free Software Foundation veröffentlicht,
- weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder
- (nach Ihrer Option) jeder späteren Version.
- Die Veröffentlichung dieses Programms erfolgt in der Hoffnung,
- daß es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE,
- sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT
- FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
- Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
- Programm erhalten haben.
- Falls nicht, schreiben Sie an die Free Software Foundation,
- Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
- ------------------------------------------------------------------------------*/
- #include "usart.h"
-
- //----------------------------------------------------------------------------
- //Init serielle Schnittstelle
- void usart_init(unsigned long baudrate)
- {
- //Serielle Schnittstelle 1
- //Enable TXEN im Register UCR TX-Data Enable
- UCR =(1 << TXEN | 1 << RXEN | 1<< RXCIE);
- // 0 = Parity Mode Disabled
- // 1 = Parity Mode Enabled, Even Parity
- // 2 = Parity Mode Enabled, Odd Parity
- //UCSRC = 0x06 + ((parity+1)<<4);
- //UCSRC |= (1<<USBS);
- //Teiler wird gesetzt
- UBRR=(F_CPU / (baudrate * 16L) - 1);
- }
- //----------------------------------------------------------------------------
- //Routine für die Serielle Ausgabe eines Zeichens (Schnittstelle0)
- void usart_write_char(char c)
- {
- //Warten solange bis Zeichen gesendet wurde
- while(!(USR & (1<<UDRE)));
- //Ausgabe des Zeichens
- UDR = c;
- return;
- }
- //------------------------------------------------------------------------------
- void usart_write_P (const char *Buffer,...)
- {
- va_list ap;
- va_start (ap, Buffer);
-
- int format_flag;
- char str_buffer[10];
- char str_null_buffer[10];
- char move = 0;
- char Base = 0;
- int tmp = 0;
- char by;
- char *ptr;
-
- //Ausgabe der Zeichen
- for(;;)
- {
- by = pgm_read_byte(Buffer++);
- if(by==0) break; // end of format string
-
- if (by == '%')
- {
- by = pgm_read_byte(Buffer++);
- if (isdigit(by)>0)
- {
-
- str_null_buffer[0] = by;
- str_null_buffer[1] = '\0';
- move = atoi(str_null_buffer);
- by = pgm_read_byte(Buffer++);
- }
- switch (by)
- {
- case 's':
- ptr = va_arg(ap,char *);
- while(*ptr) { usart_write_char(*ptr++); }
- break;
- case 'b':
- Base = 2;
- goto ConversionLoop;
- case 'c':
- //Int to char
- format_flag = va_arg(ap,int);
- usart_write_char (format_flag++);
- break;
- case 'i':
- Base = 10;
- goto ConversionLoop;
- case 'o':
- Base = 8;
- goto ConversionLoop;
- case 'x':
- Base = 16;
- //****************************
- ConversionLoop:
- //****************************
- itoa(va_arg(ap,int),str_buffer,Base);
- int b=0;
- while (str_buffer[b++] != 0){};
- b--;
- if (b<move)
- {
- move -=b;
- for (tmp = 0;tmp<move;tmp++)
- {
- str_null_buffer[tmp] = '0';
- }
- //tmp ++;
- str_null_buffer[tmp] = '\0';
- strcat(str_null_buffer,str_buffer);
- strcpy(str_buffer,str_null_buffer);
- }
- usart_write_str (str_buffer);
- move =0;
- break;
- }
-
- }
- else
- {
- usart_write_char ( by );
- }
- }
- va_end(ap);
- }
- //----------------------------------------------------------------------------
- //Ausgabe eines Strings
- void usart_write_str(char *str)
- {
- while (*str)
- {
- usart_write_char(*str++);
- }
- }
|