software-uart "print" und software-uart "input" über "interrupt0"
für einen AVR16 mit 8mhz über asm realisiert.
ist leicht umzusetzen in winavr-c (dort kann der asm-code eingebunden werden) und für Bascom (natürlich hat Bascom auch software-uart) ein interessantes experiement.
gerade in winavr-c habe ich immer wieder danach gesucht über eine weitere schnittstelle daten zu transportieren zu einem anderen gerät.
die normalen routinen für die variablen und ausgabe hat winavr-c auch.
diese routine wurde aus dem fastavr-basic-asm-source gefertigt.
mfg pebisoft

Code:
' input
' AVR16 8mhz und wtic=66 (19200bps), wtic=135 (9600bps) an pind2 (int0)
$Device= m16     
$Stack = 32     
$Clock = 8 
$Lcd = PORTC.0, RS=PORTC.5, EN=PORTC.4, 16, 2
$Source= On   

Declare Interrupt Int0()
Declare Sub lcd_ausgabe()

Dim a As Byte

Int0 Falling
Enable Int0            
Enable Interrupts

Do

WaitMs 100

Loop

End

Interrupt Int0(), Save 2
   Disable Int0   
   Enable Interrupts   
   $Asm
   __Com1I: ldi     r24,0x09
            ldi     r23,66
            rcall   __Wtic
  __C1I2:   ldi     r23,66
            rcall   __Wtic
            ldi     r23,66
            rcall   __Wtic
            clc
            sbic    PIND,2
            sec
            dec    r24
            breq   __ende
            ror    zl
            rjmp  __C1I2

   __Wtic:  dec   r23
            brne  __Wtic
            ret 
         
   __ende: sts  a,zl
   $EndAsm
   lcd_ausgabe()
   Reset Int0            
   Enable Int0            
End Interrupt   

Sub lcd_ausgabe()
   Cls
   Lcd a
End Sub   


' print
' AVR16 8mhz und wtic=66 (19200bps), wtic=135 (9600bps)  an pinb1 zum beispiel
$Device= m16     
$Stack = 32     
$Clock = 8 
$Source= On   

Dim wert As Byte

Declare Sub test()

DDRB.1=1
PORTB.1=1

Do

For wert=0 To 15
   WaitMs 255
   test()
Next

Loop

End

Sub test()
   $Asm
   lds  r24,wert
   __Com1O:  ldi   r25,10
             Com   r24
             sec
   __C1O0:   brcc  __C1O1
             cbi   PORTB,1
             rjmp  __C1O2
   __C1O1:   sbi   PORTB,1
             Nop
   __C1O2:  ldi   r23,66
            rcall __Wtic
            ldi    r23,66
            rcall  __Wtic
             lsr      r24
            dec   r25
            brne  __C1O0
            rjmp  __ende
       
   __Wtic: dec   r23
           brne   __Wtic
           ret

   __ende:      
   $EndAsm
End Sub