-         

Ergebnis 1 bis 3 von 3

Thema: UART - Integer empangen unvollständig?

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627

    UART - Integer empangen unvollständig?

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,
    ich möchte eine Variable (Integer) mit einem µC senden und mit einem anderen empfangen und wieder in eine Variable (Integer) schreiben:

    Der Empänger macht mir etwas probleme:
    Das was der Empänger empfängt, sendet er an den PC zum testen weiter. Wenn also zB. 12345 ankommen müsste bekomme ich auf dem PC alles untereinander geschrieben:
    1
    2
    3
    4
    5

    Könnte es daran liegen, dass jedes Zeichen für sich empfangen wird?
    Gibt es eine andere Möglichkeit? - oder kann man bis zum CR (Carriage Return) alles in eine Integer Variable schreiben?

    Tobias

    Code:
    'Konfiguration µC:
    $regfile = "m8def.dat"                                      'AT-Mega8
    $crystal = 3686400                                          'Quarz: 3.6864 MHz
    
    $baud = 9600
    
    Dim A As Integer
    Dim I  As Integer
    
    Config Pind.0 = Input
    Config Pind.3 = Output
    
    Print "ok"
    
    Do
    
    
    
    If Usr.rxc = 1 Then                                         'Wenn Zeichen ankommt
    I = Udr                                                     'UART auslesen
    Print Chr(i)
    
    'A = Chr(i) 'WIE MUSS DAS RICHTIG HEISSEN?
    'Print A
    
    End If
    Und noch der sender (nur Print Variable über Timer)
    Code:
    'Variable "A" wird zum testen hochgezählt und über die serielle Schittstelle gesendet
    'Funktion getestet ok
    
    '-------------------------------------------------------------------------------
    'Konfiguration µC:
    $regfile = "ATtiny2313.dat"                                 'ATtiny2313-Deklaration
    $crystal = 18432000                                         '18,432MHz
    $baud = 9600
    
    
    '-------------------------------------------------------------------------------
    '16Bit Timer:
    Config Timer1 = Timer , Prescale = 1024
    On Timer1 Timer_irq
    Const Timervorgabe = 47535                                  'also 1 mal pro Sekunde!!!
    Enable Timer1
    Enable Interrupts
    
    '-------------------------------------------------------------------------------
    'Ein- Ausgänge:
    Config Pinb.0 = Output
    Config Pind.6 = Output
    Led Alias Portd.6
    Led2 Alias Portb.0
    
    '-------------------------------------------------------------------------------
    'Variablen
     Dim Led_z As Byte
     Dim A As Integer
    
    '-------------------------------------------------------------------------------
    'Programm
    
    A = 12345
    Led = 0
    
    Do
    
    If A => 32767 Then
    A = 12345
    End If
    
    Loop
    
    
    
    '...............................................................................
    Timer_irq:
      Timer1 = Timervorgabe
      Incr A
      Print A
      Toggle Led
    Return
    ...

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    durch einen Zufall (2 Programme gemischt) hab ichnun eine Lösung die funktioniert, die ich aber nicht verstehe...
    Wer kann mir das erklären? >>A = Udr<< Wenn ich diesen Befehl weglasse ist alles immer 0 - Warum?

    Code:
    'zum empfangen von der seriellen schnittstelle
    
    '-------------------------------------------------------------------------------
    'Konfiguration µC:
    $regfile = "m8def.dat"                                      'AT-Mega8
    $crystal = 3686400                                          'Quarz: 3.6864 MHz
    $baud = 9600
    
    Dim A As Integer
    Dim B As Integer
    Dim C As Integer
    
    Config Pind.0 = Input
    Config Pind.3 = Output
    
    
    Print "ok"
    
    Do
    
    
    A = Udr  ' WENN ICH DIESE ZEILE WEG LASSE GEHT NICHTS MEHR!?                                                 
    
    Input B Noecho
    Print "out " ; B
    
    'zum testen
    C = B + 1
    Print "+1: " ; C
    
    Loop
    ...

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627

    Input bremst µC???

    Kann es sein, dass der "Input" Befehl den µC ausbremst? oder wartet der bis eine Eingabe kommt?

    Code:
    'Konfiguration µC:
    
    $regfile = "m8def.dat"                                      'AT-Mega8
    $crystal = 8000000                                          '18432000
    
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 8                                                ' default use 10 for the SW stack
    $baud = 38400                                               '9600                                           
    
    '_______________________________________________________________________________
    Ddrb = &B11111111                                           'PortB = Ausgang (PB0=A usw.)
    Ddrc = &B111111                                             'PortC = Ausgang
    Ddrd = &B11110011                                           'PortD = Ausgang (PD0=Anzeige1, PD4=A2, PD5=A3, PD6=A4) PD2/3 =INT
    
    'Config Int0 = Rising                                        'Falling                                       'wechsel von High auf Low
    'Config Int1 = Rising                                        'Falling                                       'wechsel von High auf Low
    'Enable Int0
    'Enable Int1
    'On Int0 Irq0
    'On Int1 Irq1
    
    
    '_______________________________________________________________________________
    Dim Anzeige_akt As Word                                     'Aktuelle Zeitmessung
    Dim Anzeige_str As String * 5                               'Zeit als String
    Dim Anzeige_str_len As Byte                                 'String-Länge
    Dim Anzeige_ziffer As String * 1                            'Aktuelle Ziffer
    Dim Anzeige_pos As Byte                                     'Aktuelle Ziffer im String
    Dim I As Byte                                               'Allgem. Laufzahl
    
    Dim Test As Word
    
    Dim A As Integer
    Dim B As Integer
    
    Dim Zeit As Word
    Dim Messzeit As Word                                        'in Millisekunden
    Dim Zeitfake As Word                                        'damit nicht mit dem Wert 0 gerechnet wird 
    
    
    
    '_______________________________________________________________________________
    'TIMER0 Konfiguration für Ziffernwechsel:
    Config Timer0 = Timer , Prescale = 1024                     '64                       '64 -> Timer0 für Anzeige
    Const T0_preload = 1                                        '150                                      '150 = Startwert Timer0 für 1,2kHz = 300Hz/Anzeige
    Tcnt0 = T0_preload
    
    On Timer0 Timer_irq_led                                     'Timer0-Overflow-Interrupt
    
    Enable Timer0                                               'Timer0 starten
    Enable Interrupts
    
    
    '_______________________________________________________________________________
    Zeit = 0                                                    'gemessene Zeit auf 0 setzen
    I = 1
    B = 0
    
    
    
    
    Do
    'Anzeige:
     Anzeige_str = Str(anzeige_akt)                             ' Wert in String umwandeln
          Anzeige_str_len = Len(anzeige_str)                    ' Stringlänge messen
    
          Anzeige_pos = Anzeige_str_len - I
          Anzeige_pos = Anzeige_pos + 1
    
          Anzeige_ziffer = Mid(anzeige_str , Anzeige_pos , 1)
    
          Portc = 0                                             'Ghosting vermeiden (damit nich auf allen Anzeigen die selbe Zahl steht!!!)
    
    
          Select Case Anzeige_ziffer                            'Ziffer auf Port
    
               Case "0" :
               Portd.2 = 1
               Portd.3 = 1
               Portd.4 = 1
               Portb.6 = 1
               Portb.7 = 1
               Portd.5 = 1
               Portd.6 = 0
               Portd.7 = 0                                      'NULL
    
               Case "1" :
               Portd.2 = 0
               Portd.3 = 1
               Portd.4 = 1
               Portb.6 = 0
               Portb.7 = 0
               Portd.5 = 0
               Portd.6 = 0
               Portd.7 = 0                                      'EINS
    
               Case "2" :
               Portd.2 = 1
               Portd.3 = 1
               Portd.4 = 0
               Portb.6 = 1
               Portb.7 = 1
               Portd.5 = 0
               Portd.6 = 1
               Portd.7 = 0                                      'ZWEI
    
               Case "3" :
               Portd.2 = 1
               Portd.3 = 1
               Portd.4 = 1
               Portb.6 = 1
               Portb.7 = 0
               Portd.5 = 0
               Portd.6 = 1
               Portd.7 = 0                                      'DREI
    
               Case "4" :
               Portd.2 = 0
               Portd.3 = 1
               Portd.4 = 1
               Portb.6 = 0
               Portb.7 = 0
               Portd.5 = 1
               Portd.6 = 1
               Portd.7 = 0                                      'VIER
    
               Case "5" :
               Portd.2 = 1
               Portd.3 = 0
               Portd.4 = 1
               Portb.6 = 1
               Portb.7 = 0
               Portd.5 = 1
               Portd.6 = 1
               Portd.7 = 0                                      'FÜNF
    
               Case "6" :
               Portd.2 = 1
               Portd.3 = 0
               Portd.4 = 1
               Portb.6 = 1
               Portb.7 = 1
               Portd.5 = 1
               Portd.6 = 1
               Portd.7 = 0                                      'SECHS
    
               Case "7" :
               Portd.2 = 1
               Portd.3 = 1
               Portd.4 = 1
               Portb.6 = 0
               Portb.7 = 0
               Portd.5 = 0
               Portd.6 = 0
               Portd.7 = 0                                      'SIEBEN
    
               Case "8" :
               Portd.2 = 1
               Portd.3 = 1
               Portd.4 = 1
               Portb.6 = 1
               Portb.7 = 1
               Portd.5 = 1
               Portd.6 = 1
               Portd.7 = 0                                      'ACHT
    
               Case "9" :
               Portd.2 = 1
               Portd.3 = 1
               Portd.4 = 1
               Portb.6 = 1
               Portb.7 = 0
               Portd.5 = 1
               Portd.6 = 1
               Portd.7 = 0                                      'NEUN
    
               Case Else :
               Portd.2 = 0
               Portd.3 = 0
               Portd.4 = 0
               Portb.6 = 0
               Portb.7 = 0
               Portd.5 = 0
               Portd.6 = 0
               Portd.7 = 0
    
          End Select
    
         'Segment wählen
          If I = 1 Then Portc.1 = 1                             'EINER
          'If I = 2 Then Portc.2 = 1                            'ZEHNER
          If I = 2 Then
          Portc.2 = 1                                           'ZEHNER
          Portd.7 = 1                                           'EINE Kommastelle
           End If
          If I = 3 Then Portc.3 = 1                             'HUNDERTER
          If I = 4 Then Portc.4 = 1                             'TAUSENDER
    
          I = I + 1                                             'Nächste Ziffer
          If I >= 5 Then I = 1                                  'max Anzeigen angeben! damit Anzeige möglichst hell ist(bei 5Anzeigen muss bei der 6. wieder bei 1 Angefangen werden)
    
    
    'ENDE ANZEIGE
    
    
    
    
    Anzeige_akt = B       'Wert zum anzeigen
    
    
    
    Loop
    
    
    
    
    
    '_______________________________________________________________________________
    Timer_irq_led:
    
    
          Tcnt0 = T0_preload                                    'Timer wieder laden
    
    A = Udr                                                     'Byte aus UART auslesen
    Input B Noecho                                              'über RS232 empfangen
    Print "out " ; B
    
    
    Return
    
    '-------------------------------------------------------------------------------
    'Anschlussbelegung am AT-MEGA8
    '-------------------------------------------------------------------------------
    
    'Segment A = PD2 (rote Ader)
    'Segment B = PD3
    'Segment C = PD4
    'Segment D = PB6
    'Segment E = PB7
    'Segment F = PD5
    'Segment G = PD6
    'Segment DP = PD7
    
    'Zahl 1 = PC1 ganz rechts EINER (rote Ader)
    'Zahl 2 = PC2 2.Stelle von Rechts ZEHNER
    'Zahl 3 = PC3 3.Stelle von Rechts Hunderter
    'Zahl 4 = PC4 4.Stelle von Rechts Tausender
    ...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •