Bascom Software UART verschluckt Zeichen

hal50

Neues Mitglied
26. Jan. 2009
4
0
1
Sprachen
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. Echt Verrückt!!!

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

Hat jemand eine Idee??

Hoffe auf Hilfe, Robert

Code:
'------------------------------------------------------------------------------
$regfile = "m168def.dat"                                    'ATmega168-Deklarationen
$crystal = 11059200                                         'Quarz: 11059200 Hz

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

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

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

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

On Urxc Onrxd
Enable Urxc

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

'*******************************************************************************
'*********************** H A U P T P R O G R A M *******************************
'*******************************************************************************
Main:
N = 0
Do
   'mach was
Loop
Close #1
Close #2
'*******************************************************************************

'*******************************************************************************
'*************************** Interrupt Routinen ********************************
'*******************************************************************************
Onrxd:                                                      ' wird bei Eingabe ein serieller Interrupt ausgelöst
   Pcmsk0.0 = 0                                             ' erstmal PCINT0 Soft-UART sperren
   Incr N                                                   ' zähle empfangene Zeichen
   B(n) = Udr                                               ' empfangenes Zeichen in String einfügen
   Udr = B(n)                                               ' und als Echo zurücksenden
   Pcmsk0.0 = 1                                             ' PCINT0 Soft-UART wieder freigeben
Return
'*******************************************************************************
Serielle_lesen:
   Disable Urxc                                             ' serieller Interrupt sperren
   Pcmsk0.0 = 0                                             ' Solange Bits reinkommen, PCINT0 sperren
   Get #1 , Recbyte                                         ' Byte lesen
   Udr = Recbyte                                            ' und gleich weiter auf UART senden

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

   Pcmsk0.0 = 1                                             ' PCINT0 wieder freigeben
   Enable Urxc                                              ' serieller Interrupt wieder freigeben
Return
'*******************************************************************************
 

Anhänge

  • SOFTRS232.txt
    3,4 KB · Aufrufe: 1
Habe aus anderem Forum eine Erklärung erhalten:

Bei Software UART dauert das zurücksenden (ECHO) eines Zeichens genauso lange wie das auslesen. Wenn das dann in der Interrupt Routine passiert, dann wird eben jedes 2. Zeichen verschluckt.

Eigentlich logisch:vollkommenauf:

Ich werde einen anderen Lösungsansatz testen und ich denke, daß dieses Problem vorerst gelöst ist.

Danke
 
Hi,

Habe aus anderem Forum eine Erklärung erhalten:

Beim Bascom-Forum steht auch "Habe aus anderem Forum eine Erklärung erhalten:"

In wie vielen Foren hast du eigentlich angefragt damit die Leute da ihre FREIZEIT verbrennen können! :mad:

Das ist eine absolute Unart. Diejenigen die dir hier helfen haben ihre Zeit auch nicht gestohlen!

Eventuell sollte man neue Threads einfach erstmal 2-3 Tage rumgären lassen, dann mit ner Suchmachine nachsehen ob die Frage nicht noch in anderen Foren gestellt wurde und ERST DANN antworten. :angry:

Gruß
Dino
 
Am besten erst mal nur in einem Forum fragen. Wenn nach einiger Zeit noch in anderen Foren gefragt wird, weil es noch zu keiner Lösung gekommen ist, dann am besten auf die Themen in den anderen Foren verweisen.

http://www.mikrocontroller.net/topic/324566
 
Jou, :vollkommenauf:

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.
 
So ... dann sammel ich nochmal alles zusammen ...

16.02.2014, 13:36 - avr-praxis.de - Bascom Software UART verschluckt Zeichen hal50
16.02.2014, 13:51 - mikrocontroller.net - Software UART verschluckt Zeichen (BASCOM) Robert M. (robert_m98)
16.02.2014, 14:00 - bascom-forum.de - Software UART verschluckt Zeichen hal50
16.02.2014, 14:35 - mcselec.com - Software UART missing characters hal50

und selbst das Sorry per copy & paste in allen Foren verteilt ?!?
*oh mann...*
Da sind nun die vier Threads. Naja ... Also das Sorry bei mcselec ist ja nun nicht kopiert. Ist ja wenigstens übersetzt (oder durch den Google-Übersetzer gequält?)

Ich würde sagen ... Lesson learned :rolleyes: (hoffe ich mal)

Und da haben wir beim Bascom-Forum innerhalb einer Woche den 3ten Crossposter ...
bascom-forum.de - Probleme beim Einstieg in SPI-Kommunikation
Richtig spassig wird es dann wieder wenn Semesterarbeiten, Schulaufgaben, ... anstehen :p

Gruß
Dino
 
ja, ja; ok! :fie:

Lesson learned :adore:

Da macht man mal eine Dummheit aus Unwissenheit und alle hauen drauf!

Und wie soll ich mich denn in den Posts anders enstschuldigen ??? Jedesmal was anderes schreiben? Oder gar nicht entschuldigen?
Ich habe einen Fehler gemacht; ok! Ich finde es dann nur korrekt und höflich, mich dafür zu entschuldigen. :flowers:

Jedenfalls habe(n) ich/wir eine Erklärung für das Phänomen erhalten und ich freue mich, daß evtl. andere davon profitieren können.
 
Hi,

ja, ja; ok! :fie:
Lesson learned :adore:
Da macht man mal eine Dummheit aus Unwissenheit und alle hauen drauf!

ich hab nur die Threads nochmal zusammengesammelt um Verweise zu haben wenn jemand etwas sucht. Sonst hat man lauter kleine abgeschnittene Enden und man weiß nicht wieviele Enden es sind und wo das nächste zu finden ist.

"Lesson learned" ging in die Richtung "Er hats gemerkt und weiß das es Mist war". Man muß also nicht weiter Salz in die Wunde streuen ;)

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)