Forum: Mikrocontroller und Digitale Elektronik Atmega128 empfängt nur 2 Bytes


von tenner (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

Und wieder mal: Ohne den Code gesehen zu haben, wird da wohl niemand
helfen können...

von tenner (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.