Beste,

Ik zou graag een communicatie opzetten tussen 2 pics waarvan 1 master de andere slave. Nu heb ik hiervoor het volgende gezien op picbasic.nl :

http://www.picbasic.nl/images/schema_communicatie.gif zeer mooi concept , maar het is bij mijn concept niet de bedoeling dat elke print een afzonderlijke voeding krijgt, ik bedoel hiermee dat ik op de databus geen 12V wil sturen naar elke print..

Kan ik hiervoor gewoon dat gedeelte weglaten uit het schema, of gaat dat zomaar niet?

Waarom dient die transistor tussen de TX en RX lijn ?

Ik denk dat dit grotendeels moet kunnen met aparte voedingen. Wel moet je even naar die 100K kijken. Dit is volgens mij een pull-up weerstand om de datalijn in rust hoog te houden. Dit word dus gedaan door die 4K7 buiten de print, dus waar die wel voor is ???

Die transistor is om te zenden. Op het moment dat er een "1" voorbij komt gaat de transistor geleiden en maakt de data lijn laag.

[Bericht gewijzigd door teunhaperen op (12%)]

Waarom dan zo moeilijk?

je kunt toch gewoon RX en TX kruislinks met elkaar verbinden, en je heb serieele comunicatie.

Wat is de afstand ongeveer tussen je pic's?

afstand is enkele centimeters, slave wordt normaal gesproken een insteekkaart op master, of komt zelfs op dezelfde print.

Het is best mogelijk dat er in de toekomst nog een 2de slave bijkomt maar dat is nog toekomstmuziek uiteraard.. Ik ga even proberen om gewoon dat 12V gedeelte weg te laten

Als je slechts 1 slave genruikt, is de UART de beste optie. Als je in de toekomst meerdere slaves gaat toepassen is I2C een goede keuze. (geen idee of dat PIC-ding dat aan boord heeft. Anders moet je gaan bitbangen.)

Je kan ook gewoon SPI gebruiken. Dat is het snelste. Als je uitbreidt, moet je wel per slave een cs-pin pin op je master programmeren en dan is zoals WilToyo al zei I²C het makkelijkst.

Heeft er iemand meer informatie hoe de uart verbinding tot stand gebracht dient te worden (elektronisch dan) en misschien een stukje code.

Zijn op internet wel SPI voorbeelden te vinden. Voordeel is dat de UART dan nog vrij is voor andere communicatie. Per slave een CS (chip select)pin gebruiken en je kunt naar meerdere slaves communiceren. Dat gaat je met UART minder goed lukken (kan wel maar dan moet je slave select opnemen in het RS232 protocol en niet in de harware).

SPI lijnen kun je gewoon kruislings aansluiten. Eventeel weerstand ertussen om problemen te voorkomen.

Groet Matthijs

Op 26 augustus 2009 13:14:35 schreef foxie:
Heeft er iemand meer informatie hoe de uart verbinding tot stand gebracht dient te worden (elektronisch dan) en misschien een stukje code.

De UART elektronisch aansluiten is niet anders dan drie draadjes (als je beide kanten op wilt communiceren.) 1 voor de tx, 1 rx en een GND.

Ik heb net het een en ander op een rijtje gezet wat ingangen en uitgangen betreft, ik ga genoeg hebben aan 1 master pic en 1 slave pic en ik ga dus gebruik gaan maken van UART, omdat dit voor dit type toepassing lijkt mij de beste keuze is. Er dient maar 1 kant opgecommuniceert te worden (MASTER >> SLAVE) dus een kruiselingse verbinden tussen RX/TX pennen op beide pic's volstaat. Ik ga me nu even wat voorbeeldcode zoeken om het een en ander te testen. Mocht iemand iets klaar hebben staat mag hij dat natuurlijk altijd posten :p

Als je 1 richting op communiceert heb ja maar een 2 draadjes nodig. Van de TX van de master naar de rx van de slave en een GND uiteraard

WilToyo: Wat bedoel je met een GND? Gewoon de GND van PIC1 verbinden met die van PIC2 ?

Beide pic gaan dezelfde GND delen van de voeding dus aan deze eis is al voldaan lijkt me dan.

Ja, beide GND's moeten aan elkaar. Bij een gezamenlijke voeding is dit dus al. Ik denk wel dat het verstandig is om zowel TX als RX aan te sluiten. Zo kun je bijvoorbeeld een terugkoppeling geven van de slave naar master dat de opdracht begrepen is.

Ik ga dus TX van pic 1 aan RX van pic2 hangen en omgekeerd, zo kan er inderdaad terugkoppeling zijn.

Ik heb volgende programmatjes gemaakt:

ZENDER:

Deze laat een rij ledjes oplichten en verstuurt daartusen ook nog waarde 12 naar de andere pic.


Device 16F628A                ;Gebruik een 16F628A type
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd 
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL 4                      ;Kristal van 20MHz
HSERIAL_BAUD  = 2400          ;Transmissiesnelheid van de data over de bus
HSERIAL_RCSTA = %10010000     ;Bit7:Enable serial port / Bit4:Continu ontvangen
HSERIAL_TXSTA = %00100000     ;Bit5:Transmitpin ingeschakeld


Symbol AAN  = 0               ;Geinverteerd AAN
Symbol OFF  = 0               ;UIT
Symbol On   = 1               ;AAN
Symbol UIT  = 1               ;Geinverteerd UIT

Symbol K1 = PORTA.0         ;Poort A.0 heeft nu de naam LED1
Symbol K2 = PORTA.1         ;Poort A.1 heeft nu de naam LED2
Symbol K3 = PORTA.2
Symbol K4 = PORTA.3
Symbol K5 = PORTA.4
Symbol K6 = PORTB.3
Symbol K7 = PORTB.4
Symbol K8 = PORTB.5
Symbol K9 = PORTB.6
Symbol K10 = PORTB.7
Symbol K11 = PORTB.0

Dim waarde As Byte

;        76543210
PORTA = %00000000             ;Alle PORTA poorten laag
TRISA = %00000000             ;Alle poorten uitgang
PORTB = %11111111
TRISB = %00000000
PORTB_PULLUPS On    
Clear

hoofdprogramma:

While 1=1
    waarde = 12
    HRSOut waarde
    GoTo hardwarecheck
Wend

hardwarecheck:

  K11 = OFF
  K1 = On
  DelayMS 100
  K1 = OFF
  K2 = On
  DelayMS 100
  K2=OFF
  K3=On
  DelayMS 100
  K3 = OFF
  K4 = On
  DelayMS 100
  K4 = OFF
  K5 = On
  DelayMS 100
  K5 = OFF
  K6 = On
  DelayMS 100
  K6 = OFF
  K7 = On
  DelayMS 100
  K7 = OFF
  K8 = On
  DelayMS 100
  K8 = OFF
  K9 = On
  DelayMS 100
  K9 = OFF
  K10 = On
  DelayMS 100
  K10 = OFF
  K11 = On
  DelayMS 100
GoTo hoofdprogramma

ONTVANGER:


Device 16F628A                ;Gebruik een 16F628A type
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd 
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL 4                      ;Kristal van 20MHz
HSERIAL_BAUD  = 2400          ;Transmissiesnelheid van de data over de bus
HSERIAL_RCSTA = %10010000     ;Bit7:Enable serial port / Bit4:Continu ontvangen
HSERIAL_TXSTA = %00100000     ;Bit5:Transmitpin ingeschakeld


Symbol AAN  = 0               ;Geinverteerd AAN
Symbol OFF  = 0               ;UIT
Symbol On   = 1               ;AAN
Symbol UIT  = 1               ;Geinverteerd UIT

Symbol K1 = PORTA.0         ;Poort A.0 heeft nu de naam LED1
Symbol K2 = PORTA.1         ;Poort A.1 heeft nu de naam LED2
Symbol K3 = PORTA.2
Symbol K4 = PORTA.3
Symbol K5 = PORTA.4
Symbol K6 = PORTB.3
Symbol K7 = PORTB.4
Symbol K8 = PORTB.5
Symbol K9 = PORTB.6
Symbol K10 = PORTB.7
Symbol K11 = PORTB.0

Dim waarde As Byte

;        76543210
PORTA = %00000000             ;Alle PORTA poorten laag
TRISA = %00000000             ;Alle poorten uitgang
PORTB = %11111111
TRISB = %00000000
PORTB_PULLUPS On    
Clear

hoofdprogramma:

While 1=1
    Clear waarde
    HRSin DEC3 waarde
    
    Select Case waarde
        Case 12:
            GoTo hardwarecheck
    End Select
Wend

