PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 Atmega mit einander Komunizieren



LED-Lampe
13.02.2011, 23:02
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

$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


'*******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.

for_ro
13.02.2011, 23:15
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

LED-Lampe
13.02.2011, 23:21
Vielen Dank für den Tip!

LED-Lampe
13.02.2011, 23:48
Habe jetzt Folgenden Code.
Sender


$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


'*******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

for_ro
14.02.2011, 07:45
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?

LED-Lampe
14.02.2011, 16:17
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.

Michael
14.02.2011, 16:26
Hallo LED-Lampe,

oder soll ich lieber LED-Leuchte sagen?

http://bascom-forum.de/index.php/topic,4662.msg33974.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 (http://forums.opensuse.org/deutsch-german/community-talk/allgemeines-gequatsche/451092-warum-cross-postings-unerwuenscht-sind.html)

Gruß, Michael

for_ro
14.02.2011, 17:18
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.