Autor Tema: :: SPI - PIC18F2550 - INT ::  (Leído 2491 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
:: SPI - PIC18F2550 - INT ::
« en: 04 de Enero de 2013, 17:28:36 »
Hola Compañeros

Feliz Año Nuevo a todos ustedes.

Empezamos el año con el bus spi, acabo de iniciarme en este protocolo
y estoy probando cosas, de momento monte dos pic18F2550 (maestro-esclavo) y unos led,
la cosa es sencilla un pulsador, si pulso le envio un dato al esclavo todo esto con un while y un if.
montado y probado con proteus y ccs funciona.

Pero ahora quise usar interrupciones.

Si pulso boton hay cambio de esto en el pin y se genera una interruncion y se envia el dato
del master al esclavo la teoria parece buena verdad?, ...pero hay la practica....

En la practica se complica, la RB0 coincide con el con el pin del spi,
si utilizo el b4-b7 no se que le ocurre que si que cambia el teminal de estado bajo a alto pero
la interrupcion debe de estar con los reyes magos...en el proteus el debug de spi
no muestra nada es como si no entrase en la interrupcion.

pongo el codigo del master: IDE CCS v4.104
interrupciones definidas
Código: CSS
  1. //18F2550.h
  2.  
  3. //////// Standard Header file for the PIC18F2550 device ////////////////
  4. #device PIC18F2550
  5. #nolist
  6. //////// Program memory: 16384x16  Data RAM: 2048  Stack: 31
  7. //////// I/O: 23   Analog Pins: 10
  8. //////// Data EEPROM: 256
  9. //////// C Scratch area: 00   ID Location: 200000
  10. //////// Fuses: XT,XTPLL,EC_IO,EC,ECPIO,ECPLL,INTRC_IO,INTRC,PROTECT
  11. //////// Fuses: NOPROTECT,BROWNOUT_NOSL,BROWNOUT_SW,NOBROWNOUT,BROWNOUT,WDT1
  12. //////// Fuses: WDT2,WDT4,WDT8,WDT16,WDT32,WDT64,WDT128,WDT,NOWDT,BORV20
  13. //////// Fuses: BORV28,BORV43,BORV46,PUT,NOPUT,CPD,NOCPD,NOSTVREN,STVREN
  14. //////// Fuses: NODEBUG,DEBUG,NOLVP,LVP,WRT,NOWRT,WRTD,NOWRTD,IESO,NOIESO
  15. //////// Fuses: FCMEN,NOFCMEN,PBADEN,NOPBADEN,CCP2B3,CCP2C1,WRTC,NOWRTC,WRTB
  16. //////// Fuses: NOWRTB,EBTR,NOEBTR,EBTRB,NOEBTRB,CPB,NOCPB,MCLR,NOMCLR
  17. //////// Fuses: LPT1OSC,NOLPT1OSC,XINST,WDT256,WDT512,WDT1024,WDT2048
  18. //////// Fuses: WDT4096,WDT8192,WDT16384,WDT32768,NOXINST,INTXT,INTHS,HS
  19. //////// Fuses: HSPLL,PLL1,PLL2,PLL3,PLL4,PLL5,PLL6,PLL10,PLL12,CPUDIV1
  20. //////// Fuses: CPUDIV2,CPUDIV3,CPUDIV4,USBDIV,NOUSBDIV,VREGEN,NOVREGEN
  21. ////////
  22. ////////////////////////////////////////////////////////////////// I/O
  23. // Discrete I/O Functions: SET_TRIS_x(), OUTPUT_x(), INPUT_x(),
  24. //                         PORT_x_PULLUPS(), INPUT(),
  25. //                         OUTPUT_LOW(), OUTPUT_HIGH(),
  26. //                         OUTPUT_FLOAT(), OUTPUT_BIT()
  27. // Constants used to identify pins in the above are:
  28.  
  29. #define PIN_A0  31744
  30. #define PIN_A1  31745
  31. #define PIN_A2  31746
  32. #define PIN_A3  31747
  33. #define PIN_A4  31748
  34. #define PIN_A5  31749
  35. #define PIN_A6  31750
  36.  
  37. #define PIN_B0  31752
  38. #define PIN_B1  31753
  39. #define PIN_B2  31754
  40. #define PIN_B3  31755
  41. #define PIN_B4  31756
  42. #define PIN_B5  31757
  43. #define PIN_B6  31758
  44. #define PIN_B7  31759
  45.  
  46. #define PIN_C0  31760
  47. #define PIN_C1  31761
  48. #define PIN_C2  31762
  49. #define PIN_C4  31764
  50. #define PIN_C5  31765
  51. #define PIN_C6  31766
  52. #define PIN_C7  31767
  53.  
  54. #define PIN_E3  31779
  55.  
  56. ////////////////////////////////////////////////////////////////// Useful defines
  57. #define FALSE 0
  58. #define TRUE 1
  59.  
  60. #define BYTE int8
  61. #define BOOLEAN int1
  62.  
  63. #define getc getch
  64. #define fgetc getch
  65. #define getchar getch
  66. #define putc putchar
  67. #define fputc putchar
  68. #define fgets gets
  69. #define fputs puts
  70.  
  71. ////////////////////////////////////////////////////////////////// Control
  72. // Control Functions:  RESET_CPU(), SLEEP(), RESTART_CAUSE()
  73. // Constants returned from RESTART_CAUSE() are:
  74.  
  75. #define WDT_TIMEOUT       7    
  76. #define MCLR_FROM_SLEEP  11    
  77. #define MCLR_FROM_RUN    15    
  78. #define NORMAL_POWER_UP  12    
  79. #define BROWNOUT_RESTART 14    
  80. #define WDT_FROM_SLEEP   3    
  81. #define RESET_INSTRUCTION 0    
  82. ////////////////////////////////////////////////////////////////// Timer 0
  83. // Timer 0 (AKA RTCC)Functions: SETUP_COUNTERS() or SETUP_TIMER_0(),
  84. //                              SET_TIMER0() or SET_RTCC(),
  85. //                              GET_TIMER0() or GET_RTCC()
  86. // Constants used for SETUP_TIMER_0() are:
  87. #define T0_INTERNAL   0
  88. #define T0_EXT_L_TO_H 32
  89. #define T0_EXT_H_TO_L 48
  90.  
  91. #define T0_DIV_1      8
  92. #define T0_DIV_2      0
  93. #define T0_DIV_4      1
  94. #define T0_DIV_8      2
  95. #define T0_DIV_16     3
  96. #define T0_DIV_32     4
  97. #define T0_DIV_64     5
  98. #define T0_DIV_128    6
  99. #define T0_DIV_256    7
  100.  
  101. #define T0_OFF        0x80  
  102.  
  103. #define T0_8_BIT      0x40  
  104.  
  105. #define RTCC_INTERNAL   0      // The following are provided for compatibility
  106. #define RTCC_EXT_L_TO_H 32     // with older compiler versions
  107. #define RTCC_EXT_H_TO_L 48
  108. #define RTCC_DIV_1      8
  109. #define RTCC_DIV_2      0
  110. #define RTCC_DIV_4      1
  111. #define RTCC_DIV_8      2
  112. #define RTCC_DIV_16     3
  113. #define RTCC_DIV_32     4
  114. #define RTCC_DIV_64     5
  115. #define RTCC_DIV_128    6
  116. #define RTCC_DIV_256    7
  117. #define RTCC_OFF        0x80  
  118. #define RTCC_8_BIT      0x40  
  119.  
  120. // Constants used for SETUP_COUNTERS() are the above
  121. // constants for the 1st param and the following for
  122. // the 2nd param:
  123.  
  124. ////////////////////////////////////////////////////////////////// WDT
  125. // Watch Dog Timer Functions: SETUP_WDT() or SETUP_COUNTERS() (see above)
  126. //                            RESTART_WDT()
  127. // WDT base is 4ms
  128. //
  129. #define WDT_ON        0x100
  130. #define WDT_OFF       0
  131.  
  132. ////////////////////////////////////////////////////////////////// Timer 1
  133. // Timer 1 Functions: SETUP_TIMER_1, GET_TIMER1, SET_TIMER1
  134. // Constants used for SETUP_TIMER_1() are:
  135. //      (or (via |) together constants from each group)
  136. #define T1_DISABLED         0
  137. #define T1_INTERNAL         0x85
  138. #define T1_EXTERNAL         0x87
  139. #define T1_EXTERNAL_SYNC    0x83
  140.  
  141. #define T1_CLK_OUT          8
  142.  
  143. #define T1_DIV_BY_1         0
  144. #define T1_DIV_BY_2         0x10
  145. #define T1_DIV_BY_4         0x20
  146. #define T1_DIV_BY_8         0x30
  147.  
  148. ////////////////////////////////////////////////////////////////// Timer 2
  149. // Timer 2 Functions: SETUP_TIMER_2, GET_TIMER2, SET_TIMER2
  150. // Constants used for SETUP_TIMER_2() are:
  151. #define T2_DISABLED         0
  152. #define T2_DIV_BY_1         4
  153. #define T2_DIV_BY_4         5
  154. #define T2_DIV_BY_16        6
  155.  
  156. ////////////////////////////////////////////////////////////////// Timer 3
  157. // Timer 3 Functions: SETUP_TIMER_3, GET_TIMER3, SET_TIMER3
  158. // Constants used for SETUP_TIMER_3() are:
  159. //      (or (via |) together constants from each group)
  160. #define T3_DISABLED         0
  161. #define T3_INTERNAL         0x85
  162. #define T3_EXTERNAL         0x87
  163. #define T3_EXTERNAL_SYNC    0x83
  164.  
  165. #define T3_DIV_BY_1         0
  166. #define T3_DIV_BY_2         0x10
  167. #define T3_DIV_BY_4         0x20
  168. #define T3_DIV_BY_8         0x30
  169.  
  170. // OR in one of the following to use timer 3 with a CCP unit
  171. #define  T3_CCP1_TO_2  0x48
  172. #define  T3_CCP2       0x8
  173.  
  174. ////////////////////////////////////////////////////////////////// CCP
  175. // CCP Functions: SETUP_CCPx, SET_PWMx_DUTY
  176. // CCP Variables: CCP_x, CCP_x_LOW, CCP_x_HIGH
  177. // Constants used for SETUP_CCPx() are:
  178. #define CCP_OFF                         0
  179. #define CCP_CAPTURE_FE                  4
  180. #define CCP_CAPTURE_RE                  5
  181. #define CCP_CAPTURE_DIV_4               6
  182. #define CCP_CAPTURE_DIV_16              7
  183. #define CCP_COMPARE_SET_ON_MATCH        8
  184. #define CCP_COMPARE_CLR_ON_MATCH        9
  185. #define CCP_COMPARE_INT                 0xA
  186. #define CCP_COMPARE_INT_AND_TOGGLE      0x2      
  187. #define CCP_COMPARE_RESET_TIMER         0xB
  188. #define CCP_PWM                         0xC
  189. #define CCP_PWM_PLUS_1                  0x1c
  190. #define CCP_PWM_PLUS_2                  0x2c
  191. #define CCP_PWM_PLUS_3                  0x3c
  192. //#define CCP_USE_TIMER3                0x100  OBSOLETE, SEE TIMER-3    
  193. #word   CCP_1    =                      getenv("SFR:CCPR1L")
  194. #byte   CCP_1_LOW=                      getenv("SFR:CCPR1L")
  195. #byte   CCP_1_HIGH=                     getenv("SFR:CCPR1H")
  196. #word   CCP_2    =                      getenv("SFR:CCPR2L")
  197. #byte   CCP_2_LOW=                      getenv("SFR:CCPR2L")
  198. #byte   CCP_2_HIGH=                     getenv("SFR:CCPR2H")
  199. ////////////////////////////////////////////////////////////////// SPI
  200. // SPI Functions: SETUP_SPI, SPI_WRITE, SPI_READ, SPI_DATA_IN
  201. // Constants used in SETUP_SPI() are:
  202. #define SPI_MASTER       0x20
  203. #define SPI_SLAVE        0x24
  204. #define SPI_L_TO_H       0
  205. #define SPI_H_TO_L       0x10
  206. #define SPI_CLK_DIV_4    0
  207. #define SPI_CLK_DIV_16   1
  208. #define SPI_CLK_DIV_64   2
  209. #define SPI_CLK_T2       3
  210. #define SPI_SS_DISABLED  1
  211.  
  212. #define SPI_SAMPLE_AT_END 0x8000
  213. #define SPI_XMIT_L_TO_H  0x4000
  214.  
  215. ////////////////////////////////////////////////////////////////// UART
  216. // Constants used in setup_uart() are:
  217. // FALSE - Turn UART off
  218. // TRUE  - Turn UART on
  219. #define UART_ADDRESS           2
  220. #define UART_DATA              4
  221. #define UART_AUTODETECT        8
  222. #define UART_AUTODETECT_NOWAIT 9
  223. #define UART_WAKEUP_ON_RDA     10
  224. #define UART_SEND_BREAK        13
  225. ////////////////////////////////////////////////////////////////// COMP
  226. // Comparator Variables: C1OUT, C2OUT
  227. // Constants used in setup_comparator() are:
  228. #define A0_A3_A1_A3  0xfff04
  229. #define A0_A3_A1_A2_OUT_ON_A4_A5  0xfcf03
  230. #define A0_A3_A1_A3_OUT_ON_A4_A5  0xbcf05
  231. #define NC_NC_NC_NC  0x0ff07
  232. #define A0_A3_A1_A2  0xfff02
  233. #define A0_A3_NC_NC_OUT_ON_A4  0x9ef01
  234. #define A0_VR_A1_VR 0x3ff06
  235. #define A3_VR_A2_VR 0xcff0e
  236. #define CP1_INVERT  0x0000010
  237. #define CP2_INVERT  0x0000020
  238.  
  239. #bit C1OUT = 0xfb4.6    
  240. #bit C2OUT = 0xfb4.7    
  241.  
  242. ////////////////////////////////////////////////////////////////// VREF
  243. // Constants used in setup_vref() are:
  244. //
  245. #define VREF_LOW  0xa0
  246. #define VREF_HIGH 0x80
  247. // Or (with |) the above with a number 0-15
  248. #define VREF_F5   0x40
  249. #define VREF_COMP 0x10
  250.  
  251. ////////////////////////////////////////////////////////////////// VREF
  252. // Constants used in setup_low_volt_detect() are:
  253. //
  254. #define LVD_LVDIN   0x1F
  255. #define LVD_45 0x1E
  256. #define LVD_42 0x1D
  257. #define LVD_40 0x1C
  258. #define LVD_38 0x1B
  259. #define LVD_36 0x1A
  260. #define LVD_35 0x19
  261. #define LVD_33 0x18
  262. #define LVD_30 0x17
  263. #define LVD_28 0x16
  264. #define LVD_27 0x15
  265. #define LVD_25 0x14
  266. #define LVD_24 0x13
  267. #define LVD_23 0x12
  268. #define LVD_22 0x11
  269. #define LVD_21 0x10
  270.  
  271. #define LVD_TRIGGER_BELOW 0
  272. #define LVD_TRIGGER_ABOVE 0x80
  273.  
  274.  
  275. ////////////////////////////////////////////////////////////////// INTERNAL RC
  276. // Constants used in setup_oscillator() are:
  277. // First param:
  278. #define OSC_31KHZ   0
  279. #define OSC_125KHZ  0x10
  280. #define OSC_250KHZ  0x20
  281. #define OSC_500KHZ  0x30
  282. #define OSC_1MHZ    0x40
  283. #define OSC_2MHZ    0x50
  284. #define OSC_4MHZ    0x60
  285. #define OSC_8MHZ    0x70
  286. #define OSC_16MHZ   0x4060
  287. #define OSC_32MHZ   0x4070
  288. // The following may be OR'ed in with the above using |
  289. #define OSC_TIMER1  1
  290. #define OSC_INTRC   2
  291. #define OSC_NORMAL  0
  292. // The following may be OR'ed in with the above using |
  293. #define OSC_IDLE_MODE  0x80
  294. #define OSC_31250   0x8000
  295. #define OSC_PLL_ON  0x4000
  296. #define OSC_PLL_OFF 0
  297. // A second optional parameter may be used with this part to fine
  298. // tune the speed (signed int,0-31)
  299. // Result may be (ignore all other bits)
  300. #define OSC_STATE_STABLE 4
  301. #define OSC_STATE_EXT_RUNNING 8
  302.  
  303.  
  304. ////////////////////////////////////////////////////////////////// ADC
  305. // ADC Functions: SETUP_ADC(), SETUP_ADC_PORTS() (aka SETUP_PORT_A),
  306. //                SET_ADC_CHANNEL(), READ_ADC()
  307. // Constants used for SETUP_ADC() are:
  308. #define ADC_OFF               0           // ADC Off
  309. #define ADC_CLOCK_DIV_2   0x100
  310. #define ADC_CLOCK_DIV_4    0x04
  311. #define ADC_CLOCK_DIV_8    0x01
  312. #define ADC_CLOCK_DIV_16   0x05
  313. #define ADC_CLOCK_DIV_32   0x02
  314. #define ADC_CLOCK_DIV_64   0x06
  315. #define ADC_CLOCK_INTERNAL 0x07           // Internal 2-6us
  316.  
  317. // Constants used in SETUP_ADC_PORTS() are:
  318. #define NO_ANALOGS   0x0F   // None
  319. #define ALL_ANALOG   0x00   // A0 A1 A2 A3 A5 B2 B3 B1 B4 B0              
  320. #define AN0_TO_AN11  0x03   // A0 A1 A2 A3 A5 B2 B3 B1 B4                
  321. #define AN0_TO_AN10  0x04   // A0 A1 A2 A3 A5 B2 B3 B1                    
  322. #define AN0_TO_AN9   0x05   // A0 A1 A2 A3 A5 B2 B3                      
  323. #define AN0_TO_AN8   0x06   // A0 A1 A2 A3 A5 B2                          
  324. #define AN0_TO_AN4   0x0A   // A0 A1 A2 A3 A5
  325. #define AN0_TO_AN3   0x0B   // A0 A1 A2 A3
  326. #define AN0_TO_AN2   0x0C   // A0 A1 A2
  327. #define AN0_TO_AN1   0x0D   // A0 A1
  328. #define AN0          0x0E   // A0
  329. #define AN0_TO_AN11_ANALOG     0x03   //!old only provided for compatibility
  330. #define AN0_TO_AN10_ANALOG     0x04   //!old only provided for compatibility
  331. #define AN0_TO_AN9_ANALOG      0x05   //!old only provided for compatibility
  332. #define AN0_TO_AN8_ANALOG      0x06   //!old only provided for compatibility
  333. #define AN0_TO_AN4_ANALOG      0x0A   //!old only provided for compatibility
  334. #define AN0_TO_AN3_ANALOG      0x0B   //!old only provided for compatibility
  335. #define AN0_TO_AN2_ANALOG      0x0C   //!old only provided for compatibility
  336. #define AN0_TO_AN1_ANALOG      0x0D   //!old only provided for compatibility
  337. #define AN0_ANALOG             0x0E   //!old only provided for compatibility
  338.  
  339. // The following may be OR'ed in with the above using |
  340. #define VSS_VDD               0x00              // Range 0-Vdd
  341. #define VREF_VREF             0x30              // Range VrefL-VrefH
  342. #define VREF_VDD              0x20              // Range VrefL-Vdd
  343. #define VSS_VREF              0x10              // Range 0-VrefH
  344.  
  345.  
  346. // Constants used in READ_ADC() are:
  347. #define ADC_START_AND_READ     7   // This is the default if nothing is specified
  348. #define ADC_START_ONLY         1
  349. #define ADC_READ_ONLY          6
  350.  
  351.  
  352.  
  353.  
  354.  
  355. ////////////////////////////////////////////////////////////////// INT
  356. // Interrupt Functions: ENABLE_INTERRUPTS(), DISABLE_INTERRUPTS(),
  357. //                      CLEAR_INTERRUPT(), INTERRUPT_ACTIVE(),
  358. //                      EXT_INT_EDGE()
  359. //
  360. // Constants used in EXT_INT_EDGE() are:
  361. #define L_TO_H              0x40
  362. #define H_TO_L                 0
  363. // Constants used in ENABLE/DISABLE_INTERRUPTS() are:
  364. #define GLOBAL                    0xF2C0
  365. #define INT_RTCC                  0x00F220
  366. #define INT_TIMER0                0x00F220
  367. #define INT_TIMER1                0x009D01
  368. #define INT_TIMER2                0x009D02
  369. #define INT_TIMER3                0x00A002
  370. #define INT_EXT_L2H               0x5000F210
  371. #define INT_EXT_H2L               0x6000F210
  372. #define INT_EXT                   0x00F210
  373. #define INT_EXT1_L2H              0x5001F008
  374. #define INT_EXT1_H2L              0x6001F008
  375. #define INT_EXT1                  0x00F008
  376. #define INT_EXT2_L2H              0x5002F010
  377. #define INT_EXT2_H2L              0x6002F010
  378. #define INT_EXT2                  0x00F010
  379. #define INT_RB                    0x00FFF208
  380. #define INT_AD                    0x009D40
  381. #define INT_RDA                   0x009D20
  382. #define INT_TBE                   0x009D10
  383. #define INT_SSP                   0x009D08
  384. #define INT_CCP1                  0x009D04
  385. #define INT_CCP2                  0x00A001
  386. #define INT_BUSCOL                0x00A008
  387. #define INT_LOWVOLT               0x00A004
  388. #define INT_COMP                  0x00A040
  389. #define INT_EEPROM                0x00A010
  390. #define INT_OSCF                  0x00A080
  391. #define INT_USB                   0x00A020
  392.  
  393. #list


Fechero de cabeceras
Código: CSS
  1. // main.h
  2. #include <18F2550.h>
  3. #device adc=8
  4.  
  5. #FUSES NOWDT                    //No Watch Dog Timer
  6. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  7. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  8. #FUSES NOPROTECT                //Code not protected from reading
  9. #FUSES NOBROWNOUT               //No brownout reset
  10. #FUSES BORV20                   //Brownout reset at 2.0V
  11. #FUSES NOPUT                    //No Power Up Timer
  12. #FUSES NOCPD                    //No EE protection
  13. #FUSES STVREN                   //Stack full/underflow will cause reset
  14. #FUSES NODEBUG                  //No Debug mode for ICD
  15. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  16. #FUSES NOWRT                    //Program memory not write protected
  17. #FUSES NOWRTD                   //Data EEPROM not write protected
  18. #FUSES IESO                     //Internal External Switch Over mode enabled
  19. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  20. #FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
  21. #FUSES NOWRTC                   //configuration not registers write protected
  22. #FUSES NOWRTB                   //Boot block not write protected
  23. #FUSES NOEBTR                   //Memory not protected from table reads
  24. #FUSES NOEBTRB                  //Boot block not protected from table reads
  25. #FUSES NOCPB                    //No Boot Block code protection
  26. #FUSES MCLR                     //Master Clear pin enabled
  27. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  28. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  29. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  30. #FUSES CPUDIV4                  //System Clock by 4
  31. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  32. #FUSES NOVREGEN                 //USB voltage regulator disabled
  33.  
  34. #use delay(clock=20000000)
  35. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  36. #use fast_io(B)
  37. #DEFINE INTCON 0x0FF2
  38. #bit RBIF=0x0FF2.0

Programa principal
Código: CSS
  1. //main.c
  2.  
  3.  
  4. #include "C:\spi_pic18F2550\master_02\main.h"
  5.  
  6. #INT_EXT
  7. void mi_spi(void){
  8. output_high(PIN_A0); //enciende led verifica que entro en int
  9. int cnt=0;
  10.     if(INPUT(PIN_B4)==1){         //si hay un 1 logico en B4
  11.       cnt=1;               //escribe cnt 1
  12.       output_high(PIN_A1); //enciende led
  13.       spi_write(cnt);     //escribe el valor de cuenta en el SPI
  14.       delay_ms(500);
  15.     }
  16.    if(INPUT(PIN_B4)==0){                      //si hay un 0 ligoc en B4
  17.       cnt=0;                //escribe cnt 0
  18.       output_low(PIN_A1);   //apaga led
  19.       spi_write(cnt);       //escribe el valor de cuenta en el SPI
  20.       delay_ms(500);
  21.     }
  22. }
  23.  
  24. void main()
  25. {
  26. //int cnt=0;
  27.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  28.    setup_adc(ADC_CLOCK_DIV_2);
  29.    setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_16);
  30.    setup_wdt(WDT_OFF);
  31.    setup_timer_0(RTCC_INTERNAL);
  32.    setup_timer_1(T1_DISABLED);
  33.    setup_timer_2(T2_DISABLED,0,1);
  34.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  35.    setup_comparator(NC_NC_NC_NC);
  36.    setup_vref(FALSE);
  37. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  38.  
  39. set_tris_c(0x0F);
  40.    // TODO: USER CODE!!
  41.  
  42. //enable_interrupts(INT_EXT2_H2L);
  43. //ext_int_edge(H_TO_L);
  44. //enable_interrupts(INT_EXT);//habilita interrupción particular
  45. enable_interrupts(GLOBAL);//habilita interrupción global
  46. enable_interrupts(INT_RB);
  47. enable_interrupts(INT_EXT);
  48. //enable_interrupts(INT_EXT);
  49. //enable_interrupts(INT_EXT1);
  50. //enable_interrupts(INT_EXT2);
  51.  
  52.  while(true){                     //se ejecuta constantemente
  53.  
  54.  }//fin while
  55.  
  56.  
  57. }

añado el codigo del Esclavo:


Código: CSS
  1. #include <18F2550.h>
  2. #device adc=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  6. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES BORV20                   //Brownout reset at 2.0V
  10. #FUSES NOPUT                    //No Power Up Timer
  11. #FUSES NOCPD                    //No EE protection
  12. #FUSES STVREN                   //Stack full/underflow will cause reset
  13. #FUSES NODEBUG                  //No Debug mode for ICD
  14. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  15. #FUSES NOWRT                    //Program memory not write protected
  16. #FUSES NOWRTD                   //Data EEPROM not write protected
  17. #FUSES IESO                     //Internal External Switch Over mode enabled
  18. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  19. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  20. #FUSES NOWRTC                   //configuration not registers write protected
  21. #FUSES NOWRTB                   //Boot block not write protected
  22. #FUSES NOEBTR                   //Memory not protected from table reads
  23. #FUSES NOEBTRB                  //Boot block not protected from table reads
  24. #FUSES NOCPB                    //No Boot Block code protection
  25. #FUSES MCLR                     //Master Clear pin enabled
  26. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  27. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  28. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  29. #FUSES CPUDIV4                  //System Clock by 4
  30. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  31. #FUSES VREGEN                   //USB voltage regulator enabled
  32.  
  33. #use delay(clock=20000000)
  34. #define SPI_SS   PIN_A5
  35. #define SPI_DI   PIN_C4
  36. #define SPI_DO   PIN_C5
  37. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  38. //#use fast_io(A)



Código: CSS
  1. #include "C:\spi_pic18F2550\esclavo_02\main.h"
  2. #int_SSP
  3. void  SSP_isr(void)
  4. {
  5.  
  6. }
  7.  
  8. void main()
  9. {
  10. int valor=0;
  11.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  12.    setup_adc(ADC_CLOCK_DIV_2);
  13.    setup_spi(SPI_SLAVE);
  14.    setup_wdt(WDT_OFF);
  15.    setup_timer_0(RTCC_INTERNAL);
  16.    setup_timer_1(T1_DISABLED);
  17.    setup_timer_2(T2_DISABLED,0,1);
  18.    setup_comparator(NC_NC_NC_NC);
  19.    setup_vref(FALSE);
  20.    enable_interrupts(INT_SSP);
  21.    enable_interrupts(GLOBAL);
  22. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  23.  
  24.    // TODO: USER CODE!!
  25.    
  26.      while(true) {
  27.        if(spi_data_is_in())      //si hay un dato en el spi
  28.          {  
  29.           valor=spi_read();
  30.  
  31.           if(valor==1){
  32.           output_high(PIN_A0);
  33.           delay_ms(500);
  34.           }
  35.           else{
  36.           output_low(PIN_A0);
  37.           delay_ms(500);
  38.           }
  39.          
  40.        }//fin if
  41.      }//fin while
  42. }