hardwarecheck:
  

  K2 = On
  DelayMS 100
  K2=OFF
  DelayMS 100
GoTo hoofdprogramma

Deze ontvanger zou nadat hij waarde 12 heft ontvangen van de andere pic het ledje voor een korte tijd moeten doen oplichten en vervolgens weer moeten doven.

Echter dat gebeurt niet de communicatie tussen beide pics komt niet tot stand, rx van pic 1 hangt aan tx van pic2 en tx van pic1 hangt aan rx van pic2.

Heeft iemand een idee wat er verkeerd zou kUNNEN gaan ?

hier is het programma waar je om gevraagd had.

zender:

Device 16F628                 ;We gebruiken een 16F628 type
Config HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, BODEN_OFF, MCLRE_OFF

ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL          = 16            ;Gebruik een kristal van 16MHz
HSERIAL_BAUD  = 2400          ;Transmissiesnelheid van de data over de bus
HSERIAL_RCSTA = %10010000     ;Bit7:Enable serial port / Bit4:Continu ontvangen
HSERIAL_TXSTA = %00100000     ;Bit5:Transmitpin ingeschakeld

Symbol tijd = 100              ; tijd is 100
Dim waarde As Byte

Clear                          ; leeg alles
begin:                         ; begin
If 1 = 1 Then
waarde = 1                     ; waarde wordt 1
HSerOut [waarde]               ; zend waarde
DelayMS tijd                   ; wacht tijd
waarde = 2                     ; waarde wordt 2 
HSerOut [waarde]               ; zend waarde
DelayMS tijd                   ; wacht tijd
GoTo begin                     ; ga naar begin
End If

ontvanger:

Device 16F628                 ;We gebruiken een 16F628 type
Config HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, BODEN_OFF, MCLRE_OFF

ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL          = 16            ;Gebruik een kristal van 16MHz
HSERIAL_BAUD  = 2400          ;Transmissiesnelheid van de data over de bus
HSERIAL_RCSTA = %10010000     ;Bit7:Enable serial port / Bit4:Continu ontvangen
HSERIAL_TXSTA = %00100000     ;Bit5:Transmitpin ingeschakeld


Symbol led = PORTA.2                                     ;aansluiting led

Dim waarde As Byte

Clear                                              
begin:                                                   ; begin


HSerIn 1, begin , [waarde]                               ; serieele bus na 1Ms ga naar begin


Select waarde                                             
Case 1                                                   ; bij ontvangen waarde 1
High led                                                 ; led aan

Case 2                                                   ; bij ontvangen waarde 2
Low led                                                  ; led uit
End Select

GoTo begin                                                ; ga naar begin

dit programma heeft een tijd terug bij mij in de pic's gezeten om te testen en werkte toen.

dit werkt wel maar in 1 richting dus van zender naar ontvanger :)
pic 1 TX => pic 2 RX

jean

Ik heb het ondertussen zelfvoor elkaar gekregen om te communiceren tussen de 2 picjes, leuk leuk, alleen heb ik een probleempje wat denk ik (ben er bijna zeker van) software matig is:

ZENDER:


Device 16F628A
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd
XTAL = 4

HSERIAL_BAUD = 9600
HSERIAL_RCSTA = %10010000
HSERIAL_TXSTA = %00100000
HSERIAL_CLEAR = On


While 1=1

HRSOut 21
DelayMS 500
HRSOut 11
DelayMS 500


Wend

ONTVANGER:


;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
;WW                     VERKLARING VAN DE GEBRUIKTE WAARDES VOOR SERIEELE COMMUNICATIE TUSSEN DE 2 CONTROLLERS      WW
;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
;Elke kraan wordt vertegenwoordigd door 2 codes die zowel door zender als ontvanger gebruikt worden om kranen uit / in te schakelen de structuur die gevolgd word is de volgende
; Het 10-voud van het nummer van de kraan wordt genomen om de UIT status van de kraan te vertegenwoordigen
; Het 10-voud van het nummer van de kraan PLUS 1 wordt genomen om de AAN status van de kraan te vertegenwoordigen
; VOORBEELD:      KRAAN1:   10 -> UIT ; 11 -> AAN
;                  KRAAN10:  100 -> UIT ; 101 -> AAN

;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW                  
Device 16F628A
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC 
XTAL = 4
HSERIAL_BAUD = 9600
HSERIAL_RCSTA = %10010000
HSERIAL_TXSTA = %00100000
HSERIAL_CLEAR = On
PORTB_PULLUPS On 

