- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 8 von 8

Thema: 2 Atmega mit einander Komunizieren

  1. #1
    LED-Lampe
    Gast

    2 Atmega mit einander Komunizieren

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich bräuchte dringend hilfe bei einer Schaltung. Ich habe an einem ATmega 8 Taster angeschlossen. 5 der Taster haben zusätzlich eine LED als Anzeige. Diese 5 Taster sollen schalten und die anderen drei sollen Tasten. Nun habe ich allen Tastern einen Ausgang zugeordnet, auch wenn die letzten drei keine LED haben. So habe ich nun alle Ausgänge auf einem port. Dieser port müsste irgendwie über eine Leitung zu einem zweiten µC übertragen werden. An dem sollen dan 8 Relais angeschlossen werden. Diese Relais sollen so wie die Ausgänge des ersten ICs reagieren.

    Hier habe ich mal ein paar Code-Schnipsel
    Code:
    $regfile = "m32def.dat"
    $crystal = 1000000
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    
    
        Config Porta = Output                                   'Ausgänge für die LEDs der Taster
        Config Portd = Input                                    'Taster eingänge
        Portd = &B11111111
    
    Config Debounce = 100
    
    
    Do
    Debounce Pind.0 , 0 , Rot , Sub
    Debounce Pind.1 , 0 , Gruen , Sub
    Debounce Pind.2 , 0 , Blau , Sub
    Debounce Pind.3 , 0 , Gelb , Sub
    Debounce Pind.4 , 0 , Weiss , Sub
    
    If Pind.5 = 0 Then                                          'Keine LED an Porta nur als Ausgang.
    Porta.5 = 1
    Else
    Porta.5 = 0
    End If
    
    If Pind.6 = 0 Then                                          ' nur Ausgang
    Porta.6 = 1
    Else
    Porta.6 = 0
    End If
    
    If Pind.7 = 0 Then                                          ' nur Ausgang
    Porta.7 = 1
    Else
    Porta.7 = 0
    End If
    
    
    
    Loop
    
    Rot:
    Toggle Porta.0
    Return
    
    Gruen:
    Toggle Porta.1
    Return
    
    Blau:
    Toggle Porta.2
    Return
    
    Gelb:
    Toggle Porta.3
    Return
    
    Weiss:
    Toggle Porta.4
    Return
    
    End
    Code:
    '*******Sender****************************************
    $regfile = "m32def.dat"
    $crystal = 7372800
    $framesize = 32
    $swstack = 32
    $hwstack = 70
    
    Dim A As Word
    
    
    Ddra = &B00000000
    Porta = &B11111111
    
    
    
    
    Open "ComB.0:2400,8,N,1,inverted" For Output As #1
    
    Do
       Debounce Pina.6 , 0 , Firstbutton , Sub
        Debounce Pina.5 , 0 , Rot , Sub
         Debounce Pina.4 , 0 , Gelb , Sub
    Loop
    Close #1
    End
    
    Firstbutton:
    
       Printbin #1 , A.1
    Return
    
    Rot:
    
      Printbin #1 , A.2
      Return
    
    
    Gelb:
    
      Printbin #1 , A.3
      Return
    
    '*******Empfänger*************************************
    $regfile = "m32def.dat"
    $crystal = 7372800
    $framesize = 32
    $swstack = 32
    $hwstack = 70
    
    Dim B As Word
    Ddra = &B11111111
    
    
    Open "ComB.0:2400,8,N,1,inverted" For Input As #1
    
    
    Do
    
    
      Inputbin #1 , B.1
      Toggle Porta.6
    
       Inputbin #1 , B.2
      Toggle Porta.5
    
       Inputbin #1 , B.3
      Toggle Porta.4
    
    
    Loop
    
    Close #1
    
    End
    Nur es Funktioniert nicht.
    Kann mir jemand helfen.

    Vielen Dank schonmal.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo LED-Lampe,
    ich glaube nicht, dass du über Printbin ein einzelnes Bit, z.B. A.1, übertragen kannst.
    Selbst ein Byte mit dem Wert 0 wird wahrscheinlich schwierig, weil dies kaum von gar keiner Übertragung unterschieden werden kann.
    Da du die Ausgänge alle auf einem Port liegen hast, kannst du auch ganz einfach den ganzen Port übertragen, z.B. mit
    Printbin #1, PortA
    Evtl. musst du den Port zunächst einer Variablen zuweisen und dann übertragen, also so:
    A = PortA
    Printbin #1, A


    Auf der Empfängerseite liest du dann wieder ein Byte ein und setzt den PortA wieder auf diesen Wert. Wenn du dazu den Hardware UART benutzt, kannst du den Interrupt URXC dazu verwenden:
    On URXC Uart_Isr
    Enable URXC
    Enable Interrupts
    ....
    End

    UART_Isr:
    PortA = UDR
    Return

  3. #3
    LED-Lampe
    Gast
    Vielen Dank für den Tip!

  4. #4
    LED-Lampe
    Gast
    Habe jetzt Folgenden Code.
    Sender
    Code:
    $regfile = "m32def.dat"
    $crystal = 1000000
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    
        Dim A As Word
        Config Porta = Output                                   'Ausgänge für die LEDs der Taster
        Config Portd = Input                                    'Taster eingänge
        Portd = &B11111111
    
    Config Debounce = 100
    Open "ComB.0:2400,8,N,1,inverted" For Output As #1
    
    Do
    Debounce Pind.0 , 0 , Rot , Sub
    Debounce Pind.1 , 0 , Gruen , Sub
    Debounce Pind.2 , 0 , Blau , Sub
    Debounce Pind.3 , 0 , Gelb , Sub
    Debounce Pind.4 , 0 , Weiss , Sub
    
    If Pind.5 = 0 Then                                          'Keine LED an Porta nur als Ausgang.
    Porta.5 = 1
    Else
    Porta.5 = 0
    End If
    
    If Pind.6 = 0 Then                                          ' nur Ausgang
    Porta.6 = 1
    Else
    Porta.6 = 0
    End If
    
    If Pind.7 = 0 Then                                          ' nur Ausgang
    Porta.7 = 1
    Else
    Porta.7 = 0
    End If
    
     Printbin #1 , Porta
    
    
     Close #1
    
    Loop
    
    Rot:
    Toggle Porta.0
    Return
    
    Gruen:
    Toggle Porta.1
    Return
    
    Blau:
    Toggle Porta.2
    Return
    
    Gelb:
    Toggle Porta.3
    Return
    
    Weiss:
    Toggle Porta.4
    Return
    
    End
    Empfänger
    Code:
    '*******Empfänger*************************************
    $regfile = "m32def.dat"
    $crystal = 7372800
    $framesize = 32
    $swstack = 32
    $hwstack = 70
    
    Dim A As Word
    Ddra = &B11111111
    
    
    Open "ComB.0:2400,8,N,1,inverted" For Input As #
    
    On URXC Uart_Isr
    Enable URXC
    Enable Interrupts
    End
    
    
    
     Do
      UART_Isr:
    PortA = UDR
    Return
    
    
    
    Loop
    
    
    Close #1
    
    End

    Kannst du mir beim Empfänger Helfen?
    Ich bekomme nur Fehlermeldungen beim Kompilieren.

    Vielen Dank

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hi,
    musst du den PinB.0 für die Kommunikation verwenden? Dies wäre dann kein Hardware UART und du kannst keinen Interrupt verwenden.
    Hast du die Pins D.0 und D.1 nicht mehr frei?

  6. #6
    LED-Lampe
    Gast
    Also ich habe den Port B eigentlich nur einfach so gewählt.
    Beim Sender habe ich mich für die Ports A und D entschieden. A Als eingang und D als Ausgang. Bei einem früheren Projekt hatte ich nämlich Probleme mit dem Port C und dem JTAG. Da fehlten trotz Deaktivierung zwei Kanäle. Den Port B habe ich nur so gewählt und 0 war eben der erste Port.

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    54
    Beiträge
    1.258
    Hallo LED-Lampe,

    oder soll ich lieber LED-Leuchte sagen?

    http://bascom-forum.de/index.php/top....html#msg33974


    1. Was ist ein cross posting?

    Darunter versteht man das Stellen derselben Frage in mehreren Listen und/oder Foren. Der User meint, er bekäme dadurch eine schnellere Antwort. Aber meist bekommt er nur mitgeteilt, dass er sich schlecht benommen hat. Warum?

    2. Du verschwendest Ressourcen

    Bedenke immer eins: Wir sind hier alle freiwillig und opfern unsere Freizeit. Zumindest meine Ressource "Freizeit" ist knapp bemessen und ich kenne viele freiwillige Helfer, denen es ähnlich geht. Wir machen das hier umsonst, nur weil es uns Spaß macht und persönlich weiter bringt. Da dem so ist, ist nichts ärgerlicher als Threads...Hier weiterlesen
    Gruß, Michael

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von LED-Lampe
    Also ich habe den Port B eigentlich nur einfach so gewählt.
    Beim Sender habe ich mich für die Ports A und D entschieden. A Als eingang und D als Ausgang. Bei einem früheren Projekt hatte ich nämlich Probleme mit dem Port C und dem JTAG. Da fehlten trotz Deaktivierung zwei Kanäle. Den Port B habe ich nur so gewählt und 0 war eben der erste Port.
    Hallo LED-Lampe,
    dann würde ich dir vorschlagen, die Hardware UARTs auf beiden Seiten zu nutzen.
    Dazu kannst du die Open Befehle weglassen und stattdessen auf beiden Seiten nur die Baudrate setzen:
    $baud = 2400
    Ebenso lässt du beim Printbin den Channel weg, also so:
    Printbin A

    Beim Empfänger dann wie oben beschrieben:
    On URXC Uart_Isr
    Enable URXC
    Enable Interrupts
    ....
    End

    UART_Isr:
    PortA = UDR
    Return


    Dann verbindest du die TX Leitung vom Sender (PortD.1) mit der RX Leitung des Empfängers (PortD.0) und es sollte etwas passieren.

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

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

Labornetzteil AliExpress