Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > Hallo Peter, > > ich arbeite mit dem Projektboard und mit RS232 (Das Projektboard hat ja keine echte USB, sondern > schickt alles über den MAX. Es ist mir schon klar, das ich die IDE wegschalten muss, wenn ich das > Terminal benutze. Habe ich auch gemacht. Habe auch noch mal alles "Elektrische" mit Oszi geprüft. > Betriebsspannung ok ohne Spikes. Leitungen zum MAX ok, ohne Spikes. Benachbarte Pins ebenfalls > ohne Spikes. Ich bin ja eigentlich kein Neuling. Ich programmiere schon seit über 30 Jahren, allerdings > auf anderen Plattformen, angefangen mit echtem HEX-Code für den Ost-Typ des Z 80 über mehrere > unterschiedliche höhere Sprachen, außer C und dessen Derivate, wenn man mal von einem Ausflug zu > Turbopascal absieht. > Ich habe das Verhalten mit dem Oszi geprüft und festgestellt, dass es jedesmal erst bei der > Initialsierung der RS232 passiert und das offensichtlich mehrere Zeichen mit sehr hoher > Geschwindigkeit gesendet werden. Wenn man auf 19200 runter initialisiert, bleibt dann nur ein > fehlerhaftes Zeichen übrig, weil die Schnittstelle das nicht mehr auseinanderhalten kann. Man siehts > nur auf dem Oszi. Leider habe ich kein Speicheroszi, so dass ich kein Bild mitschicken kann. > Ich habe nun vorerst mal meiner Gegenstelle eine entsprechende Prüfung verordnet. > Leider habe ich noch ein paar andere kleinere Probleme entdeckt und ein Interruptproblem dazu. > Der Serialinterupt wird vom Interpreter oder was Du auch noch dahintergelegt hast in gewissen > Grenzen abgearbeitet. Allerdings, so wie man das von anderen Sprache gewöhnt ist, ein Sprung > in eine frei programierbare Routine (sicher nicht zu lang) erfolgt weder vom Serialinterupt noch von > internen Timerinterupten. Hardwareinterupte habe ich nicht geprüft. Ich wollte erst mal statt des > ständigen Abfragen des Serial_IRQ_Info in der Main dies über eine Timerüberlauf oder einen anderen > Timertick machen. War nichts. Es erfolgt trotz Intitialisierung mit Zeiger wie in den Beispiel- > programmen kein Aufruf der Sub. Hab es deshalb erstmal wieder rausgenommen. > Nachfolgend noch der Quellcode mit Kommentaren zu den entdeckten Ungereimtheiten (auch im > Handbuch). > Gruß Erzgebirgler47 > > ' RS232_IRQ: Interrupt Verarbeitung > ' In diesem Programm werden die neuen Möglichkeiten der Interrupt > ' Verarbeitung der seriellen Routinen demonstriert. > ' Das Programm wartet 5 Sek. und gibt die bis dahin empfangenen > ' Zeichen aus. Wartezeit anders verteilt > ' erforderliche Library: IntFunc_Lib.cc > > ' 35 byte Sende + Empfangspuffer + 6 byte interne FIFO Verwaltung > ' Versuche zeigen > zu wenig > ' aber selbst mit diesem riesigen Puffer (siehe unten) läuft er nur > ' bis etwa zur folgenden Zeichenmenge einwandfrei: "abcdefghijklmonpq", > ' ein Zeichen mehr (hier mit "r" versucht), und er bleibt vollständig > ' hängen, gleiches gilt bei der Übermittlung von Ziffern oder Werten Bin oder Hex > > #define LF 0x0A > #define CR 0x0D > Dim Puffer(250) As Byte ' Array deklariert > Dim Text3(20) As Char > '------------------------------------------------------------------------------ > ' Hauptprogramm > ' > > Sub main() > Dim i As Integer > Dim j As Integer > > Dim Text1(40), Text2(5) As Char > Text1=" .Test2 Text" > Text2="" > ' Init RS232: 19200 bps, 8 Bit, 1 Stop, NP > Serial_Init(0,SR_8BIT Or SR_1STOP Or SR_NO_PAR,SR_BD19200) > AbsDelay(50) > 'alt 5000 > hat bis auf das erste Zeichen funktioniert > 'Verkürzung auf 50 hat keine anderen Ergebnisse gebracht > 'Bei der Initialisierung werden bzw. wird offensichtlich > 'ein oder mehrere undefinierbare Zeichen zur Schnittstelle > 'geschickt > 'mit Lesegschwi. von 300 bis 115200 war kein klares Zeichen > 'zu erkennen > 'Ist dann die Initialisierung abgeschlossen, > 'läuft (bis auf den INT) alles wie es sein sollte > 'Weder der Serial_Int noch Timer_Int's führen zu einem Sprung > 'in eine (beim Timer_int)zugewiesene sub > > Serial_Init_IRQ(0,Puffer,150,50,SR_8BIT Or SR_1STOP Or SR_NO_PAR,SR_BD19200) > 'Fehlt hier nicht eigentlich eine Zuordnung des Int zu einer routine(zeiger)? > > For j=0 To 10 > Str_WriteInt(j ,Text2,0) > Serial_WriteText(0,Text2) ' CR und LF ausgeben > Serial_WriteText(0,Text1) ' CR und LF ausgeben > Serial_Write(0,CR) ' CR und LF ausgeben > Serial_Write(0,LF) ' CR und LF ausgeben > > Thread_Delay(1000) > If Serial_IRQ_Info(0,RS232_FIFO_RECV) <> 0 Then > Zeichenauslesen() > End If > > > Next > Serial_WriteText(0,"Ende des Tests") > Serial_Write(0,CR) ' CR und LF ausgeben > Serial_Write(0,LF) > > End Sub > > Sub Zeichenauslesen() > Dim Daten_Buffer(20) As Byte > Dim Buffer_Cnt As Integer > Dim Command As Byte > Dim sz As Integer > Dim Buffer_Index As Integer > > Text3="Zeichenauslesen" > Serial_WriteText(0,Text3) > Serial_Write(0,CR) ' CR und LF ausgeben > Serial_Write(0,LF) > 'nochmal prüfen, wie viele Zeichen empfangen wurden > Buffer_Cnt = Serial_IRQ_Info(0,RS232_FIFO_RECV) > If Buffer_Cnt <> 0 Then 'es sind Daten da? > > Do While True 'jetzt Daten einlesen > Buffer_Index = Buffer_Index + 1 'Buffer-Index-Zähler > sz=Serial_ReadExt(0) 'Puffer auslesen > 'Der Code ist aus den Original-Beipielen, dabei gibt es aber einige > 'Widersprüche zwischen der Beschreibung und den Beispielen: > 'Definition lt. Hilfe bzw. Handbuch > 'Serial_ReadExt(serport As Byte) As Word > Funktion liefert Word !! > 'Beschreibung: > 'Ein byte wird von der seriellen Schnittstelle gelesen. Falsch!! > 'Auch falsch in der Beschreibung: > '... wenn kein Zeichen in der seriellen Schnittstelle ist. > 'In diesem Fall wird der Wert 256 (0x100) zurückgegeben. > 'Ein Byte kann niemals den Wert 256 annehmen > 'Realität: > 'Funktion liefert Integer > 'Dies hat natürlich für die weitere Bearbeitung heftige Konsequenzen > 'und ist sehr ungünstig > 'warum endet der Buffer nicht mit CR oder 0 , wie das sonst so > 'üblich ist. > If sz <> 13 Then 'CR unterdrücken > Daten_Buffer(Buffer_Index) = sz 'Byte in Array übergeben > If sz=&H100 Then > Exit 'bei 0x100 ist der Puffer leer > Else > Command = Daten_Buffer(Buffer_Index) 'Daten werden zugeordnet > Serial_Write(0,Command) ' und zu Prüfzwecken wieder ausgegeben > 'hier kommt mal die Übergabe des Daten_Buffer in einen String > 'und am Ende der Sub die Auswertung in einer anderen SUB > 'um die Interruptroutine nicht zu lang werden zulassen > 'auch wenn der Interupt nicht klappt > End If > End If > End While > 'Auswertung(Auswertestring) 'noch nicht programmiert > End If > Serial_Write(0,CR) ' CR und LF ausgeben > Serial_Write(0,LF) > > End Sub >