Forum: Mikrocontroller und Digitale Elektronik Software UART verschluckt Zeichen (BASCOM)


von Robert M. (robert_m98)


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
'*******************************************************************************

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Robert M. schrieb:
> Meine Gedanken in der Routine "Serielle_lesen" sind folgende:
> - sperre alle Interrupts

Warum?

von Robert M. (robert_m98)


Lesenswert?

na ja, damit während ich in der Routine was mache, nicht "abgelenkt" 
(sprich durch andere Dinge gestört) werde.

von MWS (Gast)


Lesenswert?

In 4 Foren den selben Krampf nahezu gleichzeitig gepostet, Respekt.
Aber Foren ersetzen immer noch kein Hirn.

von Makroorganismus (Gast)


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?

von Robert M. (robert_m98)


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!!!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.