ich weiß, das viele jetzt den Kopf schütteln werden, aber dennoch nehm ich den Lacher in kauf um eine Grundlegende Frage zu stellen.
Vorweg:
Fakt ist das die Übertragung wie folgt im kern stattfindet.
Startbit (L), bis zu 8 Datenbits, Parity Bit (L) und bis zu 2 StopBit (H).
Was sich mir nun aber entzieht, ist die Info, ob das Start, Parity und StopBit immer mitgesendet werden muß oder nur wenn man unter zB 5 MCUs ein Datennetzwerk aufbauen will, bzw ob diese Überhaupt atkiv übertragen werden müssen.
Habe mir in den letzten Wochen eine ASM-Procedure gebaut, auf avr-sim erfolgreich getestet, jedoch zeigt mir mein ATTiny85 und/oder RS232 - USB Umsetzer den Mittelfinger.
bei dem Test habe ich folgende Parameter ins Auge gefasst.
[*]8 MHz = 0,125 nS / CLK
[*]9600 Baud ~ 104,125 µS / Baud
[*]Fuses (-U lfuse:w:0x62:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m)
Code: Alles auswählen
procedure RS485_SendByte(value: byte); assembler; nostackframe;
label Daten, H_Bit, L_Bit, Loop_01, Loop_02, Loop_03, Loop_04,
Loop_05, Loop_06, Next;
asm
sei
sbi 23, _RX
ldi r16, 2 // Softteiler High alle Loops
ldi r17, 17 // Softteiler Low Start
ldi r20, 19 // Softteiler Low Parität
ldi r24, 3 // Zusatzschleife für Letztes Datenbit
ldi r21, 21 // Softteiler Low Stop
mov r22, value // Daten Kopieren
ldi r23, 8 // länge der Datanbits definieren
// Startbit senden
cbi 24, _RX
nop
Loop_01: // begin der ersten Schleife
dec r17
brne loop_01
dec r16
brne loop_01 // Dauer der Schleife = 104,125 µs
// Datenbyte senden
Daten:
ldi r16, 2
ldi r18, 16
ldi r19, 16
ror r22
brcs H_Bit
brcc L_Bit
// H_Datenbit senden
H_Bit:
nop
sbi 24, _RX
Loop_02:
dec r19
brne Loop_02
dec r16
brne Loop_02
rjmp Next
// L_Datenbit senden
L_Bit:
nop
cbi 24, _RX
Loop_03:
dec r18
brne Loop_03
dec r16
brne Loop_03
rjmp Next
Next:
dec r19
brne Daten
// Restschleife für das Letzte Datenbit
ldi r16, 2
Loop_04:
dec r24
brne Loop_04
nop
// Parity Bit senden Test ob Nötig (07.02.2022) https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Rs232_oscilloscope_trace.svg/330px-Rs232_oscilloscope_trace.svg.png
cbi 24, _RX
ldi r16, 2
Loop_05:
dec r20
brne Loop_05
dec r16
brne Loop_05
ldi r16, 2
nop
// Stop Bit senden
sbi 24, _RX
Loop_06:
dec r21
brne Loop_06
dec r16
brne Loop_06
cli
end;
DIes entspricht einer Datenübertragung von 9615,4 bis 9562,3 Baud und damit weit unter 1% was den fehler angeht.
Wünsche euch einen angenehmen Samstag
Gruß Maik