Software UART verschluckt Zeichen (BASCOM)

#3536645
Lesenswert?

Hallo Gemeinde,

ich habe ein Phänomen mit BASCOM und der Software-UART.
Ich möchte mit einem ATMEGA168 einen Sensor seriell auslesen (mit den 
Daten dann was machen) und seriell an einen PC weitergeben. Der Sensor 
liefert max. 30 Zeichen, die am Ende mit <CR><LF> abgeschlossen sind.
Die Baudrate ist 2400, also nicht wirklich schnell. Ich benötige also 2 
serielle Schnittstellen. Die Hardware UART ist mit dem PC verbunden und 
die Software-UART mit dem Sensor.
Für das erkennen einer Übertragung vom Sensor über die Software-UART 
verwende ich PIN Interrupt, der bei jeder Flanke in die 
Software-UART-Leseroutine springt.
In meinem Testprogramm gebe ich das empfangene Zeichen direkt auf die 
Hardware-UART zum PC weiter. Und weil die Software-UART kein ECHO 
sendet, gebe ich das Zeichen auch wieder zurück.

Meine Gedanken in der Routine "Serielle_lesen" sind folgende:
- sperre alle Interrupts
- hole das anliegende Zeichen (Get #1, Recbyte)
- und gebe es direkt auf die Hardware-UART (UDR=Recbyte)
- gebe das Zeichen wieder als ECHO zurück (Put #2, Recbyte)
- gebe alle gesperrten Interrupts wieder frei
... und kehre zurück.

Und genau hier liegt mein Problem: beim zurücksenden des ECHOs an die 
Software-UART wird jedes 2. Zeichen "verschluckt".

Ich sende z. B."ASDFGHJKL" und ich bekomme "ADGJL" als Echo zurück!! 
Wenn ich den Befehl "Put #2 , Recbyte" auskommentiere, dann kommen auf 
der Harware-UART alle Zeichen an.

Getestet habe ich mit div. Terminal-Programmen am PC; BASCOM-Terminal, 
AccessPort, HyperTerminal,...;
Es ist zum Haare raufen!!!

Hat jemand eine Idee??
1
'------------------------------------------------------------------------------
2
$regfile = "m168def.dat"                                    'ATmega168-Deklarationen
3
$crystal = 11059200                                         'Quarz: 11059200 Hz
4

5
Dim S As String * 10                                        '10+1 Byte langer String
6
Dim B(11) As Byte At S Overlay                              'Auf Adresse von s setzen!
7

8
Dim N As Byte                                               'Für aktuelle Stringlänge
9
Dim Recbyte As Byte
10

11
'------------------------------------------------------------------------------
12
' Hardware UART konfigurieren; 2400,8N1
13
Config Com1 = 2400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
14

15
'Öffne Kommunikation mit Sonde
16
Open "comb.0:2400,8,n,1" For Input As #1                    'Port B.0 ist RxD für Opto (E-Feld)
17
Open "comb.1:2400,8,n,1" For Output As #2                   'Port B.1 ist TxD für Opto (E-Feld)
18
On Pcint0 Serielle_lesen                                    'Sprung bei Interrupt (Port B.0 = PCINT0)
19

20
On Urxc Onrxd
21
Enable Urxc
22

23
Pcmsk0.0 = 1                                                ' PCINT für Port B.0 freigeben
24
Pcicr.0 = 1                                                 ' PCints aktivieren (PCIE0=1)
25
Enable Interrupts                                           ' Interrupts gernerell freigeben
26

27
'*******************************************************************************
28
'*********************** H A U P T P R O G R A M *******************************
29
'*******************************************************************************
30
Main:
31
N = 0
32
Do
33
   'mach was
34
Loop
35
Close #1
36
Close #2
37
'*******************************************************************************
38

39
'*******************************************************************************
40
'*************************** Interrupt Routinen ********************************
41
'*******************************************************************************
42
Onrxd:                                                      ' wird bei Eingabe ein serieller Interrupt ausgelöst
43
   Pcmsk0.0 = 0                                             ' erstmal PCINT0 Soft-UART sperren
44
   Incr N                                                   ' zähle empfangene Zeichen
45
   B(n) = Udr                                               ' empfangenes Zeichen in String einfügen
46
   Udr = B(n)                                               ' und als Echo zurücksenden
47
   Pcmsk0.0 = 1                                             ' PCINT0 Soft-UART wieder freigeben
48
Return
49
'*******************************************************************************
50
Serielle_lesen:
51
   Disable Urxc                                             ' serieller Interrupt sperren
52
   Pcmsk0.0 = 0                                             ' Solange Bits reinkommen, PCINT0 sperren
53
   Get #1 , Recbyte                                         ' Byte lesen
54
   Udr = Recbyte                                            ' und gleich weiter auf UART senden
55

56
'   Put #2 , Recbyte                                         ' Byte als Echo zurücksenden
57

58
   Pcmsk0.0 = 1                                             ' PCINT0 wieder freigeben
59
   Enable Urxc                                              ' serieller Interrupt wieder freigeben
60
Return
61
'*******************************************************************************
Gast #3537107
Lesenswert?

MWS schrieb:
>In 4 Foren den selben Krampf nahezu gleichzeitig gepostet, Respekt.

Das Springen zwischen 4 Foren zeugt nicht von Konzentrationsfähigkeit.
Wo ist Deine Hilfe bei dem Problem -habe ich die überlesen?
#3538440
Lesenswert?

Makroorganismus schrieb:
> MWS schrieb:
>>In 4 Foren den selben Krampf nahezu gleichzeitig gepostet, Respekt.
>
> Das Springen zwischen 4 Foren zeugt nicht von Konzentrationsfähigkeit.
> Wo ist Deine Hilfe bei dem Problem -habe ich die überlesen?

SORRY!!!!SORRY!!!!SORRY!!!!SORRY!!!!SORRY!!!!SORRY!!!!SORRY!!!!SORRY!!!!
Jou,

SORRY!!!! Echt.

War das 1. mal, daß ich so was gemacht habe - kommt nicht wieder vor; 
versprochen!

(ich war eben so verzweifelt, daß ich keinen anderen Ausweg gesehen 
habe)

Trotzdem danke an ALLE.

PS: Also die Hilfe war, daß bei einer Software UART nicht gleichzeitig 
gelesen und geschrieben werden kann. In meinem Fall habe ich ein Zeichen 
gelesen und gleich wieder als Echo zurückgesendet, während das nächste 
Zeichen auf Abholung wartet.
Dieses zurücksenden braucht ebensoviel Zeit wie das empfangen. Deshalb 
habe ich immer nur jedes 2. Zeichen Empfangen.

SORRY!!!!SORRY!!!!SORRY!!!!SORRY!!!!SORRY!!!!SORRY!!!!SORRY!!!!SORRY!!!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren