- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 4 von 4

Thema: hilfe bei software-uart-asm für winavr-c umsetzen

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941

    hilfe bei software-uart-asm für winavr-c umsetzen

    Anzeige

    E-Bike
    hallo, ich habe ein asm-beispiel von einer sofware-uart-asm von fastavr-basic.
    AVR16 mit 8mhz ,output an pinb1 und input an pinb0 mit 9600 bps.
    hinter ...end of basic... fängt der code an.
    könnte man den für winavr-c so schreiben als asm-code das er in der speziellen
    "S"-code form kommt und dann mit eingebunden wird. ich weiss unter anderem nicht,
    wie die variable an das programm übergeben wird, wo entweder der string ausgelesen
    wird oder reingepackt wird.
    dieses ist asm-code, wie er von fastavr-basic erstellt wird und dann anschliessend mit
    dem compiler von avrstudio compiliert wird.
    diese beiden programme laufen sauber auf meinem robby.
    die wait-ticks sind zur für 8mhz und 9600 bps.
    da hier öfters fragen hinsichtlich software-uart aufgekommen sind , unter anderem von mir
    wäre es nett, wenn ein winavrc-spezialist den mal umsetzen könnte.
    den einführungshaeder für org. usw habe ich weggelassen.
    mfg pebisoft

    Code:
    input---input---input-input---input---input
    ;******	BASIC CODE **********************
    
    ;-Line--0008----Open Com=PORTB.1,9600 For Input As #1--
    		sbi 	PORTB,1
    
    ;-Line--0010----Input #1, text--
    		ldi 	r25,10
    		ldi 	xl,Low(text)
    		ldi	xh,high(text)
    		call	_InS1
    
    ;-Line--0012----End--
    L0000:
    		jmp	L0000
    
    
    ;****** End OF BASIC CODE ****************
    
    ;////// Com1Input /////////////////////////
    _Com1I:		ldi	r24,0x09
    _C1I1:		sbic	PINB,1
    		rjmp	_C1I1
    		ldi	r23,135
    		rcall	_Wtic
    _C1I2:		ldi	r23,135
    		rcall	_Wtic
    		ldi	r23,135
    		rcall	_Wtic
    		clc
    		sbic	PINB,1
    		sec
    		dec	r24
    		breq	_C1I3
    		ror	zl
    		rjmp	_C1I2
    _C1I3:	ret
    
    ;////// Soft Input On Com1 ///////////////
    _SIC1:		ldi	xl,Low(RAMEND - 32)
    		ldi	xh,high(RAMEND - 32)
    		ldi	r25,0x06
    _InS1:	rcall	_Com1I
    		cpi	zl,0x0a
    		breq	_InS1
    		cpi	zl,0x0d
    		breq	_InE1
    		cpi	zl,0x08
    		breq	_InB1
    		tst	r25
    		breq	_InS1
    		st	X+,zl
    		dec	r25
    		rjmp	_InS1
    _InE1:	        clr	zl
    		st	X,zl
    		ret
    _InB1:	        inc	r25
    		sbiw	xl,0x01
    		rjmp	_InS1
    
    
    ;////// Wait r23 ticks /////////////////////
    _Wtic:	        dec	r23
    		brne	_Wtic
    		ret
    
    
    
    
    
    print---print-----print-print---print-----print
    ;******	BASIC CODE **********************
    
    ;-Line--0008----Open Com=PORTB.0,9600 For Output As #1--
    		sbi	PORTB,0
    		sbi	DDRB,0
    
    ;-Line--0010----text="pebi"--
    		ldi	zl,Low(S000*2)
    		ldi	zh,high(S000*2)
    		ldi	r20,11
    		ldi	xl,Low(text)
    		ldi	xh,high(text)
    		call	_StStC
    
    ;-Line--0012----Print #1, text--
    		ldi	zl,Low(text)
    		ldi	zh,high(text)
    		call	_PC1St
    		call	_C1OCL
    
    ;-Line--0013----End--
    L0000:
    		jmp	L0000
    
    
    ;****** End OF  BASIC CODE ****************
    
    ; String constants:
    S000:	.db	"pebi", 0
    
    ;////// StoreStrConst /////////////////////
    _StStC: 	tst	r20
    		breq	_StSC4
    _StSC3:	lpm
    		tst	r0
    		breq	_StSC2
    		dec		r20
    		breq	_StSC1
    		st		X+,r0
    		adiw	zl,0x01
    		rjmp	_StSC3
    _StSC1:	   clr		r0
    _StSC2:    st	    X+,r0
    		sbiw	xl,0x01
    _StSC4:	ret
    
    ;////// Print String //////////////////////
    _PC1St:	        ld	r24,Z+
    		tst	r24
    		breq	_PC1S1
    		rcall	_Com1O
    		rjmp	_PC1St
    _PC1S1:	ret
    
    ;////// Print Cr, Lf On Com1 //////////////
    _C1OCL:	        ldi	r24,0x0d
    		rcall	_Com1O
    		ldi	r24,0x0a
    
    ;////// Com1Out /////////////////////////////
    _Com1O:	        ldi	r25,10
    		Com	r24
    		sec
    _C1O0:	        brcc	_C1O1
    		cbi	PORTB,0
    		rjmp	_C1O2
    _C1O1:	        sbi	PORTB,0
    		Nop
    _C1O2:	        ldi	r23,135
    		rcall	_Wtic
    		ldi	r23,135
    		rcall	_Wtic
    		lsr	r24
    		dec	r25
    		brne	_C1O0
    		ret
    
    ;////// Wait r23 ticks /////////////////////
    _Wtic:	        dec	r23
    		brne	_Wtic
    		ret

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    ich brauche 4x rx und 4x tx, wie kann man dein vorschlagsprogramm ändern, das es diese 4 schnittstellen bewältigen kann.
    mfg pebisoft

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Uiii. 4 x Tx ist durchaus machbar, mit und ohne Interrupt. Aber mehrere (gleichzeitig aktive) SW-Receive UARTs sind ein verschärftes Problem.
    Du siehst ja auch in dem ASM vom FastAvr, daß er nur bei EINER UART empfangen kann.

    Hier lauert er auf das Startbit vom PinB.1:
    Zitat Zitat von FastAVR
    _C1I1: sbic PINB,1 ; startbit ?
    rjmp _C1I1 ;nö, weiter warten
    ldi r23,135 ; ja, startbit ist da, es geht weiter.
    Aus dieser Schleife kommt er erst raus, wenn ein Startbit da ist. Kommt es nicht, wartet er bis ewig

    (Dieses Verhalten haben praktisch alle gängigen SW-UARTen, die einen beliebigen Pin als Input zulassen)

    Nochmal: SW UART für Output machen alle pipifein, von Bascom bis sonstwohin.
    dagegen ist SW UART für mehrere INPUTs ohne Hardware-unterstützung einigermaßen problematisch
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests