通过I2C从PIC到PIC的数据。它在proteus中起作用,但在现实生活中起作用。为什么呢?

时间:2016-08-20 20:46:37

标签: pic i2c

你好我在尝试通过I2C将数据从pic18f4550发送到pic16f818时遇到了一些问题......

这个项目使用4x4kbd和lcd库,但这部分在现实生活中也很好用。

按“1”时,主芯片将向从机IC发送一个字节,地址为0xA0,

从属设备将接收该字节,将其存储在ram或rom中(包括所有程序),并由主设备处理。

这在Proteus 8中运行良好,但在现实生活中却没有。

我在三次尝试中获得了三个不同的结果,使用了相同的HEX文件。

1.PROTEUS 8:它工作正常,完美。

2.PROTEUS 7:它不起作用但它没有挂起

3.REAL LIFE:芯片挂起,不会运行任何其他指令,直到我重置它。

我的编译器是PCW 4.106。

You can download all the project files from here. [proteus simulation + ccs source code]

有人可以帮我这个吗?自从我试图让这个项目成为一场噩梦以来,已经有很长一段时间了。

两个微控制器之间的通信是什么变得不可能?

为什么芯片会被绞死?

感谢您的关注。

这是我的主代码:

#include <18f4550.h>
#fuses INTRC_IO,NOPROTECT,NOMCLR,NOWDT
#use delay(clock= 4000000)         
#use i2c(Master,fast,sda=PIN_E0,scl=PIN_E1) 
#define LCD_DATA_PORT getenv("SFR:PORTB")
#byte portd=0xf83
#include <lcd18.c>
#include <jkbd4x4d.c>
#include <i2c.c>         
void SEND_I2C(direccion, posicion, dato){

   i2c_start();            // Comienzo comunicación
   i2c_write(direccion);   // Dirección del esclavo en el bus I2C
   i2c_write(posicion);    // Posición donde se guardara el dato transmitido
   i2c_write(dato);        // Dato a transmitir
   i2c_stop();             // Fin comunicación
   delay_ms(50);
 }
 byte READ_I2C (byte direccion, byte posicion) {
byte dato;
   i2c_start();            // Comienzo de la comunicación
   i2c_write(direccion);   // Dirección del esclavo en el bus I2C
   i2c_write(posicion);    // Posición de donde se leerá el dato en el esclavo
   i2c_start();            // Reinicio
   i2c_write(direccion+1); // Dirección del esclavo en modo lectura
   dato=i2c_read(0);       // Lectura del dato
   i2c_stop();             // Fin comunicación
   delay_ms(50);           // Espera finalización del envio
   return dato;
}

void main() {
 char k;  
  lcd_init(); 
  kbd_init(); 
  port_b_pullups(TRUE);  
 lcd_putc("\fPress '1' for \r\nI2C test"); 
 while (TRUE) {
k=  getkey();
if(k=='x'){}else{                                      // Detecting the  key
printf(lcd_putc,"\f%c",k);                             // Print the  key
delay_ms(200);                                         // An anti-re-pressing delay
if(k=='1'){                                            // key 1 detected     
printf(lcd_putc,"\fSent AA to 00");                    // some info
SEND_I2C(0xA0, 0x00, 0xAA);                           // send i2c(chip Address, eeprom address, data)
delay_ms(100);                                         // Giving ages to slave to work
printf(lcd_putc,"\nRead %x",READ_I2C(0xA0, 0x00));  // read i2c (chip Address, eeprom address)

}  }  }} 

这是我的奴隶代码

#include <16F818.h>
#device adc=10
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOMCLR

#use delay(clock=4000000) 

#use i2c(slave, fast, sda=PIN_B1, scl=PIN_B4, address=0xA0,FORCE_HW)


byte fstate;       //I2C bus state
byte posicion;     //Memory buffer index
byte buffer[0x10]; //Ram address   
#INT_SSP
void ssp_interupt (){

   int incoming;                     //Everithing the master sends is gonna be placed here 
   fstate = i2c_isr_state();         //get I2C bus state 
   if(fstate == 0x80) {              // If master asks for data      
   i2c_write(buffer[posicion]);      // the slave will write the asked data to the I2C bus 
   } 
   else {                            //If the master sends data 
      incoming = i2c_read();         //we read it
  if (fState == 1) {                 //if the information is about the position
         posicion = incoming;        //We save it as a position
      }
      else if (fState == 2) {        //The info is a data
      buffer[posicion]=incoming;     // We save the data in the right position
    }  }  }

void main (){ 
   fState = 0; 
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
  while(true){     }}

1 个答案:

答案 0 :(得分:0)

#include <18f4550.h>
#fuses INTRC_IO,NOPROTECT,NOMCLR,NOWDT

#use delay(clock=4000000) 

似乎我的18f4550坏了或者18f4550的保险丝配置不合适,因为它没有按照稳定的时钟速度工作。

不知何故,micro正在工作到#use delay clock的1/4。

我使用max 232和pc制作了一个测试程序。 我在vb.net中构建了一个软件,通过向一个只接收所接收字节的图像发送数据来扫描所有波特率。

因此,vb.net扫描程序可以检测何时发回正确的数据。

通过这种方式,我发现芯片(或波特率发生器)正在工作到该行中建立的波特率的四分之一:

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

我尝试过多种振荡器配置,但从未正常工作。

然后我只是将代码改编为18f448并且它工作正常。

如果有人要求,我会上传所有提到的软件。

感谢所有人。