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







Zitieren
Lesezeichen