Hi Ich habe ein Problem mit einem ATMega128. Ich will ein LCD mit touchscreen setriell ansteuern und die Antwort des Displays seriell auswwerten, um einen touchtastendruck zu erkennen. Das Display legt einen Pin auf Masse, wenn daten zum Senden anstehen und über einen externen Interrupt werden die Daten dann vom Display angefordert. ich kann aber nur die ersten 2 Bytes auswerten, danach werden keine bytes mehr ausgegeben. Den Empfang mache ich mit einer Interruptroutine, die auch schnell genug sein sollte(ich habe sie schon ein paarmal verändert) Im DAtenblatt steht, dass der usart einen zweifachen fifo besitzt, das würde die 2 Bytes erklären. Wenn eine Taste gedrückt wird, dann kann ich bei jedem folgenden Tastendruck 2 Bytes empfangen, d.h. das Problem tritt nur auf, wenn eine (schnelle) Zeichenfolge empfangen werden soll. Die Baudrate ist korrekt eingestellt, das Senden zum Display funktioniert einwandfrei. Vielleicht hat Irgendjemand eine Idee dazu, oder schon mal ein ähnliches Problem gehabt(und gelöst)? Vielen Dank schon mal und Gruß, Tenner
Und wieder mal: Ohne den Code gesehen zu haben, wird da wohl niemand helfen können...
Hi also hier ist mein BASCOM Code. Das Display sendet die Zeichenfolge 6 17 4 27 65 1 116 230 . das sin dezimalwerte der 8 Bytes, die gesendet werden. wenn ich in der isr 6 oder 17 in die if-Anweisung schreibe, dann toggelt die LED bei jedem Tastendruck. Code: $crystal = 18432000 $regfile = "m128def.dat" $baud = 9600 On Urxc Byteempfangen On Int0 Daten_vom_display_anfordern Config Porta.0 = Output 'testled1 Config Porta.1 = Output 'testled2 Config Portd.0 = Input 'interrupt 0 Config Porte.1 = Output Config Portb.4 = Output 'lcdreset Config Portb.5 = Output 'baud0 Config Portb.6 = Output 'baud1 Config Portb.7 = Output 'baud2 Dim Empfbuf As String * 20 At &H0100 Dim Inbytes(21) As Byte At &H0100 Overlay Dim A As Byte Dim B As Byte Dim C As Byte Dim N As Byte Dim Bcc As Byte Dim Bccs As String * 1 Dim Dc1 As String * 1 Dim Length As Byte Dim Lengths As String * 1 Dim Befehle As String * 64 Dim Zeichenkette As String * 66 Dim Empfbyte As Byte Dim Baudrate As Long Dim Byte_gekommen As Bit Dim Instring As String * 1 Dim Stringempfangen As Bit Dim Bc As Byte Dim Dc1_empf As Bit Dim Dc2_empf As Bit Dim Tastencode As Byte Dim Inbytesumme As Integer Lcdreset Alias Portb.4 Lcdbaud0 Alias Portb.5 Lcdbaud1 Alias Portb.6 Lcdbaud2 Alias Portb.7 Testled1 Alias Porta.0 Testled2 Alias Porta.1 An Alias 0 Aus Alias 1 Baudrate = 9600 Lcdreset = 1 Byte_gekommen = 0 Dc1_empf = 0 Dc2_empf = 0 N = 1 Inbytesumme = 0 Stringempfangen = 0 Dc1 = Chr(17) Testled2 = Aus Gosub Baudrate_einstellen Wait 1 Lcdreset = 0 Waitms 100 Lcdreset = 1 Testled1 = An Wait 1 Testled1 = Aus Enable Interrupts Enable Urxc Enable Int0 Befehle = "#TA#DL" 'terminal aus und display löschen Gosub Stringsenden 'Startbildschirm zeichnen Befehle = "#AE17,#AF6,#AT0,90,70,127,83,115,CStart{013}" 'Start taste Gosub Stringsenden Befehle = "#AF5,#AT169,90,239,127,82,114,CRecall{013}" 'recall taste Gosub Stringsenden Befehle = "#AE0,#AF5,#AT0,0,50,20,0,116,LEZ:{013}" 'EZ taste Gosub Stringsenden Befehle = "#ZV4,#ZF7,#ZC119,030,000.00{013}" '000.00 anzeigen Gosub Stringsenden '...bis hier Do Loop End Ezeinstellen: Befehle = "#AL0,1,#DL" 'Touch und Display löschen Gosub Stringsenden Befehle = "#ZF2,#ZC119,000,Erlaubte Zeit einstellen{013}" Gosub Stringsenden Befehle = "#AE17,#AF6,#AT000,010,035,040,0,11,C1{013}" 'Taste 1 Gosub Stringsenden Befehle = "#AE17,#AF6,#AT040,010,075,040,0,12,C2{013}" 'Taste 2 Gosub Stringsenden Befehle = "#AE17,#AF6,#AT080,010,115,040,0,13,C3{013}" 'Taste 3 Gosub Stringsenden Befehle = "#AE17,#AF6,#AT120,010,155,040,0,14,C4{013}" 'Taste 4 Gosub Stringsenden Befehle = "#AE17,#AF6,#AT160,010,195,040,0,15,C5{013}" 'Taste 5 Gosub Stringsenden Befehle = "#AE17,#AF6,#AT000,043,035,073,0,16,C6{013}" 'Taste 6 Gosub Stringsenden Befehle = "#AE17,#AF6,#AT040,043,075,073,0,17,C7{013}" 'Taste 7 Gosub Stringsenden Befehle = "#AE17,#AF6,#AT080,043,115,073,0,18,C8{013}" 'Taste 8 Gosub Stringsenden Befehle = "#AE17,#AF6,#AT120,043,155,073,0,19,C9{013}" 'Taste 9 Gosub Stringsenden Befehle = "#AE17,#AF6,#AT160,043,195,073,0,10,C0{013}" 'Taste 0 Gosub Stringsenden Befehle = "#AE17,#AF6,#AT114,90,169,174,117,0,C<-{013}" 'Taste Korrektur Gosub Stringsenden Befehle = "#AE17,#AF6,#AT179,90,239,127,117,0,COK{013}" 'Taste OK Gosub Stringsenden Return Stringsenden: Length = Len(befehle) 'länge der befehlssequenz ermitteln Lengths = Chr(length) 'und in string wandeln Mid(zeichenkette , 1 , 1) = Dc1 'DC1 an den Anfang der zeichenkette setzen Mid(zeichenkette , 2 , 1) = Lengths 'Länge der befehlsequenz an 2. stelle einsetzen Mid(zeichenkette , 3) = Befehle 'befehlsfolge einsetzen Bcc = Checksum(zeichenkette) 'checksumme ermitteln Bccs = Chr(bcc) 'checksumme in string wandeln Length = Length + 3 'länge um die hinzugefügten zeichen verlängern Mid(zeichenkette , Length , 1) = Bccs 'Checksumme am ende der zeichenkette anhängen Length = Length + 1 Mid(zeichenkette , Length , 1) = 0 'null character anhängen Print Zeichenkette; 'Zeichenkette ausgeben Waitms 20 Zeichenkette = "" 'string variablen leeren Befehle = "" Return Baudrate_einstellen: If Baudrate = 1200 Then Lcdbaud0 = 0 Lcdbaud1 = 0 Lcdbaud2 = 0 Baud = 1200 End If If Baudrate = 2400 Then Lcdbaud0 = 1 Lcdbaud1 = 0 Lcdbaud2 = 0 Baud = 2400 End If If Baudrate = 4800 Then Lcdbaud0 = 0 Lcdbaud1 = 1 Lcdbaud2 = 0 Baud = 4800 End If If Baudrate = 9600 Then Lcdbaud0 = 1 Lcdbaud1 = 1 Lcdbaud2 = 0 Baud = 9600 End If If Baudrate = 19200 Then Lcdbaud0 = 0 Lcdbaud1 = 0 Lcdbaud2 = 1 Baud = 19200 End If If Baudrate = 38400 Then Lcdbaud0 = 1 Lcdbaud1 = 0 Lcdbaud2 = 1 Baud = 38400 End If If Baudrate = 57600 Then Lcdbaud0 = 0 Lcdbaud1 = 1 Lcdbaud2 = 1 Baud = 57600 End If If Baudrate = 115200 Then Lcdbaud0 = 1 Lcdbaud1 = 1 Lcdbaud2 = 1 Baud = 115200 End If Return Byteempfangen: Empfbyte = Udr If Empfbyte = 4 Then Toggle Testled1 ' If Dc2_empf = 1 Then ' Bcc = Checksum(empfbuf) ' If Bcc = Udr Then Byte_gekommen = 1 ' Empfbuf = Empfbuf + Chr(udr) ' End If ' ' If Udr = 17 And Dc2_empf = 0 Then ' Empfbuf = "" ' Dc2_empf = 1 ' Empfbuf = Chr(udr) ' End If Return Daten_vom_display_anfordern: Dc1 = Chr(18) Befehle = "S" Gosub Stringsenden Dc1 = Chr(17) Toggle Testled2 Return Viele Grüße, Tenner
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.