Wij hebben twee Atmel 2051 uC's, deze willen we via RS232 en de UART aan elkaar koppelen. Ik heb hier geen ervaring mee. Weten jullie hoe we dit eenvoudig kunnen aanpakken.
RES
RES
Denk niet dat je de RX en TX pinnen zomaar kan doorverbinden. Waarschijnlijk moet dat via een mux IC, een 4051/52/53 CMOS bijv. ?
Alleen hoe laat je elke uC weten welke bepaalde data moet gaan ontvangen, of versturen ? Je zal denk ik dat via RS232 moeten regelen, of net zoiets als MIDI, eerst een control byte.
Bij MIDI werkt het dmv optocouplers, een UART kan een stuk sneller dus snelle optocoupler nodig.
Zou het niet weten.
Jeroen Boere
IF you can't convince them, then confuse them!
ik denk dat je één van de controllers de master functie moet geven en de andere de slave. de master regelt de datatransfer. en waarom zou je niet zomaar de TX aan de RX en de RX aan de TX van een andere controller mogen hangen? daar zijn die dingen toch voor gemaakt.
RES
RES
Jep, je moet de RX1 aan TX2 en TX1 aan RX2 koppelen, dan ontvang je via RX1, dan stuur je TX1 naar RX2 (doorsturen in de software)
Bij zenden als volgt: TX1 gaat naar de RS232, als je dan TX2 wilt sturen doe je dat via RX1 (dan die data weer intern doorsturen)
Klopt ja, Master Slave routine. Wat ik niet weet is hoeveel van die controllers je mag linken (cascaded UARTs ?)
[Bericht gewijzigd door RES op ]
ik weet niet hoe het met UARTS zit, maar met RS232 mag je niet zo ver komen, max meter of 3. Soms wordt weleens 30 m gehaald, maar dit is afhankelijk van de omgeving, als het idd op kort afstand is: RS 232 gebruiken, veel simpeler
Vlg. mij hoef je niet eens 'n master en een slave uC te definiëren: Je hebt ten slotte een aparte lijn voor zenden en een lijn voor ontvangen. 'n Full-duplex verbinding dus.
Elke uC kan dus (vrijwel) willekeurig beginnen met data naar de andere uC zenden.
Zodra van de ontvangende uC de receive buffer vol is, wordt er nl. een interrupt gegenereerd (wel aanzetten in de config. registers van de UART uiteraard). De Interrupt afhandelingsroutine kan dan vervolgens de receive buffer uitlezen. Om de zender 't een beetje rustig aan te laten doen met verzenden van data (zodat de ontvangende uC fatsoenlijk de tijd krijgt om de ontvangen data op te ruimen), zou je de ontvangende uC een code terug kunnen laten sturen naar de zendende uC, zodat deze meteen weet dat de verzonden byte goed is aangekomen en ook dat 'ie de volgende kan versturen. (ACK of NACK terugsturen dus, ACK als byte is ontvangen en de ontvangende uC meteen gereed is voor 'n nieuwe byte, of een NACK als de byte wel ontvangen is, maar de ontvangende uC even niet meer byte wil krijgen).
Bij uitgebreidere RS232 interfaces doe je deze manier van datatransport regeling via hardware-lijnen, zoals CTS, DTR, RTS, enz. Maar die zijn bij de Atmel uC's niet meteen voorhanden.
Op deze manier maakt het dus niet uit welke uC het eerste begint met zenden, als de uC die 't eerst een byte ontvangt, zijn uitzenden maar uitstelt tot 'ie van de andere (zendende) uC een EOF (End Of File) code krijgt, zodat 'ie weet dat de zender verder niets meer te bieden heeft.
Komt het een beetje over wat ik bedoel?
Gooi ander maar ff een mailtje naar me toe als 't nog niet helemaal duidelijk is...
Tania_M
Bachelorette in de Elektronica, Afstudeerrichting Telecommunicatie; bijna Master in de Electronica, Ontwerptechnieken
MNM en RES en al de rest hebbengewoon gelijk:
TXD1 ---- RXD2
RXD1 ---- TXD2
simpeler kan niet. Je hebt ook niet echt een protocol nodig voor het te snel doorsturen van data. 'k ken de 2051 nu niet, maar zal ongetwijfeld geheugen hebben (inwendig of extern). Ja kan dan gewoon ringbuffers gebruiken waar je alle data in opslaat, en als je effe tijd hebt verwerk je die dan.
Je moet ook niet wachten met sturen tot de andere gedaan heeft met zenden. Uart Data Register is toch meestal 2 gescheiden registers (1 ontvangen, 1 sturen) die hetzelfde adres dragen.
van dat laaste ben ik niet zeker voor de 2051, maar met de 90 AVR reeks toch.
Maar als we wisten wat je wilt uitwisselen tussen de controllers zijn we ook al iets verder.
Maandag ga ik er even mee aan de slag. De bedoeling is de communicatie te testen met de atmels om deze later te vervangen door transceivers. Ik laat wel even weten of dit lukt. Bedankt voor de adviezen.
Het lukt nog niet helemaal. Ik heb nu de volgende code:
START:
MOV TMOD, #20H ;T1 is mode2
MOV TH1, #-3 ;9600 baud
MOV SCON, #50H ;8b, 1stop, 1start, REN enabled
SETB TR1 ;start T1
AGAIN: MOV SBUF, #AAH ;10101010 transmitted
HERE: JNB TI, HERE ;poll TI until all the bits are transmitted
CLR TI ;clear TI for the next character
SJMP AGAIN ;while(1) AJMP LOOP
;go to LOOP(jump back to point labeled LOOP)
.END Ik krijg een error bij de instructie: MOV SBUF, #AAH (undefined symbol). Enig idee waar dit aan kan liggen, of heeft iemand misschien een ander voorbeeldje.
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer