pebisoft
11.10.2005, 20:58
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
' 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
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
' 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
' 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