En el data del pic busque el registro de cambio de B4-B7
 pone que es el INTCON el bit de cambio de estado de pines es el RBIF
corespondiente al bit 0. pone que se debe de setear por soft para limpiar
asi lo hice pero no entra en la interupcion cuando cambia de estado el B4

alguna idea de que esta ocurriendo y donde puedo haber cometido el error.


Un Saludo.



« Última modificación: 05 de Enero de 2013, 20:33:21 por pajaro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: SPI - PIC18F2550 - INT ::
« Respuesta #1 en: 05 de Enero de 2013, 13:27:34 »
Hola
Me respondo en parte, el fast_io tenia la culpa junto con otras modificaciones
que le he realizado coloco el main.h y el main.c.

del main.h le comento la linea:

//#use fast_io(B) // spi no va con esto/#DEFINE INTCON 0x0FF2

del main.c
modifique:
#INT_RB

y comente :
//set_tris_c(0x0F);
//enable_interrupts(INT_EXT);


solo modifique el maestro el esclavo quedo intacto.

main.h
Código: CSS
  1. #include <18F2550.h>
  2. #device adc=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  6. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES BORV20                   //Brownout reset at 2.0V
  10. #FUSES NOPUT                    //No Power Up Timer
  11. #FUSES NOCPD                    //No EE protection
  12. #FUSES STVREN                   //Stack full/underflow will cause reset
  13. #FUSES NODEBUG                  //No Debug mode for ICD
  14. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  15. #FUSES NOWRT                    //Program memory not write protected
  16. #FUSES NOWRTD                   //Data EEPROM not write protected
  17. #FUSES IESO                     //Internal External Switch Over mode enabled
  18. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  19. #FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
  20. #FUSES NOWRTC                   //configuration not registers write protected
  21. #FUSES NOWRTB                   //Boot block not write protected
  22. #FUSES NOEBTR                   //Memory not protected from table reads
  23. #FUSES NOEBTRB                  //Boot block not protected from table reads
  24. #FUSES NOCPB                    //No Boot Block code protection
  25. #FUSES MCLR                     //Master Clear pin enabled
  26. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  27. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  28. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  29. #FUSES CPUDIV4                  //System Clock by 4
  30. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  31. #FUSES NOVREGEN                 //USB voltage regulator disabled
  32.  
  33. #use delay(clock=20000000)
  34. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  35. //#use fast_io(B) // spi no va con esto/#DEFINE INTCON 0x0FF2
  36. #bit RBIF=0x0FF2.0
  37. #bit RBIE=0x0FF2.3


main.c
Código: CSS
  1. #include "C:\spi_pic18F2550\master_02\main.h"
  2.  
  3.  
  4. #INT_RB
  5. void mi_spi(void){
  6. int cnt=0;
  7. output_high(PIN_A0); //enciende led
  8.  
  9.     if(INPUT(PIN_B4)==1){         //si hay un 1 logico en RA0
  10.       cnt=1;               //escribe cnt 1
  11.       output_high(PIN_A1); //enciende led
  12.       spi_write(cnt);     //escribe el valor de cuenta en el SPI
  13.       delay_ms(500);
  14.       }
  15.    if(INPUT(PIN_B4)==0){                      //si hay un 0 ligoc en RA0
  16.       cnt=0;                //escribe cnt 0
  17.       output_low(PIN_A1);   //apaga led
  18.       spi_write(cnt);       //escribe el valor de cuenta en el SPI
  19.       delay_ms(500);
  20.     }
  21.  
  22. }
  23.  
  24. void main()
  25. {
  26. //int cnt=0;
  27.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  28.    setup_adc(ADC_CLOCK_DIV_2);
  29.    setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_16);
  30.    setup_wdt(WDT_OFF);
  31.    setup_timer_0(RTCC_INTERNAL);
  32.    setup_timer_1(T1_DISABLED);
  33.    setup_timer_2(T2_DISABLED,0,1);
  34.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  35.    setup_comparator(NC_NC_NC_NC);
  36.    setup_vref(FALSE);
  37. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  38.  
  39. //set_tris_c(0x0F); //el spi no va con esto
  40.    // TODO: USER CODE!!
  41.  
  42.  
  43. enable_interrupts(GLOBAL);//habilita interrupción global
  44. enable_interrupts(INT_RB);//habilita tipo de interrupcion
  45.  
  46. output_high(PIN_A1); //enciende led
  47.  
  48.  while(true){                     //se ejecuta constantemente
  49. /* if(INPUT(PIN_A2)==1){         //si hay un 1 logico en RA0
  50.       cnt=1;               //escribe cnt 1
  51.       output_high(PIN_A1); //enciende led
  52.       spi_write(cnt);     //escribe el valor de cuenta en el SPI
  53.       delay_ms(500);
  54.    }
  55.    
  56.    if(INPUT(PIN_A2)==0){                      //si hay un 0 ligoc en RA0
  57.       cnt=0;                //escribe cnt 0
  58.       output_low(PIN_A1);   //apaga led
  59.       spi_write(cnt);       //escribe el valor de cuenta en el SPI
  60.       delay_ms(500);
  61.    }    
  62. */  
  63.  
  64.  
  65.  }//fin while
  66.  
  67.  
  68. }//fin main



