<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hae</id>
		<title>RN-Wissen.de - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hae"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Hae"/>
		<updated>2026-04-11T20:44:53Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=PIC_ASM_Beispiele&amp;diff=15703</id>
		<title>PIC ASM Beispiele</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=PIC_ASM_Beispiele&amp;diff=15703"/>
				<updated>2009-11-12T19:08:59Z</updated>
		
		<summary type="html">&lt;p&gt;Hae: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= PIC16(F/LF)XXX =&lt;br /&gt;
&lt;br /&gt;
== UART Routine ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232send&lt;br /&gt;
	banksel  	TXREG			; Zur Bank von TXREG umschalten&lt;br /&gt;
	movwf	        TXREG			; Move w to TXREG &lt;br /&gt;
	banksel	        PIR1			; Zur Bank von PIR1 umschalten&lt;br /&gt;
Waittx	&lt;br /&gt;
	btfss		PIR1, TXIF		; Wenn bit in PIR1,TXIF HIGH übergehe den nästen Befehl&lt;br /&gt;
	goto		Waittx			; Gehe zu WaitTX&lt;br /&gt;
	bcf		PIR1, TXIF 		; Interrupt Flag Löschen (Optionam muss nicht umbedinkt gemacht werden)&lt;br /&gt;
	return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schieberegister (z.b. CD4094) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	; Datenleitungen Schiberegister alles Ausgänge&lt;br /&gt;
	#define		CLK		PORTB, 0&lt;br /&gt;
	#define		D	 	PORTB, 1&lt;br /&gt;
	#define		STR		PORTB, 2&lt;br /&gt;
	#define		OE		PORTB, 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 cd4094_send&lt;br /&gt;
	banksel	PORTB&lt;br /&gt;
        bcf             OE&lt;br /&gt;
	bcf		STR&lt;br /&gt;
	btfsc	cdsend, 0&lt;br /&gt;
	bsf		D&lt;br /&gt;
	btfss		cdsend, 0&lt;br /&gt;
	bcf		D&lt;br /&gt;
	bsf		CLK&lt;br /&gt;
	bcf		CLK&lt;br /&gt;
	btfsc	cdsend, 1&lt;br /&gt;
	bsf		D&lt;br /&gt;
	btfss		cdsend, 1&lt;br /&gt;
	bcf		D&lt;br /&gt;
	bsf		CLK&lt;br /&gt;
	bcf		CLK&lt;br /&gt;
	btfsc	cdsend, 2&lt;br /&gt;
	bsf		D&lt;br /&gt;
	btfss		cdsend, 2&lt;br /&gt;
	bcf		D&lt;br /&gt;
	bsf		CLK&lt;br /&gt;
	bcf		CLK&lt;br /&gt;
	btfsc	cdsend, 3&lt;br /&gt;
	bsf		D&lt;br /&gt;
	btfss		cdsend, 3&lt;br /&gt;
	bcf		D&lt;br /&gt;
	bsf		CLK&lt;br /&gt;
	bcf		CLK&lt;br /&gt;
	btfsc	cdsend, 4&lt;br /&gt;
	bsf		D&lt;br /&gt;
	btfss		cdsend, 4&lt;br /&gt;
	bcf		D&lt;br /&gt;
	bsf		CLK&lt;br /&gt;
	bcf		CLK&lt;br /&gt;
	btfsc	cdsend, 5&lt;br /&gt;
	bsf		D&lt;br /&gt;
	btfss		cdsend, 5&lt;br /&gt;
	bcf		D&lt;br /&gt;
	bsf		CLK&lt;br /&gt;
	bcf		CLK&lt;br /&gt;
	btfsc	cdsend, 6&lt;br /&gt;
	bsf		D&lt;br /&gt;
	btfss		cdsend, 6&lt;br /&gt;
	bcf		D&lt;br /&gt;
	bsf		CLK&lt;br /&gt;
	bcf		CLK&lt;br /&gt;
	btfsc	cdsend, 7&lt;br /&gt;
	bsf		D&lt;br /&gt;
	btfss		cdsend, 7&lt;br /&gt;
	bcf		D&lt;br /&gt;
	bsf		CLK&lt;br /&gt;
	bcf		CLK&lt;br /&gt;
	bsf		STR&lt;br /&gt;
        bsf             OE&lt;br /&gt;
	return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Theborg|Theborg]] 23:13, 15. Sep 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
== MAX7456 (S/W OSD) ==&lt;br /&gt;
&lt;br /&gt;
Variabeln und I/0:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	cblock	0x70		; Variabeln ab 0x70 setzen alle Register max 16stk.&lt;br /&gt;
	SPI_DATA_WRITE		; Zu Sendene SPI Daten&lt;br /&gt;
	SPI_DATA_READ		; Gelesend SPI Daten&lt;br /&gt;
	m_char			; Maxim7456 und sda5708 Zeichen&lt;br /&gt;
	m_pos			; Maxim7456 Position&lt;br /&gt;
	endc 			; Variabeln setzen beenden&lt;br /&gt;