Symbol AAN  = 0               ;Geinverteerd AAN
Symbol OFF  = 0               ;UIT
Symbol On   = 1               ;AAN
Symbol UIT  = 1               ;Geinverteerd UIT

Symbol K1 = PORTA.0         ;Poort A.0 heeft nu de naam LED1
Symbol K2 = PORTA.1         ;Poort A.1 heeft nu de naam LED2
Symbol K3 = PORTA.2
Symbol K4 = PORTA.3
Symbol K5 = PORTA.4
Symbol K6 = PORTB.3
Symbol K7 = PORTB.4
Symbol K8 = PORTB.5
Symbol K9 = PORTB.6
Symbol K10 = PORTB.7
Symbol K11 = PORTB.0

Dim ontvangst As Byte

;        76543210
PORTA = %00000000             ;Alle PORTA poorten laag
TRISA = %00000000             ;Alle poorten uitgang
PORTB = %00000000
TRISB = %00000000

Clear
DelayMS 500 


While 1=1
  
    ontvangst = HRSin ,{1000,timeout}
    
    Select Case ontvangst
        Case 10         
            K1 = OFF
        Case 11
            K1 = On
        Case 20
            K2 = OFF
        Case 21
            K2 = On
        Case 30
            K3 = OFF
        Case 31
            K3 = On
        Case 40
            K4 = OFF
        Case 41
            K4 = On
        Case 50
            K5 = OFF
        Case 51
            K5 = On
        Case 60
            K6 = OFF
        Case 61
            K6 = On
        Case 70
            K7 = OFF
        Case 71
            K7 = On
        Case 80
            K8 = OFF
        Case 81
            K8 = On
        Case 90
            K9 = OFF
        Case 91 
            K9 = On
        Case 100
            K10 = OFF
        Case 101
            K10 = On
        Case 110
            K11 = OFF
        Case 111
            K11 = On
        
    End Select
    
Wend


timeout:

;oTo hoofdlus

Zender stuurt dus achtereen volgens K1 en K2 aan op de ontvanger, maar aangezien ik in ontvanger deze enkel OP ON zet veronderstel ik dat ze gewoon blijven branden, niet is minder waar ze beginnen gewoon te knipperen (dus K1 aan, k2 uit; k1 uit k2 aan en zo maar verder..)

Ziet iemand waar de fout zit ?

Je zet elke halve seconde K1 aan volgende halve seconde K2 aan. Haal die oneindige while ereens uit. Zet er eventueel een delay van 2sev oid voor zodat de zender pas na 2 sec gaat zenden als je er spanning op zet.

Ik veronderstel dat je over de zender spreekt, ik heb de WHILE weggehaald en nog steeds hetzelfde resutlaat.

Maar dan het volgende ik zet in de zender K1 aan vervolgens K2 maar NIET terug uit dus ik mag toch wel veronderstellen dat die gewoon aan blijven ook al staan ze continu in een lus te draaien en krijgen ze continu het commando om aan te gaan ?

Stel dat ik zender aanpas en enkel maar K1 aanstuur en voor de rest geen code dan gaat K1 op de ontvanger perfect branden zoals het hoort, verbreek ik vervolgens de tx/rx kabels tussen de pics dan gaat tot mijn verbazing K1 uit.. Een beetje raar vind ik aangezien ik toch nergens een commando geef om K1 uit te schakelen? Het is toch niet omdat de verbinding tussen de 2 pics wegvalt dat hij daarmee ook alle signalen die hij heeft toegestuurd gekregen moet gaan verbreken..

[Bericht gewijzigd door Henry S. op (53%)]

Hm je hebt gelijk.
Ik kan geen basic, maar in de code is 'On' blauw. Ik ga er vanuit dat de kleuren zoals ze hier staan kloppen. Als dat zo is, is On syntax.

Die declaratie van on / off heb ik reeds eerder gebruikt om alle uitgangen van een gewone pic te testen en daar werkt het perfect dus dat klopt (dus getest op een pic die niet communiceerde met een andere pic)

Edit: Laat maar :)

Als ik zo naar je laatst geposte software kijk doen ze exact wat jij van ze vraagt. Dus wat is nu je probleem?

[Bericht gewijzigd door Boeip op (73%)]