Tal como estan estos codigos funcionan, o eso creo yo.
arranco la simulacion del pic maestro se encinde el red rojo del pin A1
y del esclavo nada,  correcto.
si pulso el bt del pin B4 cambio de estado el pin y se produce la interrupcion de cambio de estado,
al entrar en la interupcion se enciende el led verde del pin A0 y el led rojo A1 del maestro indicado
que se pulso el buton (esto del led rojo  no se aprecia por estar ya encendido) al soltar el boton
se apaga el led rojo quedando encendido el led verde. todo esto en le pic maestro.

En el pic esclavo cuando pulsamos el boton del maestro se encide el led verde del esclavo en A0 y
al soltar el boton del maestro se paga el el led verde del esclavo. correcto todo.



Analizando el debug del spi.

He notado dos cosas:
- se envia en bloques de ocho y se reciben en bloques de 8
- no se salta de linea hasta no completar el lote de 8
- el maestro envia la primera vez un 7F (entiendo qu es el azulito)
- el esclavo recibe el dato enviado por el maestro en mi caso (cnt=1)
  entiendo que el azul es el esclavo
- las veces siguientes envia un 80 el maestro y recibe el esclavo un 01.

-----

PREGUNTAS:
no entiendo lo del 7F y lo del 80
deberia de mostrar el 01 y el 01 en ambos verdad...?

es normal esto ?

--
tampoco entiendo lo de debug del spi del proteus
lo del paquete de 8 no se si es el depurador.

Alguien me sabria decir?

he comprobado tambien que si es menos de 8 bit y vuelves a enviar lo pone en la misma linea
hasta completar el paquete de 8 pero si es mayor de 8 lo pone en varias lineas
hasta completar los datos necesarios en paquete de 8 y el resto en otra linea.


no se,... sigo investigado.

si alguien puede aportar algo en la resolucion de estas cuestiones
le rogaria que no lo deje para mañana..



 
« Última modificación: 06 de Enero de 2013, 10:24:39 por pajaro »