你好我在尝试通过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){ }}
答案 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并且它工作正常。
如果有人要求,我会上传所有提到的软件。
感谢所有人。