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