Forum: Mikrocontroller und Digitale Elektronik BASCOM: Empfang eines strings oder HEX-Wertes per UART


von Henning F. (sixpack1)


Lesenswert?

Hallo zusammen,

Ein paar Worte zu meinem vorhaben.
Ich möchte einen Integerwert von einem Atmega 16 (=Sender) zu einem 
Atmeg8 (=Empfänger) senden. Hierfür habe ich TXD vom Atmega16 mit RXD 
vom Atmega8 verbunden.
Auf der Empfängerseite möchte ich im Pollingbetrieb einen Puffer 
auslesen
und auswerten können. Dazu habe ich mir auch zwei kleine Testprogramme 
geschieben, dass Senden scheint zu funktionieren. Hab mal mit dem 
Oszilloskop am RXD Pin des Empfägers gemessen.
Ich mache irgendetwas bei der Empfangauswertung falsch. Nur was?
So langsam fange ich an zu verzweifeln.
Hat vieleicht einer von euch nen Tip.?
Hier mein Code:

Sender:

$regfile = "m16def.dat"
$crystal = 16000000                '16 MHz
$hwstack = 30
$swstack = 15
$framesize = 10
$baud = 9600

' $sim

'-------------------------------
 Ddrc = &B01110000
Portc = &B11101101
    'Pinc.76543210
'pinc.0 = Taste1

 Ddrd = &B00000011
Portd = &B11111111
'Pind.1 = TXD

Taste1 Alias Pinc.0
Taste2 Alias Pinc.1

'-- Config serial 
--------------------------------------------------------------

 Config Serialout = Buffered , Size = 2
 '----------------------------------------------------------------------- 
--------
  Enable Interrupts
  Dim Dataout As Integer

 '----------------------------------------------------------------------- 
--------

                      ' Beispielwert, später Werte zwischen 0 und 1250

    Do

    If Taste1 = 0 Then
       Dataout = 55
       Printbin Dataout            '
       Bitwait Taste1 , Set
    End If

    If Taste2 = 0 Then
       Dataout = 5
       Printbin Dataout            '
       Bitwait Taste2 , Set
    End If


    Loop
    End

Empfänger:
$regfile = "m8def.dat"
$crystal = 16000000                                          '16 MHz
$hwstack = 50
$swstack = 35
$framesize = 10
$baud = 9600
'$sim

 '-- Config serial 
Port---------------------------------------------------------

 'Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , 
Databits = 8 , Clockpol = 0

 Config Serialin = Buffered , Size = 2
  Enable Interrupts
 '--- Config 
Port---------------------------------------------------------------

   Ddrd = &B00000000
   Portd = &B11111111
  'PinD.0 = RXD

    Ddrc = &B00100000
   Portc = &B11111100
'----------------------------------------------------------------------- 
--------
  Dim Datain As Integer            ' Buffer für Serielle Daten



  Do


    Datain = Udr

    If Datain = 55 Then            ' zum Testem
      Pinc.5 = 1
    Else
      Pinc.5 = 0
    End If



  Loop
  End

Gruß Sixpack1

von Henning F. (sixpack1)


Lesenswert?

Hallo zusammen,

Ein paar Worte zu meinem vorhaben.
Ich möchte einen Integerwert von einem Atmega 16 (=Sender) zu einem
Atmeg8 (=Empfänger) senden. Hierfür habe ich TXD vom Atmega16 mit RXD
vom Atmega8 verbunden.
Auf der Empfängerseite möchte ich im Pollingbetrieb einen Puffer
auslesen
und auswerten können. Dazu habe ich mir auch zwei kleine Testprogramme
geschieben, dass Senden scheint zu funktionieren. Hab mal mit dem
Oszilloskop am RXD Pin des Empfägers gemessen.
Ich mache irgendetwas bei der Empfangauswertung falsch. Nur was?
So langsam fange ich an zu verzweifeln.
Hat vieleicht einer von euch nen Tip.?
Hier mein Code:

Sender:

$regfile = "m16def.dat"
$crystal = 16000000                '16 MHz
$hwstack = 30
$swstack = 15
$framesize = 10
$baud = 9600

' $sim

'-------------------------------
 Ddrc = &B01110000
Portc = &B11101101
    'Pinc.76543210
'pinc.0 = Taste1

 Ddrd = &B00000011
Portd = &B11111111
'Pind.1 = TXD

Taste1 Alias Pinc.0
Taste2 Alias Pinc.1

'-- Config serial
--------------------------------------------------------------

 Config Serialout = Buffered , Size = 2
 '----------------------------------------------------------------------- 
--------
  Enable Interrupts
  Dim Dataout As Integer

 '----------------------------------------------------------------------- 
--------

                      ' Beispielwert, später Werte zwischen 0 und 1250

    Do

    If Taste1 = 0 Then
       Dataout = 55
       Printbin Dataout            '
       Bitwait Taste1 , Set
    End If

    If Taste2 = 0 Then
       Dataout = 5
       Printbin Dataout            '
       Bitwait Taste2 , Set
    End If


    Loop
    End

Empfänger:
$regfile = "m8def.dat"
$crystal = 16000000                                          '16 MHz
$hwstack = 50
$swstack = 35
$framesize = 10
$baud = 9600
'$sim

 '-- Config serial
Port---------------------------------------------------------

 'Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 ,
Databits = 8 , Clockpol = 0

 Config Serialin = Buffered , Size = 2
  Enable Interrupts
 '--- Config
Port---------------------------------------------------------------

   Ddrd = &B00000000
   Portd = &B11111111
  'PinD.0 = RXD

    Ddrc = &B00100000
   Portc = &B11111100
'----------------------------------------------------------------------- 
--------
  Dim Datain As Integer            ' Buffer für Serielle Daten



  Do


    Datain = Udr

    If Datain = 55 Then            ' zum Testem
      Pinc.5 = 1
    Else
      Pinc.5 = 0
    End If



  Loop
  End

Gruß Sixpack1

von hero (Gast)


Lesenswert?

Hallo ich bin mir nicht ganz sicher og das einen Einfluss hat (bin 
anfänger) aber vllt liegt es daran das du 16Mhz quarz verwendest... hab 
nicht mehr gelesen... es gibt quartz die genau ein vielfacehs von den 
Baud raten sind und somit perfekte Baudraten erzeugen... jedoch müsstest 
du dann etwas am ATMega8 empfangen...

von Joachim R. (bastelbaer)


Lesenswert?

Probier mal in deiner Empfangsroutine folgendes aus der BASCOM-Hilfe 
aus:

Do

  Datain = Ischarwaiting() ' wartet bis ein Zeichen da ist
  If datain = 1 Then  ' wenn dann eins da ist
    datain = Waitkey() ' lesen wir es ein
    Print "ASCII code " ; datain ; " from serial"
  End If
Loop

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.