PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Serielle Ausgabe - Abbruch



wurm
12.02.2009, 18:17
Hallo,

hab da ein Problem mit der seriellen Ausgabe von Zeichen.
Ich habe die Schaltung wie im Anhang und messe dort am MAX485 auf dem Bus A und Bus B.

Die Software, s. Anhang, sendet 1000mal das Zeichen "d".
In der markierten Zeile ist eine Wartefunktion. Wird hier 20ms gewartet, werden die Zeichen vom Atmega128 auch korrekt auf den Bus-Leitungen übertragen. Setze ich die Wartezeit auf 2ms herab, so werden nur noch teilweise die Zeichen übertragen (von den 1000 Stück max. 150).

Kurz zum Programmablauf:
-Ich setze den 485-Bus auf senden
-Warte 0,1ms (bis der Port geschaltet ist)
-Sende das Zeichen "d"
-Warte, bis das Interrupt sagt, der Sendepuffer ist leer
-Setzte den 485-Bus auf Empfangen
-Warte jetzt die o.g. Zeit (steht der weitere Programmablauf hinterher drin).

Hat jemand eine Idee, warum da nicht die 1000 Zeichen übertragen werden?

Mfg,
Wurm

Jaecko
13.02.2009, 08:17
Nur mal ne Vermutung: aber wenns was mit der Wartezeit zu tun hat, könnte es _vielleicht_ an "waitms 0.1" liegen. Ich weiss nicht genau, ob Bascom das so versteht. Probier da mal "waitus 100".

Nur komisch find ich die Wartezeit mit 20ms... Darüber wartest du ja sowieso, ob der Puffer leer ist, also ob das Zeichen schon unterwegs ist.
Rechnerisch sollte ein Zeichen bei 19200 bps nach 0,52ms draussen sein...

wurm
13.02.2009, 19:04
Hallo,

Du hast recht, Bascom hat ein Problem mit `waitms 0.1´.
Das löst mein Problem aber immer noch nicht.

Ich hab ein wenig weiter experimentiert und erst mal alles unnötige aus dem Programm rausgeworfen.

Im Anhang ist jetzt neue Variante. Entferne ich die Zeile ´waitms 2´, dann werden alle 1000 Zeichen korrekt gesendet. Mache ich dort einen Eintrag ´waitms 20´ werden auch alle Zeichen korekt gesendet.
Steht dort eine andere Wartezeit, z.B. 2 ms, dann werden massig Zeichen verschluckt.
Ich verstehe das nicht. Kann mir das nur erklären, dass es irgendwas mit dem Timing an der UART zu tun haben kann.

Vielleicht hat ja jemand eine Idee?

Mfg,
Wurm

Jaecko
13.02.2009, 19:14
Sehr bizarres Problem... scheint ein Pumuckl drin zu sein.

Versuch mal, verschiedene Zeichen zu senden... also abcdefgh..xyz.
Wäre mal interessant, ob dort zwischendrin einfach Zeichen fehlen oder ob einfach irgendwann abgebrochen wird.

wurm
16.02.2009, 23:25
Hallo,

bei verschiedenen Zeichen ist das selbe Problem.
Ich hatte die Vermutung, dass der 485-Bus das Problem verursacht. Und zwar die Umschaltung zwischen senden und empfangen.
Ich hab dann den Bus auf senden gesetzt, 1ms gewartet, dann das Zeichen gesendet, gewartet bis der Sendepuffer leer ist, nochmals 1ms gewartet, dann den Bus wieder auf empfangen geschaltet.
Das Problem ist gleich geblieben. Damit scheidet für mich die Ansteuerung des 485-Bausteins aus.
Der Microcontroller sendet aber korrekt, wenn ich da direkt am TXD-Pin messe.
Folgendes finde ich merkwürdig: Laß ich die Wartezeit nach einem Sendezyklus weg (s. vorherige Posings), dann zeigt mir das Terminalprogramm nur das gesendete Zeichen an (100). Mit einer eingetragenen Wartezeit wird im Terminalprogramm eine 100 und danach eine 0 angezeigt.

Bin im Moment ratlos, was das sein kann.

Mfg,
Wurm

Vitis
19.02.2009, 00:55
probier mal das:


$regfile = "m128def.dat" 'ATMega128 definieren
$crystal = 6000000 'Taktfrequenz auf 6 MHz setzen
$baud = 19200
$baud1 = 19200 'Baudrate für Diagnose
$hwstack = 256 ' default use 32 for the hardware stack
$swstack = 256 ' default use 10 for the SW stack
$framesize = 256



Busrxtx Alias Portd.4
Config Print1 = Busrxtx , Mode = Set
Config Busrxtx = Output 'set the direction yourself

Config Porta.1 = Output
Led Alias Porta.1

Dim Slave1_in As Integer
Dim Slave2_in As Integer
Dim Sendepuffer As Byte
Dim Zaehler As Integer
Dim Zeichen As Byte
Dim Zeichen_in As Byte
Dim Zeichenzaehler As Integer

Config Com2 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 1
'Config Serialout1 = Buffered , Size = 1
'Enable Interrupts
'Config Serialin1 = Buffered , Size = 20
Open "COM1:" For Binary As #2
Open "com2:" For Binary As #1

On Utxc1 Puffer_leer
Enable Utxc1
Enable Interrupts

Set Led
Waitms 1000
Reset Led
Waitms 1000


For Zaehler = 1 To 1000
Printbin #1 , 100;
'Waitms 2 '********** UM DIESE ZEILE GEHTS******************
Next
End


'****************************
' SendepufferInterrupt
Puffer_leer:
'Sendepuffer = 0
Return
'*********

PS: auch gern gemachter Fehler ist die fehlende Terminierung