Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: 2-te Hardwaremaessig impl. Seriellle Schnittstelle (ESCI) Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Joe - 15.11.2014 17:28)
 Als Antwort auf Re: 2-te Hardwaremaessig impl. Seriellle Schnittstelle (ESCI) von Dietmar - 11.11.2014 22:25
Joe nutzt:  CC1-M-Unit V1.1, Open-Micro, Open-Macro
Hallo Dietmar,

danke fuer Dein Feedback und die guten Wuensche.
Zeichen mit der ESCI zu senden hatte sofort geklappt. Schwieriger war dann das Auswerten von empfangenen Zeichen. Den Ablauf ueber die Tastatur-Eingabe hatte ich am Dienstag schon beschrieben. Nun hatte ich noch etwas Verstaendnis-Probleme, wenn ich 20 bzw. 30 oder 42 Zeichen aus einer Datei gesendet habe. Das klappt nun aber auch recht gut. Das Programm in der Anlage ist dabei entstanden. Vorallem hat mich die Geschwindigkeit der O-Macro beeindruckt.
Meinem Projekt GPS Daten aus einem GPS Modul mit 38400bps auszulesen , um die Datenmenge  zu verarbeiten und reduzieren, sowie diese reduzierte Datenmenge ueber ein Funk-Audio-Modem mittels des Tonkanals eines 2.4/5.6GHz AV Senders vom Flugmodell runter zu senden bin ich wieder ein Stueck naeher gekommen. Die Datenmenge/Paket wird dabei von ca. 200 Bytes auf weniger als 30 Bytes reduziert u. kann dann mit niedriger Baudrate gesendet werden. Eine weitere O-Macro macht dann in der Bodenstation das Antennen-Tracking.

Freundliche  Gruesse

Joe Fenk

################### DEMO_Programm #################
' RSDEMO_2.BAS Demoprogramm Fr.15.11.2014  Josef Fenk
' 638 Basic- Bytes, 0-Sys Bytes und 22 RAM Bytes belegt
' Demoprogramm, zum besseren Verstaendnis der Hardwaremaessig implementierten 2_RS232 Schnittstelle (ESCI)
' an RXD:Pin7/Port13 u. TXD:Pin6/Port14
' und vorallem
' 1. wie das mit dem Empfangsbuffer funktioniert, wenn man eine Datei mit einer Zeichenkette einlesen moechte
' 2. wie Zeitkritisch das ist, wenn man PRINT Befehle eingefuegt hat zwischen
'    GET Befehlen; andere Befehle sind nicht so zeitkritisch
' 3. wie man die internen Variablen RXD u. EsciErr der ESCI RS232 Schnittstelle benutzt
'    RXD=Test ob ein Byte seriell empfangen wurde; Wert=-1 ==> Byte empfangen; =0==> kein Byte empfangen
'    EsciErr=Abfrage ob Empfangsfehler an der ESCI: Wert=-1==> 8Byte Empfangsbuffer ueberlauf; =0 ==> kein Ueberlauf E.-Buffer
'    DEFINE RXD      BYTE  'Warnung!! Bezeichner RXD heisst wie ein reserviertes Wort
'    diese Eingabe nicht erforderlich, da RXD ausschlieeslich reservierter Wert
'    RXD=0     'Fehlermeldung:  nicht definierte Variable RXD bei Zuweisung    
'    mit RXD=0 wollte ich Ausstieg aus der WHILE WEND Schleife erzwingen; das hat aber nicht funktioniert
'    
' !!!!!!!!!!!!!!!Sehr wichtig!!!!!!!!!!!!!!!!!!!
' Die RS232 Semiwire-Schnittstelle an PORT[1] ist nur mit Baud R9600 nutzbar
' und kann nicht auf andere Baudrate eingestellt werden,  egal welche Zahl
' man hinter Baud R schreibt, deshalb entfaellt im Programm der Befehl der naechsten beiden Zeilen
' siehe dazu auch Opem-Maxi Bedienungsanleitung Version 1.1; omax_doku_11
' DEFINE RS232_1  PORT[01] !!! ist nicht erforderlich
' BAUD R9600   !!!ist nicht erforderlich

' PC_1 benutzt fuer Onboard Programmierung dazu Terminalprog. auf 9600bps einstellen u. nicht veraendern
' und Zeichenausgabe ueber 1-te RS232 Semiwire-Schnittstelle an PORT[1]
' PC_2 ueber MAX 232 Zusatzinterface mit 2-ter RS232 Schnittstelle ESCI verbunden
' RXD PORT(13)//Pin7=empfaengt Zeichen von PC_2 ueber TXD-MAX232-Zusatzinterface
' TXD PORT(14)//Pin6=sendet Zeichen an PC_2 ueber RXD-MAx232-Zusatzinterface
' PC_2 benutzt um Zeichen einzulesen und an PC_2 und PC_1 auszugeben
' Hinweis zur Benutzung der hardwaremaessig implementierten 2. Seriellen Schnittstelle (Esci)
' der Empfangsbuffer dieser 2. ser. Schnittstelle hat  8Byte
' nach 8 Byte erfolgt ueberlauf und Wert EsciErr =-1

' Auf dem P/E-Board kann provisorisch PORT[14] mit PORT[1] verbunden werden, oder wie
' bei mir, hatte ich ueber PC_1 die Semiwire RS232 Schnittstelle angesprochen
' PC_2 auf gleiche Baudrate wie PC_1 eingestellt; es kann aber auch andere Baudrate eingestellt werden;
' davon haengt es dann ab, ab wann ein Einlese-Fehler auftritt; im unten gezeigten Beispiel mit Baud R9600
' tritt das nach dem 10 Zeichen auf, wenn PRINT Befehle zwischen GET Befehlen in der WHILE WEND Schleife eingefuegt waren
' Unterschied der beiden Schnittstellen:
' Semiwire-Schnittstelle:
' bez. Baudrate: nur 9600 Baud verfuegbar, keine andere Baudrate moeglich
' bez. GET: kein Empfangsbuffer, deshalb holt GET direkt die Zeichen vom Eingang ab, u. das funktioniert auch bei 9600Baud recht gut
' ESCI- Schnittstelle:
' bez. Baudrate: 300, 600, 1200, 2400, 4800,9600,19200, 38400 verfuegbar
' bez. ESCI_Sch.: hat 8 Byte Empfangsbuffer; GET holt Zeichen vom Empfangsbuffer und nicht direkt vom Eingang ab
' mit n*mal GET kann man in WHILE WEND Schleife beliebig lange Zeichenketten einlesen,
' solange man nicht zuviele zusaetzliche Befehle zwischen folgenden GET Befehlen einfuegt

' Hinweise zu Programm: WHILE RXD  WEND Schleife wird solange durchlaufen bis der 8Byte Empfangsbuffer leer ist;
'  ohne WHILE / WEND erfolgt Ausstieg nachdem 20 Werte eingelesen wurden
' im Programm sind unter ' noch einige Zeilen enthalten, die auf meine Probleme beim Zeichen einlesen hinweisen


' --- Betriebssystem konfigurieren ------------------------------------------
INCLUDE "OMAC.DEF"           'Include-Datei mit Definitionen vom April 2010

' --- Definitionen Variable fuer das Hauptprogramm
' ----Def. WORD Variable ------------------------------------------
' ----Def. Byte Variable ------------------------------------------
DEFINE Zeichen  BYTE    ' Zeichenempfangs Variable
DEFINE Zae      BYTE
DEFINE Z_1      BYTE
DEFINE Z_2      BYTE
DEFINE Z_3      BYTE
DEFINE Z_4      BYTE
DEFINE Z_5      BYTE
DEFINE Z_6      BYTE
DEFINE Z_7      BYTE
DEFINE Z_8      BYTE
DEFINE Z_9      BYTE
DEFINE Z_10     BYTE
DEFINE Z_11     BYTE
DEFINE Z_12     BYTE
DEFINE Z_13     BYTE
DEFINE Z_14     BYTE
DEFINE Z_15     BYTE
DEFINE Z_16     BYTE
DEFINE Z_17     BYTE
DEFINE Z_18     BYTE
DEFINE Z_19     BYTE
DEFINE Z_20     BYTE  

DEFINE i_lauf   BYTE
'DEFINE RXD      BYTE  'Zeichenbyte dass Empfangsbuffer Zeichen gespeichert hat;Warnung!! Bezeichner RXD heisst wie ein reserviertes Wort
' diese Eingabe nicht erforderlich!!!

'***** Definition der Digitalen Ein- / Ausgabeports

' Programmbeginn
PRINT "vor Start: hier noch PC_1, nun am PC_2 arbeiten"

WHILE TRUE
 UseESCI=ON     'schaltet ESCI ein
 BAUD R9600     'moeglich sind 300, 600, 1200,2400,4800,9600,19200,38400 Baud
   PRINT "RXD=";RXD 'RXD=-1 falls Zeichen im E-Buffer, ansonsten 0; Ausdruck RXD=0  erfolgt nur beim 1-ten Durchlauf
   PRINT "EsEr=";EsciErr '=-1 falls Zeichen >8 = Groesse E_Buffer; ansonsten 0
   PRINT "EsPt=";Esciptr '=319 zeigt immer diesen Zahlenwert
   PRINT "Datei mit Zeichen von PC_2 senden"
   #Zei_sen   'Schleife um Zeichen von gesendeter Datei zu empfangen
     IF RXD=0 THEN GOTO Zei_sen
     Zae=0
     WHILE RXD    ' die schleife wird solange durchlaufen bis RXD=0 ist, dann erfolgt Ausstieg
      ' PRINT "vRXD=";RXD 'RXD=-1 solange Zeichen im E-buffer sind, ansonsten 0
      ' PRINT "vEsEr=";EsciErr '=-1 wenn E-Buffer voll ist, ansonsten bereits nach einem Zeichen auslesen 0
      ' PRINT "vEsPt=";Esciptr '=319
        #Nochm
        GET Zeichen
       IF Zeichen<>65 THEN GOTO Nochm  'Abfrage A<>65; dazu A Zeichen in Sendedatei eingefuegt, um gezielt Zeichen einzulesen
        GET Z_1            'ohne diese Abfrage war Zeichenkette nur bei 20 Zeichen langer Datei richtig; bei 30 Zeichen langer Datei
        Zae=Zae+1          'waren Zeichen an falscher Position
'       PRINT Zae,Z_1
        GET Z_2
        Zae=Zae+1
'        PRINT Zae,Z_2
        GET Z_3
        Zae=Zae+1
'        PRINT Zae,Z_3
        GET Z_4
        Zae=Zae+1
'        PRINT Zae,Z_4
        GET Z_5
        Zae=Zae+1
'        PRINT Zae,Z_5
        GET Z_6
        Zae=Zae+1
'        PRINT Zae,Z_6
        GET Z_7
        Zae=Zae+1
'        PRINT Zae,Z_7
        GET Z_8
        Zae=Zae+1
'        PRINT Zae,Z_8
        GET Z_9
        Zae=Zae+1
'        PRINT Zae,Z_9
        GET Z_10
        Zae=Zae+1
'        PRINT Zae,Z_10
        GET Z_11
        Zae=Zae+1
'        PRINT Zae,Z_11   ' ab hier falscher Wert=50 statt 49
        GET Z_12
        Zae=Zae+1
'        PRINT Zae,Z_12   ' dann 56 statt 50; anschliessend kein Ausdruck mehr, springt vermutlich zu WHILE zurueck u. wartet auf Zeichen
        GET Z_13
        Zae=Zae+1
'        PRINT Zae,Z_13
        GET Z_14
        Zae=Zae+1
'        PRINT Zae,Z_14
        GET Z_15
        Zae=Zae+1
'        PRINT Zae,Z_15
        GET Z_16
        Zae=Zae+1
'        PRINT Zae,Z_16
        GET Z_17
        Zae=Zae+1
'        PRINT Zae,Z_17
        GET Z_18
        Zae=Zae+1
'        PRINT Zae,Z_18
        GET Z_19
        Zae=Zae+1
'        PRINT Zae,Z_19
        GET Z_20
        Zae=Zae+1  

        ' FOR i_lauf=1 TO 8 ' da im Empfangsbuffer nun noch 8 Zeichen sind
                          ' muss der geleert werden bevor naechster Durchlauf startet
       '     GET Zeichen  'hier gezielt den Empfangsbuffer leeren
       ' NEXT i_lauf
       
'        PRINT "nRXD=";RXD  '=-1 solange noch Zeichen in den 8 Empgangsbuffern liegen, ansonsten 0
'        PRINT "nEsEr=";EsciErr  '= -1 wenn mit GET 1-tes Byte aus vollem E-Buffer geholt wurde = 0
      ' PRINT "nEsPt=";Esciptr '=319
 '      Zae=Zae+1
      ' PRINT "Zae=";Zae,"RX_Dat=";Zeichen
  '     PRINT Zae,Zeichen
   '   IF EsciErr=-1 THEN    ' Ausstieg aus WHILE WEND Schleife
   '      EsciErr=0  'Ausstieg aus der Schleife da nur 20 Werte eingelesen werden sollten
    '     RXD=0     'Fehlermeldung:  nicht definierte Variable RXD bei Zuweisung    
    '  ELSE
    '  ENDIF  
 '   WEND
       PRINT Zae,Z_1,Z_2,Z_3,Z_4,Z_5,Z_6,Z_7,Z_8,Z_9,Z_10,Z_11,Z_12,Z_13,Z_14,Z_15,Z_16,Z_17,Z_18,Z_19,Z_20
       PRINT
     UseESCI=OFF
    'nun Ausgabe der Zeichen am PC_1
    PRINT Zae,Z_1,Z_2,Z_3,Z_4,Z_5,Z_6,Z_7,Z_8,Z_9,Z_10,Z_11,Z_12,Z_13,Z_14,Z_15,Z_16,Z_17,Z_18,Z_19,Z_20
    PRINT "nun zum Anfang und wieder am PC_2 arbeiten"
   
 WEND
 END

##########################
############ Verwendete Dateien zum Test des Programmes ###########
20_Zeich.txt

12345678901234567890
###########
30_Zeich.txt

123456789012345678901234567890
###########
42_Zeich.txt

1234567890A12345678901234567890E12345678

 Antwort schreiben

Bisherige Antworten: