Hola compañero
muy bueno ese pdf, y en colores, muy bueno,
pongo el codigo que estoy usando, es el mismo para los dos pic
pero con "algunas cosillas que estoy probando".
//main.h
#include <18F2550.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES MCLR //Master Clear pin enabled
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12 //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV4 //System Clock by 4
#FUSES USBDIV //USB clock source comes from PLL divide by 2
#FUSES NOVREGEN //USB voltage regulator disabled
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
//#use fast_io(A)
#define SS1 PIN_A5
#define SS2 PIN_A3
#define PIC1 0
#define PIC2 1
//main.c
#include "C:\spi_pic18F2550\master_04_03\main.h"
void SSP_isr(void)
{
int8 i;
if(spi_data_is_in()){ // Esto sirve para detectar que hay o no un dato en el SPI al leer.
//dato=spi_read();
i=spi_read();
output_bit(pin_c0,bit_test(i,0));
output_bit(pin_c1,bit_test(i,1));
output_bit(pin_c2,bit_test(i,2));
output_bit(pin_B7,bit_test(i,3));
}//fin if
}
int taBCD[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int dato; //variable entera que sirve para que , al incrementar, vaya variando el dato.
//int8 i;
int8 npic;
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_16);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
// deshabilito la secion de esclavo con ssx=1
output_high(SS1);
output_high(SS2);
delay_ms(1000);
delay_ms(200);
//que tipo de pic es
npic=input(PIN_A0);
while(true) {
for(dato=0;dato<10;dato++) {
if(npic==pic2){
// detecta numero par-impar
if(bit_test(dato,0)==1){ // 1-3-5-7-9
output_low(SS1); // activo esclavo 1
spi_write(taBCD[dato]);
delay_ms(300);
output_high(SS1); // desactivo esclavo 1
}
}
if(npic==pic1){
if(bit_test(dato,0)==0){ // 0-2-4-6-8
output_low(SS2); //activo esclavo 2
spi_write(taBCD[dato]);
delay_ms(300);
output_high(SS2); //desactivo esclo 2
}
}
}//fin for
} //fin while
}
El esquema que utilizo esta en el post anterior.
http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=39900.0;attach=20165Aclaro que segun el valor del pin A0 el mismo codigo
se ejecutara en el pic 1 y pic 2 de diferente modo resultando
comportamientos diferentes.
Deberia de funcionar, en teoria pero en la simulación
algo falla.
las conexiones (dos master: full-duplex)
==============
::PIC1:: ::PIC2::
===========================
---SCK----------------SCK
---SDI----------------SDO1
---SDO---------------SDI1
---SS1(A5)-----------SS1(A5)
---SS2(A3)-----------SS2(A3)
ambos pic tienen asignados dos ss
si pic 1 quire enviar a pic 2 usara A3(SS2)
y si el pic 2 quiere enviar a pic 1 usara A5(SS1)
como usan diferentes lineas se podria dar el full-duplex
Pero veo un problema, solo hay un solo registro de bufer
que lo utiliza tanto para enviar como para recibir.
Por lo tanto seguro que hay colisiones.
ademas cuando un dispositivo quiere enviar toma el control del pin de clock
pin --> SCK y en mi esquema solo hay una linea de clock que une
a los dos pines de clock de los maestros.
Por lo tanto una vez mas hay colisiones.
voy a sistetizar y analizar cuidadosamente esto con la ayuda del pdf.
....
..
Por lo que he leido en el pdf que me compartio el amigo RALF2
es posible la recepcion y envio simultaneo.
por lo visto es posible pero hay que retocar algunos registros
para saber cuando se envia o se recibe.
voy a ver si resuelvo, el enigma.