-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Uart zwischen Atmega8 und Attiny2313

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.07.2012
    Beiträge
    171

    Uart zwischen Atmega8 und Attiny2313

    Anzeige

    Hallo Robotergemeinde,

    zuerst mal ein Lob für das tolle Forum.

    Zu meinem Problem, ich möchte via UART Daten in Form eines Strings von einem Atmega8 zu einen Attiny 2313 senden. Dieser soll die Daten auf einen Display ausgeben.
    Beide laufen mit 8MHZ und einer Baudrate von 19200 (Habe auch 9600, 4800, 2400 getestet). Alle beide MC´s benutzen den Hardware Uart.
    Mein Problem ist nun das nur wilde Zeichen auf dem Display ankommen.

    -Das Display ist i.O.
    -und die Daten vom Atmega8 werden auch korrekt gesendet (Anzeige am PC)

    Hardware:
    -Habe die RXD und TXD - Ausgänge der MC´s gedreht miteinander verbunden. (Hoffe das ist so OK )

    Software:
    -der Atmega sendet via Print nur einen einfachen Teststring
    Code:
    Print "HalloDu!"
    -beim Attiny habe ich so gut wie alle Möglichkeiten Versucht. INPUT/INPUTBIN/WAITKEY/INKEY... weder als Binärcode als String kommt was Gescheites an...
    Wobei bei Input glaube ich gar nichts angekommen ist, was mich vermuten lässt das Daten verloren gegangen sind und kein Vollständiges "Paket" übermittelt wurde.

    Hatt jemand evtl. eine Idee wo ich noch dran Drehen kann.

    tausend Dank

    mfG

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.02.2006
    Beiträge
    982
    Willkommen im FoRum.

    - Hast du RxD auf TxD und TxD auf RxD?
    - Haben beide den selben ground?
    - Haben beide die selbe Baudrate?

    Gruss, Andreas
    Nam et ipsa scientia potestas est..

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    Willkommen im Forum

    und danke für das Lob. Leider bin ich kein Bascom-er, ich programmiere in C, aber vielleicht kann ich doch helfen.

    Der 2313 hat so wenig SRAM, dass bei ihm - jedenfalls bei meinen wenigen Versuchen - die UART-Ausgabe nur äusserst spärlich möglich ist. Es könnte sein, dass Du garnicht genug Platz hast, um Deinen empfangenen String unterzubringen. Gibts in Bascom nach dem Compilieren eine Auskunft darüber, wieviel Bytes Flash und SRAM verbraucht werden? Ich hatte mal ne gute Weile nach nem Fehler gesucht - bis ich merkte, dass der Compiler immer wieder ein störungsfreies Compilat meldete - bei einem SRAM-Verbrauch von irgendwo mehr als 110 %. Da lief dann auch nix (war aber kein UART-Abenteuer).

    Lösungsvorschlag: WENN der Compiler nix Verdächtiges meldet, sende doch mal vom m8 den String "äh" - oder so.
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.07.2012
    Beiträge
    171
    Hallo Andreas

    und Danke für deine schnelle Antwort.

    -ja (ich prüf´s aber jetzt nochmal) Hängt aber sonst nicht dazwischen auch kein MAX232. Ist der notwendig?
    -ja (Modulbauweise, wird mit übergeben)
    -ja 19200 und beide 8MHz Taktung



    mfG
    Mario

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.07.2012
    Beiträge
    171
    Danke auch dir für deineschnelle Antwort Oberallgeier.

    Ich hatte auch schon eine Meldung das ich den SRAM überschritten habe. Habe dann erstmal alles eingekürzt. Mein String ist erstmal nur 8 Zeichen lang. das sollte eigentlich noch funktionieren. Aber ich werde mal alles raushauen um zu testen. evtl. hängts ja wirklich daren. Danke erstmal...

  6. #6
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    Zitat Zitat von dj_cyborg Beitrag anzeigen
    Hallo Andreas

    und Danke für deine schnelle Antwort.

    -ja (ich prüf´s aber jetzt nochmal) Hängt aber sonst nicht dazwischen auch kein MAX232. Ist der notwendig?
    -ja (Modulbauweise, wird mit übergeben)
    -ja 19200 und beide 8MHz Taktung



    mfG
    Mario
    Hey und willkommen,

    ein MAX232 ist für eine µC zu µC VErbindung nicht notwendig (eher überflüssig )
    Kannst du mal die beiden Quellcodes posten?
    Eventuell ist da der Wurm drin. Fuses sind auch richtig gesetzt? (Nicht das ein Chip noch ein Clockteilerfuse gesetzt hat oder sowas).
    Ansonsten testweise 1 Zeichen senden und gucken ob das klappt und dann hocharbeiten.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.02.2006
    Beiträge
    982
    Von uC zu uC hast du ja TTL Pegel, sprich 5V..da braucht es keinen MAX232.

    Den MAX232 brauchst du nur zum PC hin..
    Der serielle Port am PC hat EIA-232 konforme Pegel.. d.h. -12V fuer logic high und +12V fuer logic low.
    Nam et ipsa scientia potestas est..

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.07.2012
    Beiträge
    171
    Hi Daniel,
    auch dir Danke für deine Hilfe.

    Puh, da bin ich aber Froh das der Max232 überflüssig ist. Habe die Platine gestern fertig gefräst.

    Quellcode für den Sender Atmega8 (das wichtige steht ganz unten)
    Code:
    '*******************************************************************************
    '*******************************************************************************
    '******************************* CyBot V1.0 ************************************
    '*******************************************************************************
    '************************** 01.10.2012 by CYBORG *******************************
    '*******************************************************************************
    '*******************************************************************************
    
    '****************************** Allgemein **************************************
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    '**************************** LCD - Anzeige ************************************
    Declare Sub Print_out()
    $baud = 19200
    Dim Lcdcount As Integer
    
    '**************************** LED - Anzeige ************************************
    Declare Sub Led_mode()
    Led Alias Portc.1
    Config Led = Output
    Dim Led_in As Integer
    Dim Led_out As Integer
    Dim Led_count As Integer
    Dim Led_modus As String * 16
    Led_modus = "Stop"
    
    '******************************* Sensoren **************************************
    Declare Sub Sensor_check()
    Smfront Alias Pind.3
    Srfront Alias Pind.4
    Slfront Alias Pinb.6
    Smback Alias Pind.6
    Srback Alias Pinc.4
    Slback Alias Pind.7
    
    S1 Alias Pind.5
    S2 Alias Pinb.7
    
    Config Smfront = Input
    Config Srfront = Input
    Config Slfront = Input
    Config Smback = Input
    Config Srback = Input
    Config Slback = Input
    
    Config S1 = Input
    Config S2 = Input
    
    Portb.7 = 1       'PullUp-Widerstand einschalten
    Portb.6 = 1       'PullUp-Widerstand einschalten
    Portc.4 = 1       'PullUp-Widerstand einschalten
    Portd.3 = 1       'PullUp-Widerstand einschalten
    Portd.4 = 1       'PullUp-Widerstand einschalten
    Portd.5 = 1       'PullUp-Widerstand einschalten
    
    
    '***************************** RC5 - Sensor ************************************
    Declare Sub Rc5_check()
    'Config Rc5 = Pind.2
    '$lib "mcsbyte.lbx"
    'Enable Interrupts
    'Dim Rc5count As Integer
    'Dim Address As Byte , Command As Byte
    
    Rc5 Alias Pind.2
    Config Rc5 = Input
    Portd.2 = 1
    Config Timer0 = Timer , Prescale = 1
    On Timer0 Timer_irq
    Const Timervorgabe = 34
    Enable Timer0
    Enable Interrupts
    Dim Rc5bit As Bit
    
    '*************************** Motor - Antrieb ***********************************
    Declare Sub M_move()
    Mrfront Alias Portb.0
    Mrback Alias Portc.3
    Mrspeed Alias Portb.1
    Mlfront Alias Portb.5
    Mlback Alias Portb.4
    Mlspeed Alias Portb.2
    
    Config Mrfront = Output
    Config Mrback = Output
    Config Mrspeed = Output
    Config Mlfront = Output
    Config Mlback = Output
    Config Mlspeed = Output
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
    Compare1a = 0
    Compare1b = 0
    
    Dim Mfast As Integer
    Dim Mmedium As Integer
    Dim Mslow As Integer
    Dim Mstop As Integer
    Dim Mtimer As Integer
    Dim Mmodus As String * 16
    
    Mfast = 255
    Mmedium = 205
    Mslow = 155
    Mstop = 0
    
    '*************************** Motor - Lüfter ************************************
    Cleaner Alias Portb.3
    Config Cleaner = Output
    Cleaner = 0
    'Config Timer0 = Pwm , Prescale = 1
    
    '**************************** DC - Messung *************************************
    Declare Sub Adc_check()
    Const Adc_const = 0.0048828125       ' = 5.0 / 1024.0
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    Dim Adc_value As Word
    Dim Adc_volt As Single
    Dim Adc_count As Integer
    
    
    '*********************** Start - Hauptprogramm *********************************
    Do
    
    'LED Anzeigemodus setzen
    Led_mode
    
    'Spannung messen
    Adc_check
    
    'Sensoren abfragen
    Sensor_check
    
    'IR abfragen
    Rc5_check
    
    'Motoren steuern
    M_move
    
    'Display ausgabe
    Print_out
    
    
    Loop
    
    '************************ Start - LED Anzeige **********************************
    Sub Led_mode()
    
    'Modus setzen
    Select Case Led_modus
    
           Case "Normal"
                Led_in = 6000
                Led_out = 6000
    
           Case "Srfront"
                Led_in = 500
                Led_out = 500
    
           Case "Slfront"
                Led_in = 500
                Led_out = 500
    
           Case "Srback"
                Led_in = 500
                Led_out = 500
    
           Case "Slback"
                Led_in = 500
                Led_out = 500
    
           Case Else
                Led_in = 1
                Led_out = 0
    End Select
    
    'Led anzeige
    If Led = 0 Then
           If Led_count >= Led_out Then
                Led = 1
                Led_count = 0
           Else
                Led_count = Led_count + 1
           End If
    Elseif Led = 1 Then
           If Led_count >= Led_in Then
                Led = 0
                Led_count = 0
           Else
                Led_count = Led_count + 1
           End If
    End If
    
    End Sub
    
    '********************* Start - Spannungsmessung ********************************
    Sub Adc_check()
    
    If Adc_count = 500 Then
       Adc_value = Getadc(5)
       Adc_volt = Adc_value * Adc_const
       Adc_count = 0
    Else
        Adc_count = Adc_count + 1
    End If
    
    End Sub
    
    '************************ Start - Sensorcheck **********************************
    Sub Sensor_check()
    
    Select Case 1
    
               Case Srfront
                   Led_modus = "Srfront"
               Case Slfront
                   Led_modus = "Slfront"
               Case Srback
                   Led_modus = "Srback"
               Case Slback
                   Led_modus = "Slback"
               Case Else
                   Led_modus = "Normal"
    End Select
    
    End Sub
    
    '********************* Start - Antriebssteuerung *******************************
    Sub M_move()
    
    'Auf neue Sensorauslösung reagieren, ggf. Timer abbrechen
    If Led_modus <> Mmodus And Led_modus <> "Normal" Then
          Mmodus = Led_modus
          Mtimer = 0
    Else
       'Modus bis Timerende durchlaufen
      If Mtimer > 0 Then
         Mmodus = Mmodus
      Else
         Mmodus = Led_modus
         Mtimer = 0
      End If
    End If
    
    Select Case Mmodus
               Case "Stop"
                Mrfront = 0
                Mrback = 0
                Mlfront = 0
                Mlback = 0
                Compare1a = Mstop
                Compare1b = Mstop
               Case "Normal"
                Mrfront = 1
                Mrback = 0
                Mlfront = 1
                Mlback = 0
                Compare1a = Mmedium
                Compare1b = Mmedium
               Case "Srfront"
                If Mtimer <= 15000 Then
                  'Zurück fahren
                  Mrfront = 0
                  Mrback = 1
                  Mlfront = 0
                  Mlback = 1
                  Compare1a = Mmedium
                  Compare1b = Mmedium
                Elseif Mtimer <= 32000 Then
                  'rechts drehen
                  Mrfront = 0
                  Mrback = 1
                  Mlfront = 1
                  Mlback = 0
                  Compare1a = Mmedium
                  Compare1b = Mmedium
                Else
                  Mtimer = 0
                  Mmodus = "Normal"
                End If
               Case "Slfront"
                If Mtimer <= 15000 Then
                  'Zurück fahren
                  Mrfront = 0
                  Mrback = 1
                  Mlfront = 0
                  Mlback = 1
                  Compare1a = Mmedium
                  Compare1b = Mmedium
                Elseif Mtimer <= 32000 Then
                  'rechts drehen
                  Mrfront = 1
                  Mrback = 0
                  Mlfront = 0
                  Mlback = 1
                  Compare1a = Mmedium
                  Compare1b = Mmedium
                Else
                  Mtimer = 0
                  Mmodus = "Normal"
                End If
               Case "Srback"
                If Mtimer <= 15000 Then
                  'Zurück fahren
                  Mrfront = 1
                  Mrback = 0
                  Mlfront = 1
                  Mlback = 0
                  Compare1a = Mmedium
                  Compare1b = Mmedium
                Elseif Mtimer <= 32000 Then
                  'rechts drehen
                  Mrfront = 1
                  Mrback = 0
                  Mlfront = 0
                  Mlback = 1
                  Compare1a = Mmedium
                  Compare1b = Mmedium
                Else
                  Mtimer = 0
                  Mmodus = "Normal"
                End If
    
                Case "Slback"
                If Mtimer <= 15000 Then
                  'Zurück fahren
                  Mrfront = 1
                  Mrback = 0
                  Mlfront = 1
                  Mlback = 0
                  Compare1a = Mmedium
                  Compare1b = Mmedium
                Elseif Mtimer <= 32000 Then
                  'rechts drehen
                  Mrfront = 0
                  Mrback = 1
                  Mlfront = 1
                  Mlback = 0
                  Compare1a = Mmedium
                  Compare1b = Mmedium
                Else
                  Mtimer = 0
                  Mmodus = "Normal"
                End If
    
    End Select
    
    
    End Sub
    
    '*********************** Start - IR-Aktion ********************************
    Sub Rc5_check()
    
    'If Rc5count = 8 Then
    '  Getrc5(address , Command)
    '  If Address <> 255 Then
    '   Print Address ; Command
    '  End If
    '  Rc5count = 0
    'Else
    '      Rc5count = Rc5count + 1
    'End If
    
    End Sub
    
    
    Timer_irq:
    
      Timer0 = Timervorgabe
    
       'Motorlaufzeit zählen
      If Mmodus <> "Normal" Then
       Mtimer = Mtimer + 1
      End If
    
      'IR-Schnittstelle abfragen
      If Rc5 = 0 Then
         Rc5bit = 0
      End If
    Return
    
    '*********************** Start - DisplayAusgabe ********************************
    Sub Print_out()
    
     If Lcdcount = 5000 Then
          Print "HalloDu!"
    
          Lcdcount = 0
     Else
          Lcdcount = Lcdcount + 1
     End If
    
    End Sub
    
    End
    Und eine Variante für den Attiny2313 (Empfänger)
    Code:
    '*******************************************************************************
    '*******************************************************************************
    '************************** LCD to TXD/RXD V1.0 ********************************
    '*******************************************************************************
    '************************** 12.10.2012 by CYBORG *******************************
    '*******************************************************************************
    '*******************************************************************************
    
    '****************************** Allgemein **************************************
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    $hwstack = 40
    $swstack = 16
    $framesize = 32
    $baud = 19200
    
    '************************************ Buzzer ***********************************
    Buzzer Alias Portd.6
    Config Buzzer = Output
    
    '************************************* LCD *************************************
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portb.0 , Db6 = Portd.4 , _
       Db7 = Portd.3 , E = Portb.1 , Rs = Portb.2
    Config Lcd = 16 * 1a
    
    Initlcd
    
    Cls
    Locate 1 , 1
    Lcd " SYSTEM "
    Locate 2 , 1
    Lcd "loading!"
    
    '******************************** Taster ***************************************
    Tfor Alias Pind.2
    Tmode Alias Pina.0
    Tback Alias Pina.1
    
    Config Tfor = Input
    Config Tmode = Input
    Config Tback = Input
    
    Portd.2 = 1       'PullUp-Widerstand einschalten
    Porta.0 = 1       'PullUp-Widerstand einschalten
    Porta.1 = 1       'PullUp-Widerstand einschalten
    
    
    '******************************** TXD/RXD **************************************
    Dim My_string As String * 1
    
    
    
    
    '*********************** Start - Hauptprogramm *********************************
    Do
       If Ischarwaiting() = 1 Then
          My_string = Inkey()
          Cls
          Lcd My_string
       End If
    Loop
    
    
    End
    -die Leitungen habe ich nochmal geprüft, die sollten passen.
    -das Programm für die Attiny habe ich auch mal aufs nötigste gekürzt hat nichts gebracht.
    -FuseBits kontrolliere ich jetzt nochmal

    mfG
    Mario

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.07.2012
    Beiträge
    171
    Wastel, danke nochmal für die Erklärung zum MAX232, so lags mir auch im Sinn. Bin gerade eben nochmal etwas unsicher geworden...

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.07.2012
    Beiträge
    171
    Jiiippiiiiiiiiijjjjaaaaaaaaaaajjjjjjjjeeeeeeeeeeee , ihr seit Spitze

    der Teiler durch 8 war noch in den FuseBits... Hab gestern Nacht gegen 24:00 noch die Platine für den Attiny2313 bestückt und paar Code-Zeilen geschrieben... hätte ich lassen sollen, war wohl doch zu spät.

    Auf jedenfall jetzt klappts. tausend Dank Daniel und allen anderen für Eure Hilfe.

    TOP-Forum

    mfG
    Mario

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Anfänger Problem mit der UART (RS232) zwischen PC und ATMega8
    Von Schmidtbot im Forum C - Programmierung (GCC u.a.)
    Antworten: 15
    Letzter Beitrag: 24.11.2014, 20:17
  2. [ERLEDIGT] Probleme mit UART und ATtiny2313
    Von bnitram im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 23
    Letzter Beitrag: 17.07.2012, 10:55
  3. Datenübertragung zwischen 2 AVR mit UART
    Von MichWuhr im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 04.01.2010, 19:48
  4. UART zwischen Atmega32 und ATmega8
    Von Lunarman im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 07.06.2007, 17:22
  5. Fehler bei UART ausgabe mit ATtiny2313
    Von hagbart im Forum AVR Hardwarethemen
    Antworten: 9
    Letzter Beitrag: 08.03.2006, 20:19

Stichworte

Berechtigungen

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