&lt;br /&gt;
	#define	SPI_CS	PORTC, 7; SPI Slave Select max7456&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	; PORTC&lt;br /&gt;
	banksel	TRISC			; auf Bank 1 umschalten&lt;br /&gt;
	movlw	B'10010000'		; PortC I/O setzen (1=In, 0=Out) (Reinfolge RC7,RC6...)&lt;br /&gt;
	movwf	TRISC			; PortC I/O setzen&lt;br /&gt;
	banksel	PORTC&lt;br /&gt;
	clrf	PORTC			; PortC auf 0 setzen&lt;br /&gt;
	; SPI&lt;br /&gt;
	banksel	SSPSTAT&lt;br /&gt;
	movlw	B'11000000'		; Mitlere Geschwindigkeit Output Time &lt;br /&gt;
	movwf	SSPSTAT&lt;br /&gt;
	banksel	SSPCON&lt;br /&gt;
	movlw	B'00100001'		; MODE 1,1, SPI MASTER, 1/16 Tosc SSP ON&lt;br /&gt;
	movwf	SSPCON&lt;br /&gt;
	banksel	PORTC&lt;br /&gt;
	bsf	SPI_CS			; SPI Slave Select aus (high)&lt;br /&gt;
	return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SPI  Sende/Enfangs Rotinen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SPI_Send&lt;br /&gt;
	banksel	PORTC&lt;br /&gt;
	bcf		SPI_CS			; Chip Select an (Low)&lt;br /&gt;
	nop&lt;br /&gt;
	nop&lt;br /&gt;
	nop&lt;br /&gt;
	banksel	SSPBUF&lt;br /&gt;
	movf	SPI_DATA_WRITE, W&lt;br /&gt;
	movwf	SSPBUF&lt;br /&gt;
	banksel	SSPSTAT&lt;br /&gt;
SPI_Wait&lt;br /&gt;
	btfss	SSPSTAT, BF		; Ist das Senden Komplet ?&lt;br /&gt;
	goto	SPI_Wait			; Wen nicht gehe zu SPIWait&lt;br /&gt;
	nop&lt;br /&gt;
	nop&lt;br /&gt;
	nop&lt;br /&gt;
	banksel	PORTC&lt;br /&gt;
	bsf 		SPI_CS			; Chip Select aus (High)&lt;br /&gt;
	return &lt;br /&gt;
