PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : beispiel für ein software-uart



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

H.A.R.R.Y.
12.10.2005, 17:09
Wie verträgt er sich so mit anderen Interrupts? Bei höheren Baudraten befürchte ich da Timing-Probleme. Liegen Erfahrungen vor?

pebisoft
12.10.2005, 22:43
ich bin bis auf 115000bps gegangen.
ich habe am küchenbrettroboter alle möglichen interrups laufen.
datentransferstörungen habe ich nicht gehabt.
habe auf dauer auch nur 38400 eingestellt.
es ist ein beispiel für bastler zum weiterausbauen und zum lernen.
es können auch krumme werte genommen werden, wenn der empfang/senden auch wieder durch eigenprogrammierung gemacht wird.
mfg pebisoft