Linuxbuilders
Joined: 20 Mar 2010 Posts: 193 Location: Auckland NZ
|
i2c slave dies with globals |
Posted: Thu Feb 23, 2012 3:14 am |
|
|
Hi, I have a problem. In the past I used to use this code on 18F4520 and it was working, now I try to run it on 18F4620 and it is crashing upfront when enable_int(global) is on. This is simple testing program which is meant to get data from another chip (18F4620 too) and turn leds on. I have there DS1307 in circuit so I know that i2c works because the other chip can get time and program time into it. Any suggestions why program is crashing after I enable enable_interrupts(GLOBAL); ? If I turn it off then all works but my IRQ is not working :( Thnx for help
Code: |
#include <18F4620.h> //libs from compiler
#device ADC=10 //analogue to digital converter init specs
#include <ctype.h> //libs from compiler
#include <stddef.h> //libs from compiler
#include <string.h> //libs from compiler
//=========DEFINE====================
#define RX PIN_C7 // serial data receive pin
#define TX PIN_C6 // serial data transmit pin
#define TX_ON PIN_C5 // serial TX on
#define STATUS PIN_B2 // status led
#define GOUT1 PIN_D7
#define GOUT2 PIN_D6
#define GOUT3 PIN_D5
#define GOUT4 PIN_D4
#define GOUT5 PIN_D3
#define GOUT6 PIN_D2
#define GOUT7 PIN_D1
#define GOUT8 PIN_D0
#define BUZZ PIN_A4
#define POWER PIN_E1
#define BATTERY PIN_E2
#define MAINS_TEST PIN_AN3
#define POWER_TEST PIN_AN4
#define BATTERY_TEST PIN_AN5
#define INTMP PIN_AN0
#define TMP1 PIN_AN1
#define TMP2 PIN_AN2
#define SLOT0 PIN_B1
#define SLOT1 PIN_B0
#define SLOT2 PIN_B3
#define SLOT3 PIN_B4
#define SLOT4 PIN_B5
#define SLOT5 PIN_B6
#define SLOT6 PIN_B7
#define SLOT7 PIN_C0
#define SLOT8 PIN_C1
#define SLOT9 PIN_C2
#define I2CSCL PIN_C3
#define I2CSDA PIN_C4
//===================================
#FUSES H4
#FUSES MCLR
#FUSES BROWNOUT
#FUSES NODEBUG
#FUSES NOPROTECT
//#FUSES WDT1024
#FUSES NOWDT
#FUSES PUT
#FUSES NOCPD
#FUSES NOXINST // Config: ext reset, no code protect, no watchdog, high speed clock
#use delay (clock=40M, oscillator=10M)
#use rs232(baud=19200,xmit=TX,rcv=RX,parity=n,bits=8,stop=1,RESTART_WDT,ERRORS,TIMEOUT=15)
#use i2c(slave, sda=I2CSDA, scl=I2CSCL, address=0xA0)
#use fixed_io(D_outputs=GOUT1,GOUT2,GOUT3,GOUT4,GOUT5,GOUT6,GOUT7,GOUT8)
#use fixed_io(A_outputs=BUZZ)
#use fixed_io(B_outputs=STATUS)
#use fixed_io(C_outputs=TX_ON,TX)
#use fixed_io(E_outputs=POWER,BATTERY)
int state;
int c, buffer[5];
//===================================
#INT_SSP NOCLEAR
void ssp_interupt () {
clear_interrupt(int_SSP);
state = i2c_isr_state();
if(state < 0x80) { //master is sending data
if (state == 1) {
c = i2c_read();
buffer[0] = c;
}
if (state == 2) {
c = i2c_read();
buffer[1] = c;
}
if (state == 3) {
c = i2c_read();
buffer[2] = c;
}
if (state == 4) {
c = i2c_read();
buffer[3] = c;
}
if (state == 5) {
c = i2c_read();
buffer[4] = c;
}
}
if(state == 0x80) { //master is requesting data
// i2c_write (buffer[c]); //send requested data
}
}
//==========================
void comms_TX_high() {
output_high(TX_ON);
delay_ms(10);
} //void
void comms_TX_low() {
delay_ms(10);
output_low(TX_ON);
} //void
//=========MAIN PROGRAM==============
void main() { // main program
setup_wdt(WDT_ON); //set watch dog timer
set_timer0(0); //clear timers
set_rtcc(0); //clear timers
setup_timer_0(RTCC_INTERNAL | RTCC_8_BIT | T0_DIV_1); //set timer 0 parameters
setup_adc_ports(AN0_TO_AN5 | VSS_VDD); //set AD ports
setup_adc(ADC_CLOCK_INTERNAL | ADC_CLOCK_DIV_8);
setup_comparator(NC_NC_NC_NC); //turn off comparators
enable_interrupts(int_ssp); //enable serial i2c
enable_interrupts(INT_RTCC); //enable TIMERs
enable_interrupts(int_rda); //enable serial port
//enable_interrupts(GLOBAL);
//=========BOOT UP===================
buffer[0]=0xFF;
buffer[1]=0xFF;
buffer[2]=0xFF;
buffer[3]=0xFF;
buffer[4]=0xFF;
while(true) { //loop program
//restart_wdt();
output_low(STATUS);
delay_ms(500);
if ((buffer[0] == 0x00) && (buffer[1] == 0x01)) {
output_high(GOUT1);
}
if ((buffer[0] == 0x01) && (buffer[1] == 0x01)) {
output_low(GOUT1);
}
if ((buffer[0] == 0x00) && (buffer[1] == 0x02)) {
output_high(GOUT2);
}
if ((buffer[0] == 0x01) && (buffer[1] == 0x02)) {
output_low(GOUT2);
}
if ((buffer[0] == 0x00) && (buffer[1] == 0x03)) {
output_high(GOUT3);
}
if ((buffer[0] == 0x01) && (buffer[1] == 0x03)) {
output_low(GOUT3);
}
if ((buffer[0] == 0x00) && (buffer[1] == 0x04)) {
output_high(GOUT4);
}
if ((buffer[0] == 0x01) && (buffer[1] == 0x04)) {
output_low(GOUT4);
}
if ((buffer[0] == 0x00) && (buffer[1] == 0x05)) {
output_high(GOUT5);
}
if ((buffer[0] == 0x01) && (buffer[1] == 0x05)) {
output_low(GOUT5);
}
if ((buffer[0] == 0x00) && (buffer[1] == 0x06)) {
output_high(GOUT6);
}
if ((buffer[0] == 0x01) && (buffer[1] == 0x06)) {
output_low(GOUT6);
}
if ((buffer[0] == 0x00) && (buffer[1] == 0x07)) {
output_high(GOUT7);
}
if ((buffer[0] == 0x01) && (buffer[1] == 0x07)) {
output_low(GOUT7);
}
if ((buffer[0] == 0x00) && (buffer[1] == 0x08)) {
output_high(GOUT8);
}
if ((buffer[0] == 0x01) && (buffer[1] == 0x08)) {
output_low(GOUT8);
}
comms_TX_high();
printf("%u:%u:%u:%u:%u%c",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],0x0D);
comms_TX_low();
output_high(STATUS);
delay_ms(500);
} //while
} //void
|
_________________ Help "d" others and then you shell receive some help from "d" others. |
|