SPI_Read&lt;br /&gt;
	banksel	PORTC&lt;br /&gt;
	bcf		SPI_CS&lt;br /&gt;
	nop&lt;br /&gt;
	nop&lt;br /&gt;
	nop&lt;br /&gt;
	banksel	SSPBUF&lt;br /&gt;
	movf	SSPBUF, W&lt;br /&gt;
	movwf	SPI_DATA_READ&lt;br /&gt;
	banksel	PORTC&lt;br /&gt;
	nop&lt;br /&gt;
	nop&lt;br /&gt;
	nop&lt;br /&gt;
	banksel	PORTC&lt;br /&gt;
	bsf		SPI_CS&lt;br /&gt;
	return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Defines ASCII to MAX7456 Charset und Config und Schreibrotienen (Achtung es kann sein das die #define nicht mit mpasm Funktioniert mit gpasm wird groß und kleinschreibung unterschiden):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
max7456_define				; Defines für den max7456 Zeichensatz&lt;br /&gt;
	#define	m_sp	0x00		; Space&lt;br /&gt;
	#define	m_1		0x01&lt;br /&gt;
	#define	m_2		0x02&lt;br /&gt;
	#define	m_3		0x03&lt;br /&gt;
	#define	m_4		0x04&lt;br /&gt;
	#define	m_5		0x05&lt;br /&gt;
	#define	m_6		0x06&lt;br /&gt;
	#define	m_7		0x07&lt;br /&gt;
	#define	m_8		0x08&lt;br /&gt;
	#define	m_9		0x09&lt;br /&gt;
	#define	m_0		0x0A&lt;br /&gt;
	#define	m_A		0x0B&lt;br /&gt;
	#define	m_B		0x0C&lt;br /&gt;
	#define	m_C		0x0D&lt;br /&gt;
	#define	m_D		0x0E&lt;br /&gt;
	#define	m_E		0x0F&lt;br /&gt;
	#define	m_F		0x10&lt;br /&gt;
	#define	m_G		0x11&lt;br /&gt;
	#define	m_H		0x12&lt;br /&gt;
	#define	m_I		0x13&lt;br /&gt;
	#define	m_J		0x14&lt;br /&gt;
	#define	m_K		0x15&lt;br /&gt;
	#define	m_L		0x16&lt;br /&gt;
	#define	m_M	0x17&lt;br /&gt;
	#define	m_N		0x18&lt;br /&gt;
	#define	m_O		0x19&lt;br /&gt;
	#define	m_P		0x1A&lt;br /&gt;
	#define	m_Q		0x1B&lt;br /&gt;
	#define	m_R		0x1C&lt;br /&gt;
	#define	m_S		0x1D&lt;br /&gt;
	#define	m_T		0x1E&lt;br /&gt;
	#define	m_U		0x1F&lt;br /&gt;
	#define	m_V		0x20&lt;br /&gt;
	#define	m_W	0x21&lt;br /&gt;
	#define	m_X		0x22&lt;br /&gt;
	#define	m_Y		0x23&lt;br /&gt;
	#define	m_Z		0x24&lt;br /&gt;
	#define	m_a		0x25&lt;br /&gt;
	#define	m_b		0x26&lt;br /&gt;
	#define	m_c		0x27&lt;br /&gt;
	#define	m_d		0x28&lt;br /&gt;
	#define	m_e		0x29&lt;br /&gt;
	#define	m_f		0x2A&lt;br /&gt;
	#define	m_g		0x2B&lt;br /&gt;
	#define	m_h		0x2C&lt;br /&gt;
	#define	m_i		0x2D&lt;br /&gt;
	#define	m_j		0x2E&lt;br /&gt;
	#define	m_k		0x2F&lt;br /&gt;
	#define	m_l		0x30&lt;br /&gt;
	#define	m_m		0x31&lt;br /&gt;
	#define	m_n		0x32&lt;br /&gt;
	#define	m_o		0x33&lt;br /&gt;
	#define	m_p		0x34&lt;br /&gt;
	#define	m_q		0x35&lt;br /&gt;
	#define	m_r		0x36&lt;br /&gt;
	#define	m_s		0x37&lt;br /&gt;
	#define	m_t		0x38&lt;br /&gt;
	#define	m_u		0x39&lt;br /&gt;
	#define	m_v		0x3A&lt;br /&gt;
	#define	m_w		0x3B&lt;br /&gt;
	#define	m_x		0x3C&lt;br /&gt;
	#define	m_y		0x3D&lt;br /&gt;
	#define	m_z		0x3E&lt;br /&gt;
	#define	m_KLa	0x3F	; (&lt;br /&gt;
	#define	m_KLz	0x40		; )&lt;br /&gt;
	#define	m_.		0x41&lt;br /&gt;
	#define	m_?		0x42&lt;br /&gt;
	#define	m_sem	0x43		; ;&lt;br /&gt;
	#define	m_:		0x44&lt;br /&gt;
	#define	m_ko	0x45		; ,&lt;br /&gt;
	#define	m_ag	0x46		; Agostroff&lt;br /&gt;
	#define	m_bs	0x47		; Backslasch&lt;br /&gt;
	#define	m_as	0x48		; Anfürungsstriche&lt;br /&gt;
	#define	m_minus  0x49		; Minus&lt;br /&gt;
	#define	m_ka	0x4A		; &amp;lt;&lt;br /&gt;
	#define	m_ga	0x4B	; &amp;gt;&lt;br /&gt;
	#define	m_at	0x4C	; @ oder at&lt;br /&gt;
	#define	m_wait	0xfb		; Wartezeichen&lt;br /&gt;
	#define	m_ls		0xf9		; Lautsprecher&lt;br /&gt;
	#define	m_lso	0xfa		; Tonsignal&lt;br /&gt;
	#define	m_ff		0xff		; Ausgefültes feld&lt;br /&gt;
	return&lt;br /&gt;
&lt;br /&gt;
max7456_conf					; Max7456 Config&lt;br /&gt;
	movlw	0x00				; VM0 Video Mode Register 0 (Write)&lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send&lt;br /&gt;
	movlw	B'01001000'		; 0 , 1=PAL, 00=Auto Sync, 1=Enable OSD, 0=Enable OSD immer, 0=SW RST, 0=Enable Video Buffer&lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send	&lt;br /&gt;
	movlw	0x01				; VM1 Video Mode Register 1&lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send&lt;br /&gt;
	movlw	B'00000100'		; 0 = NA, 000=Background MODE Brightness 100%, 11=Blinking Time 160ms, 00=Blinking Duty Cycle BT:BT&lt;br /&gt;
	movwf	SPI_DATA_WRITE&lt;br /&gt;
	call		SPI_Send	&lt;br /&gt;
	movlw	0x02				; HOS Horizontal Offset Register&lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send&lt;br /&gt;
	movlw	B'00101111'		; 00 = NA, 100000 = Horitzontal Offset&lt;br /&gt;
	movwf	SPI_DATA_WRITE&lt;br /&gt;
	call		SPI_Send	&lt;br /&gt;
	movlw	0x03				; VOS Vertical Offset Register&lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send&lt;br /&gt;
	movlw	B'00010111'		; 000 = NA, 10000 = Vertical Offset&lt;br /&gt;
	movwf	SPI_DATA_WRITE&lt;br /&gt;
	call		SPI_Send	&lt;br /&gt;
	return&lt;br /&gt;
&lt;br /&gt;
max7456_cls					; max7456 ausgabe Löschen&lt;br /&gt;
	movlw	0x00				; VM0 Video Mode Register 0 (Write)&lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send&lt;br /&gt;
	movlw	B'01001010'		; 0 , 1=PAL, 00=Auto Sync, 1=Enable OSD, 0=Enable OSD immer, 1=SW RST, 0=Enable Video Buffer&lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send	&lt;br /&gt;
	call		max7456_conf&lt;br /&gt;
	return&lt;br /&gt;
&lt;br /&gt;
max7456_add_high				; High adressbereich&lt;br /&gt;
	movlw	0x05				; Ersten 256 zeichen Low = 0x00, Letzten 256 Zeichen High=0xff &lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send&lt;br /&gt;
	movlw	0xFF&lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send	&lt;br /&gt;
	return&lt;br /&gt;
&lt;br /&gt;
max7456_add_low				; Low Adressbereich&lt;br /&gt;
	movlw	0x05				; Ersten 256 zeichen Low = 000, Letzten 256 Zeichen High=225 &lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send&lt;br /&gt;
	movlw	0x00&lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send	&lt;br /&gt;
	return&lt;br /&gt;
&lt;br /&gt;
max7456_send_char&lt;br /&gt;
	movlw	0x06				; Zeichen Position links nach rechts erste reihe 0-29, 30-......&lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send&lt;br /&gt;
	movf	m_pos, W&lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send	&lt;br /&gt;
	movlw	0x07				; Zeichen Sonderzeichen sihe Define in max7456.inc&lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send&lt;br /&gt;
	movf	m_char, W&lt;br /&gt;
	movwf	SPI_DATA_WRITE	&lt;br /&gt;
	call		SPI_Send	&lt;br /&gt;
	return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zeichen Senden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	movlw	D'12'			; Position&lt;br /&gt;
	movwf	m_pos&lt;br /&gt;
	movlw	m_e			; Zeichen (hier das kleine e) oder direkt den wert des Zeichens im MAX7456 REG.&lt;br /&gt;
	movwf	m_char&lt;br /&gt;
	call	max7456_send_char; Schreiben&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
High/low Adressbereich (low = ersten 256 Zeichen, High die letzten 128 Zeichen);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	call		max7456_add_low	; Low Adressbereich&lt;br /&gt;
	;call		max7456_add_high; Low Adressbereich&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Theborg|Theborg]] 23:13, 15. Sep 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
= PIC18(F/LF)xxxx =&lt;/div&gt;</summary>
		<author><name>Hae</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:FIFO_mit_avr-gcc&amp;diff=15702</id>
		<title>Diskussion:FIFO mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:FIFO_mit_avr-gcc&amp;diff=15702"/>
				<updated>2009-11-12T17:17:38Z</updated>
		
		<summary type="html">&lt;p&gt;Hae: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Erweiterungen ==&lt;br /&gt;
&lt;br /&gt;
Schön wäre es, wenn man auch einen FIFO-Überlauf oder HW-Fehler, wie Framing Error oder Overrun, melden würde.&lt;br /&gt;
Habe das für FIFO-Überlauf mal gemacht.&lt;br /&gt;
&lt;br /&gt;
Hier meine Erweiterungen zum Code:&lt;br /&gt;
&lt;br /&gt;
'''fifo.h'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum {&lt;br /&gt;
  Fifo_Overrun = 1&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
	unsigned char volatile count;       // # Zeichen im Puffer&lt;br /&gt;
	unsigned char size;                 // Puffer-Größe&lt;br /&gt;
	unsigned char *pread;               // Lesezeiger&lt;br /&gt;
	unsigned char *pwrite;              // Schreibzeiger&lt;br /&gt;
	unsigned char read2end, write2end;  // # Zeichen bis zum Überlauf Lese-/Schreibzeiger&lt;br /&gt;
        unsigned char state;&lt;br /&gt;
} fifo_t;&lt;br /&gt;
&lt;br /&gt;
static inline uint8_t&lt;br /&gt;
_inline_fifo_put (fifo_t *f, const uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char  write2end;&lt;br /&gt;
  unsigned char* pwrite;&lt;br /&gt;
  unsigned char  cRet;&lt;br /&gt;
&lt;br /&gt;
  cRet = 0;&lt;br /&gt;
&lt;br /&gt;
  if (f-&amp;gt;count &amp;gt;= f-&amp;gt;size)&lt;br /&gt;
  {&lt;br /&gt;
    f-&amp;gt;state = Fifo_Overrun;&lt;br /&gt;
    cRet = 1;&lt;br /&gt;
    goto end;&lt;br /&gt;
  }&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
end:&lt;br /&gt;
  return cRet;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static inline uint8_t &lt;br /&gt;
_inline_fifo_get (fifo_t *f)&lt;br /&gt;
{&lt;br /&gt;
	unsigned char* pread;&lt;br /&gt;
	unsigned char  data;&lt;br /&gt;
	unsigned char  read2end;&lt;br /&gt;
&lt;br /&gt;
  if (f-&amp;gt;state)	  return -2;&lt;br /&gt;
  if (!f-&amp;gt;count)  return -1;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dann noch eine Erweiterung. Ich lese nur ganze Zeilen von der seriellen Schnittstelle. Also fand ich es gut eine Funktion zu haben, die gleich im Fifo nach schaut, ob eine Zeile vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
'''fifo.c'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int fifo_gets (fifo_t *f, char *buf, int *len )&lt;br /&gt;
{&lt;br /&gt;
  unsigned char* pread;&lt;br /&gt;
  unsigned char  count;&lt;br /&gt;
  unsigned char  idx;&lt;br /&gt;
  int            result;&lt;br /&gt;
  unsigned char  read2end;&lt;br /&gt;
&lt;br /&gt;
  if (f-&amp;gt;state)	  return -2;&lt;br /&gt;
  if (!f-&amp;gt;count)  return -1;&lt;br /&gt;
&lt;br /&gt;
  pread    = f-&amp;gt;pread;&lt;br /&gt;
  count    = f-&amp;gt;count;&lt;br /&gt;
  read2end = f-&amp;gt;read2end;&lt;br /&gt;
&lt;br /&gt;
  result = 1;&lt;br /&gt;
  idx    = 0;&lt;br /&gt;
  while (count != 0)&lt;br /&gt;
  {&lt;br /&gt;
    count--;&lt;br /&gt;
&lt;br /&gt;
    if (read2end-- == 0)&lt;br /&gt;
    {&lt;br /&gt;
      read2end  = f-&amp;gt;size-1;&lt;br /&gt;
      pread    -= f-&amp;gt;size;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    buf[idx] = *(pread++);&lt;br /&gt;
    if (buf[idx] == '\n' || buf[idx] == '\r')&lt;br /&gt;
    {&lt;br /&gt;
      result = 0;&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
    idx++;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* Wenn ein \r\n gesendet wird ist beim ersten Lesen eine ganze Zeile&lt;br /&gt;
   * in buf. Beim zweiten Lesen nur 1 Zeichen. In der höherliegenden Logik,&lt;br /&gt;
   * wird immer eine sinnvolle komplette Zeile erwartet.&lt;br /&gt;
   * Deshalb wird eine &amp;quot;Zeile&amp;quot; mit nur einem Zeichen ignoriert.&lt;br /&gt;
   */&lt;br /&gt;
  if ((result == 0) &amp;amp;&amp;amp; (idx &amp;gt; 1))&lt;br /&gt;
  {&lt;br /&gt;
    f-&amp;gt;pread    = pread;&lt;br /&gt;
    f-&amp;gt;read2end = read2end;&lt;br /&gt;
&lt;br /&gt;
    f-&amp;gt;count    = count;&lt;br /&gt;
    *len = idx;&lt;br /&gt;
    buf[idx] = '\0';&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
     buf[0] = '\0';&lt;br /&gt;
     *len = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
 int fifo_get_nowait (fifo_t *b)&lt;br /&gt;
Liefert das nächste Byte aus der FIFO als int bzw. -1, falls die FIFO leer ist. &lt;br /&gt;
&lt;br /&gt;
Was machst du, wenn FF gespeichert ist ?  oder muß das nur für Text gehen ? &lt;br /&gt;
--PicNick 18:16, 4. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Wenn FF gespeichert ist, wird FF zurück geliefert. Die FIFOs speichern ihre Werte als unsigned. Der return-Wert ist int, mithin ist also &amp;lt;tt&amp;gt;255 != -1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Will man ein &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; lesen, dann so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
char zeichen;&lt;br /&gt;
int value;&lt;br /&gt;
if (value = fifo_get_nowait (&amp;amp;fifo), value &amp;gt;= 0)&lt;br /&gt;
   zeichen = (char) value;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
bzw. man schreibt &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt; direkt nach UDR oder wohin auch immer. --[[Benutzer:SprinterSB|SprinterSB]] 19:04, 4. Mär 2006 (CET)&lt;br /&gt;
----&lt;br /&gt;
d.h. du verwendest die Bits &amp;gt;8 implizit als Schalter ? naja. &lt;br /&gt;
--PicNick 08:59, 5. Mär 2006 (CET)&lt;br /&gt;
----&lt;br /&gt;
In der FIFO stehen ja nur Werte &amp;gt;= 0. Und der Rückgabewert ist auch immer &amp;gt;= 0, wenn was drinne ist, ansonsten eben &amp;lt;0. Ich erweitere also den Wertebereich. Ausserdem kann auf &amp;lt;0 sehr effizient getestet werden. Wie würdest du es machen? --[[Benutzer:SprinterSB|SprinterSB]] 09:59, 5. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Mach nur, die Geschmäcker sind halt verschieden, absolute Wahrheiten gibt's nicht. Ich trenne immer Frage und Abholen, wobei die Frage immer non-destruktiv nach der verfügbaren Länge ist. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while (fifo_data() &amp;gt;= required_length ) // anzahl im Buffer&lt;br /&gt;
{&lt;br /&gt;
      Uns_16 = fifo_read_short()  // oder ähnlich&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beispiel: Bei IP etc. hab immer 16 Bit als Länge vorn, da lese ich z.B. erst, wenn die auch da sind. Und dann erst weiter, wenn der record komplett ist. Aber für eine Controller-UART etc. ist das vielleicht auch etwas über-drüber. &lt;br /&gt;
--PicNick 12:05, 5. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
Jo, das geht auch. Auf &amp;lt;tt&amp;gt;fifo.count&amp;lt;/tt&amp;gt; kann man ja frei zugreifen. Beim nachfolgenden Lesen sind aber evtl. mehr Zeichen im Puffer, was bei den meisten Anwendungen nicht stört. Es sollte nur ein einfaches Grundgerüst sein, das man nach eigenem Gusto erweitern kann, etwa&lt;br /&gt;
 static inline int fifo_contains_at_least_n_bytes_p (const fifo_t * f, const unsigned char num) { f-&amp;gt;count &amp;gt;= num; }&lt;br /&gt;
&lt;br /&gt;
Noch praktischer wäre natürlich eine FIFO, in der man ganze Objekte speichern kann, und nicht nur einzelne Bytes... --[[Benutzer:SprinterSB|SprinterSB]] 22:32, 5. Mär 2006 (CET)&lt;br /&gt;
----&lt;br /&gt;
*g* Wenn du Objecte auch als solches reinkriegst, is besser, du legst sie gleich als verkettete Liste an. das ist natürlich mit Heap einiges einfacher. Für Controller wird's da aber eng. geht meist eh' nur ums UART-buffern.&lt;br /&gt;
--PicNick 07:59, 6. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
== habe ich hier ein sei(); übersehen ? ==&lt;br /&gt;
&lt;br /&gt;
Hallo Sprinter :-)&lt;br /&gt;
&lt;br /&gt;
Ich analysiere gerade deine FIFO Puffer, klasse !&lt;br /&gt;
&lt;br /&gt;
Nur eine Frage stellt sich noch, hier&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        uint8_t sreg = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	f-&amp;gt;count--;&lt;br /&gt;
	SREG = sreg;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muß da nicht noch ein sei(); hin&amp;lt;br/&amp;gt;&lt;br /&gt;
Oder hab ich da was übersehen ?&amp;lt;br/&amp;gt;&lt;br /&gt;
Gruß Sebastian&lt;br /&gt;
--[[Benutzer:Izaseba|izaseba]] 21:34, 23. Apr 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:Hi Sebastian. Durch die letzte Anweisung wird das SREG und insbesondere das darin befindliche I-Flag wieder so hergestellt, wie es ursprünglich war. Wenn der Code immer in einem Kontext ausgeführt wird, in dem Interrupts global aktiviert sind, dann geht es mit einer CLI/SEI-Klammer natürlich etwas simpler. --[[Benutzer:SprinterSB|SprinterSB]] 12:53, 12. Mai 2007 (CEST)&lt;/div&gt;</summary>
		<author><name>Hae</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:FIFO_mit_avr-gcc&amp;diff=15701</id>
		<title>Diskussion:FIFO mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:FIFO_mit_avr-gcc&amp;diff=15701"/>
				<updated>2009-11-12T17:15:51Z</updated>
		
		<summary type="html">&lt;p&gt;Hae: Erweiterungsvorschläge&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schön wäre es, wenn man auch einen FIFO-Überlauf oder HW-Fehler, wie Framing Error oder Overrun, melden würde.&lt;br /&gt;
Habe das für FIFO-Überlauf mal gemacht.&lt;br /&gt;
&lt;br /&gt;
Hier meine Erweiterungen zum Code:&lt;br /&gt;
&lt;br /&gt;
'''fifo.h'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum {&lt;br /&gt;
  Fifo_Overrun = 1&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
	unsigned char volatile count;       // # Zeichen im Puffer&lt;br /&gt;
	unsigned char size;                 // Puffer-Größe&lt;br /&gt;
	unsigned char *pread;               // Lesezeiger&lt;br /&gt;
	unsigned char *pwrite;              // Schreibzeiger&lt;br /&gt;
	unsigned char read2end, write2end;  // # Zeichen bis zum Überlauf Lese-/Schreibzeiger&lt;br /&gt;
  unsigned char state;&lt;br /&gt;
} fifo_t;&lt;br /&gt;
&lt;br /&gt;
static inline uint8_t&lt;br /&gt;
_inline_fifo_put (fifo_t *f, const uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
  unsigned char  write2end;&lt;br /&gt;
  unsigned char* pwrite;&lt;br /&gt;
  unsigned char  cRet;&lt;br /&gt;
&lt;br /&gt;
  cRet = 0;&lt;br /&gt;
&lt;br /&gt;
  if (f-&amp;gt;count &amp;gt;= f-&amp;gt;size)&lt;br /&gt;
  {&lt;br /&gt;
    f-&amp;gt;state = Fifo_Overrun;&lt;br /&gt;
    cRet = 1;&lt;br /&gt;
    goto end;&lt;br /&gt;
  }&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
end:&lt;br /&gt;
  return cRet;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static inline uint8_t &lt;br /&gt;
_inline_fifo_get (fifo_t *f)&lt;br /&gt;
{&lt;br /&gt;
	unsigned char* pread;&lt;br /&gt;
	unsigned char  data;&lt;br /&gt;
	unsigned char  read2end;&lt;br /&gt;
&lt;br /&gt;
  if (f-&amp;gt;state)	  return -2;&lt;br /&gt;
  if (!f-&amp;gt;count)  return -1;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dann noch eine Erweiterung. Ich lese nur ganze Zeilen von der seriellen Schnittstelle. Also fand ich es gut eine Funktion zu haben, die gleich im Fifo nach schaut, ob so eine Funktion vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
'''fifo.c'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int fifo_gets (fifo_t *f, char *buf, int *len )&lt;br /&gt;
{&lt;br /&gt;
  unsigned char* pread;&lt;br /&gt;
  unsigned char  count;&lt;br /&gt;
  unsigned char  idx;&lt;br /&gt;
  int            result;&lt;br /&gt;
  unsigned char  read2end;&lt;br /&gt;
&lt;br /&gt;
  if (f-&amp;gt;state)	  return -2;&lt;br /&gt;
  if (!f-&amp;gt;count)  return -1;&lt;br /&gt;
&lt;br /&gt;
  pread    = f-&amp;gt;pread;&lt;br /&gt;
  count    = f-&amp;gt;count;&lt;br /&gt;
  read2end = f-&amp;gt;read2end;&lt;br /&gt;
&lt;br /&gt;
  result = 1;&lt;br /&gt;
  idx    = 0;&lt;br /&gt;
  while (count != 0)&lt;br /&gt;
  {&lt;br /&gt;
    count--;&lt;br /&gt;
&lt;br /&gt;
    if (read2end-- == 0)&lt;br /&gt;
    {&lt;br /&gt;
      read2end  = f-&amp;gt;size-1;&lt;br /&gt;
      pread    -= f-&amp;gt;size;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    buf[idx] = *(pread++);&lt;br /&gt;
    if (buf[idx] == '\n' || buf[idx] == '\r')&lt;br /&gt;
    {&lt;br /&gt;
      result = 0;&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
    idx++;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* Wenn ein \r\n gesendet wird ist beim ersten Lesen eine ganze Zeile&lt;br /&gt;
   * in buf. Beim zweiten Lesen nur 1 Zeichen. In der höherliegenden Logik,&lt;br /&gt;
   * wird immer eine sinnvolle komplette Zeile erwartet.&lt;br /&gt;
   * Deshalb wird eine &amp;quot;Zeile&amp;quot; mit nur einem Zeichen ignoriert.&lt;br /&gt;
   */&lt;br /&gt;
  if ((result == 0) &amp;amp;&amp;amp; (idx &amp;gt; 1))&lt;br /&gt;
  {&lt;br /&gt;
    f-&amp;gt;pread    = pread;&lt;br /&gt;
    f-&amp;gt;read2end = read2end;&lt;br /&gt;
&lt;br /&gt;
    f-&amp;gt;count    = count;&lt;br /&gt;
    *len = idx;&lt;br /&gt;
    buf[idx] = '\0';&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
     buf[0] = '\0';&lt;br /&gt;
     *len = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
 int fifo_get_nowait (fifo_t *b)&lt;br /&gt;
Liefert das nächste Byte aus der FIFO als int bzw. -1, falls die FIFO leer ist. &lt;br /&gt;
&lt;br /&gt;
Was machst du, wenn FF gespeichert ist ?  oder muß das nur für Text gehen ? &lt;br /&gt;
--PicNick 18:16, 4. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Wenn FF gespeichert ist, wird FF zurück geliefert. Die FIFOs speichern ihre Werte als unsigned. Der return-Wert ist int, mithin ist also &amp;lt;tt&amp;gt;255 != -1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Will man ein &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; lesen, dann so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
char zeichen;&lt;br /&gt;
int value;&lt;br /&gt;
if (value = fifo_get_nowait (&amp;amp;fifo), value &amp;gt;= 0)&lt;br /&gt;
   zeichen = (char) value;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
bzw. man schreibt &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt; direkt nach UDR oder wohin auch immer. --[[Benutzer:SprinterSB|SprinterSB]] 19:04, 4. Mär 2006 (CET)&lt;br /&gt;
----&lt;br /&gt;
d.h. du verwendest die Bits &amp;gt;8 implizit als Schalter ? naja. &lt;br /&gt;
--PicNick 08:59, 5. Mär 2006 (CET)&lt;br /&gt;
----&lt;br /&gt;
In der FIFO stehen ja nur Werte &amp;gt;= 0. Und der Rückgabewert ist auch immer &amp;gt;= 0, wenn was drinne ist, ansonsten eben &amp;lt;0. Ich erweitere also den Wertebereich. Ausserdem kann auf &amp;lt;0 sehr effizient getestet werden. Wie würdest du es machen? --[[Benutzer:SprinterSB|SprinterSB]] 09:59, 5. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Mach nur, die Geschmäcker sind halt verschieden, absolute Wahrheiten gibt's nicht. Ich trenne immer Frage und Abholen, wobei die Frage immer non-destruktiv nach der verfügbaren Länge ist. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while (fifo_data() &amp;gt;= required_length ) // anzahl im Buffer&lt;br /&gt;
{&lt;br /&gt;
      Uns_16 = fifo_read_short()  // oder ähnlich&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beispiel: Bei IP etc. hab immer 16 Bit als Länge vorn, da lese ich z.B. erst, wenn die auch da sind. Und dann erst weiter, wenn der record komplett ist. Aber für eine Controller-UART etc. ist das vielleicht auch etwas über-drüber. &lt;br /&gt;
--PicNick 12:05, 5. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
Jo, das geht auch. Auf &amp;lt;tt&amp;gt;fifo.count&amp;lt;/tt&amp;gt; kann man ja frei zugreifen. Beim nachfolgenden Lesen sind aber evtl. mehr Zeichen im Puffer, was bei den meisten Anwendungen nicht stört. Es sollte nur ein einfaches Grundgerüst sein, das man nach eigenem Gusto erweitern kann, etwa&lt;br /&gt;
 static inline int fifo_contains_at_least_n_bytes_p (const fifo_t * f, const unsigned char num) { f-&amp;gt;count &amp;gt;= num; }&lt;br /&gt;
&lt;br /&gt;
Noch praktischer wäre natürlich eine FIFO, in der man ganze Objekte speichern kann, und nicht nur einzelne Bytes... --[[Benutzer:SprinterSB|SprinterSB]] 22:32, 5. Mär 2006 (CET)&lt;br /&gt;
----&lt;br /&gt;
*g* Wenn du Objecte auch als solches reinkriegst, is besser, du legst sie gleich als verkettete Liste an. das ist natürlich mit Heap einiges einfacher. Für Controller wird's da aber eng. geht meist eh' nur ums UART-buffern.&lt;br /&gt;
--PicNick 07:59, 6. Mär 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
== habe ich hier ein sei(); übersehen ? ==&lt;br /&gt;
&lt;br /&gt;
Hallo Sprinter :-)&lt;br /&gt;
&lt;br /&gt;
Ich analysiere gerade deine FIFO Puffer, klasse !&lt;br /&gt;
&lt;br /&gt;
Nur eine Frage stellt sich noch, hier&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        uint8_t sreg = SREG;&lt;br /&gt;
	cli();&lt;br /&gt;
	f-&amp;gt;count--;&lt;br /&gt;
	SREG = sreg;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muß da nicht noch ein sei(); hin&amp;lt;br/&amp;gt;&lt;br /&gt;
Oder hab ich da was übersehen ?&amp;lt;br/&amp;gt;&lt;br /&gt;
Gruß Sebastian&lt;br /&gt;
--[[Benutzer:Izaseba|izaseba]] 21:34, 23. Apr 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:Hi Sebastian. Durch die letzte Anweisung wird das SREG und insbesondere das darin befindliche I-Flag wieder so hergestellt, wie es ursprünglich war. Wenn der Code immer in einem Kontext ausgeführt wird, in dem Interrupts global aktiviert sind, dann geht es mit einer CLI/SEI-Klammer natürlich etwas simpler. --[[Benutzer:SprinterSB|SprinterSB]] 12:53, 12. Mai 2007 (CEST)&lt;/div&gt;</summary>
		<author><name>Hae</name></author>	</entry>

	</feed>