Hola
AngelGrisNo creas que no se me ha pasado de veces por la cabeza,
pero si me cambio sera a mejor, no a peor y tras una larga y precisa comparacion
de pros y contras.
Ademas hace un tiempo que voy buscando un ide que me permita programar mas de una familia de micros
pero aun no di con el, y no sera por falta de ganas..
SukyLo de las prioridades si las empece a usar, pero no hay diferencia
puedes combinarlas como quieras el resultado es el mismo...
Otra cosa,... esto es una... muy buena consigo enviar del master al esclavo y el debug de i2c me lo reconoce
respondiendo con ack, paquete ack ...paquete ack, pero si comento los /////printf/////
el debug i2c ya no me los reconoce y me tira no ack, mire el retardo de un printf y es casi 20ms.
Tambien descubri el reacticar una interrupcion y sin ponerla a disable
puede hacer que te imprima el mensa del main o no, logica.. ninguna que yo sepa..
Menuda tarde la que llevo..
pongo el codigo para que le sacaies pegas a ver si entre mis ojos y los vuestros
descubrimos.. cosas nuevas..
codigo main:
//variables i2c
int8 state, comando;
//int8 iic_dato, Direc_master;
int8 direc_Mas_esc, recivo=0;
int8 dato[4];
//int8 dato_1[4];
int8 cnt=0;
int8 angulo;
int8 inclina;
int8 motor_on;
//servos pwm soft
int8 servos[]={sv_0,sv_1,sv_2,sv_3,sv_4,0,0,0,0,0};
//variables timer
int8 cnt_t0=0;
int8 cnt_t1=0;
int1 t0=0;
int1 t1=0;
#priority timer0, timer1, ssp
/*
#int_RTCC
void RTCC_isr(void)
{
}
*/
#int_TIMER0
void TIMER0_isr(void)
{
output_high (servos[cnt_t0]); //activo servo
//ventana de 1 ms cambio de svmotor
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //activo timer1
set_timer1(g_90); //tiempo en alto
set_timer0(ventana); //desborda cada 1ms
if(cnt_t0==20){ //cambio de ventana
cnt_t0=0;
//printf("\n\r -->T0 1ms 20 ventanas 1 perido");
}
//printf("\n\r cnt_t0: %d "cnt_t0);
//cnt_t0=cnt_t0+1; //incremta ventana => motor
}
#int_TIMER1
void TIMER1_isr(void)
{
output_low (servos[cnt_t0]); //apago motor
//printf("\n\r OFF servo: %d "cnt_t0-1);
cnt_t0=cnt_t0+1; // incremta ventana => motor
setup_timer_1(0); // desactivo timer 1
}
#int_SSP
void SSP_isr(void){
//disable_interrupts(INT_SSP);
//disable_interrupts(INT_TIMER0);
//disable_interrupts(INT_TIMER1);
//int8 comando;
//master escribe de esclavo menor de <80
//master lee de esclavo mayor de >80
state = i2c_isr_state();
if(state==0)
{
direc_Mas_esc=i2c_read();
if(direc_Mas_esc==S1){
////////////////////////////////
printf("\n\r --> Direccion: %X "direc_Mas_esc); //--- debug mas rapido
////////////////////////////////
recivo=1;
output_high(PIN_B2); //---debug rapido
}
//printf("\n\r Direccion : %X "direc_Mas_esc); //para solo imprime s1
//if(SSPADD==S1){
//printf("\n\r state==0 soy S1: %X "SSPADD);
//}
}
if(state < 0x80)
{
//iic_dato=i2c_read();
//comando=iic_dato;
if(recivo==1){
dato[cnt]=i2c_read();
// coreccion para lo de error en dato=1
if(dato[cnt]==10){
dato[cnt]=1;
}
if(dato[0]==1){ // control de motor
output_high(PIN_B6);
motor_on=1;
}
if(dato[cnt]!=0){ //control de angulo
angulo=dato[1];
inclina=dato[2];
}
///////////////////////
/////////////////////////////
printf("\n\r dato[%u]:%u"cnt,dato[cnt]); //-- debug +rapido
/////////////////////////////
recivo=0;
output_low(PIN_B2); //--- debug rapido
// para resetear almacen dato
if(dato[cnt]==99){ //cnt resetea en 3 si es 99
cnt=0;
}
else{
cnt=cnt+1;
}
}
//Aqui colocas lo que necesites hacer con el dato enviado por el maestro
//printf("\n\r comando recibo <80: %u"comando);
}
if(state == 0x80)
{
/*
switch(comando)
{
Case Pide_Dato1:
i2c_write(Dato1);
output_high(PIN_B7);
delay_ms(300);
output_low(PIN_B7);
printf("\n\r Llego dato.");
break;
Case Pide_Dato2:
i2c_write(Dato2);
output_high(PIN_B2);
break;
}
*/
}
enable_interrupts(INT_SSP); //para imprimir completo priff del main
//enable_interrupts(INT_TIMER0);
//enable_interrupts(INT_TIMER1);
}
#int_BUSCOL
void BUSCOL_isr(void)
{
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
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_RTCC);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_SSP);
enable_interrupts(INT_BUSCOL);
enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
set_timer0(ventana);
setup_timer_1(T1_DISABLED); // timer 1 no activo
//set_timer1(0);
printf("\n\r Prueba de timer: ");
while(true){
if(t0==2){
printf("\n\r -->T0 20ms");
}
if(t1==4){
printf("\n\r -->T1 40ms");
}
enable_interrupts(INT_SSP);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
}
}
codigo cabecera:
#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 NOPBADEN //PORTB pins are configured as digital I/O 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 VREGEN //USB voltage regulator enabled
//timer 0
/*
#DEFINE T0CON 0xFD5 // timer0
#DEFINE T1CON 0xFCD // timert1
#BIT TMR0ON = T0CON.7 // valor enable del timer0 1=on, 0=Off
#BIT RD16 = T1CON.7 // valor enable del timer0 1=on, 0=Off
#define TIMER1_ON RD16
*/
//esclavos
#define S1 0xB0
#define S2 0xB2
#define S4 0xB4
#define S6 0xB6
#define S8 0xB8
// define los servos
#define sv_0 PIN_B7
#define sv_1 PIN_B6
#define sv_2 PIN_C1
#define sv_3 PIN_C2
#define sv_4 PIN_C0
/*
#define sv_5 PIN_B7
#define sv_6 PIN_B6
#define sv_7 PIN_B5
#define sv_8 PIN_B4
#define sv_9 PIN_B3
*/
// tick para grados 16 bit : 65536 tick 0.2us -->13107.2us
//tiempo entre servomotor
const int16 ventana = 60536; // 65536 - 5000 = n tick para INT 1000us :1ms
const int16 g_0 = 64936; //65536 - 600 120us
const int16 g_90 = 63661; //65536 - 1875 375us
//const int16 g_90 = 58036; //65536 - 7500 375us
const int16 g_180 = 62386; //65536 - 3150 630us
const int16 g_45 = 63661; //65536 - 1875 375us
const int16 g_60 = 63661; //65536 - 1875 375us
const int16 g_75 = 63661; //65536 - 1875 375us
const int16 g_105 = 63661; //65536 - 1875 375us
const int16 g_120 = 63661; //65536 - 1875 375us
const int16 g_135 = 63661; //65536 - 1875 375us
static int16 valor_PWM[]={g_90, g_0,g_180,0,0,0,0};
static int16 ini_PWM[]={g_90, g_90, g_90, g_90,0,0,0,0}; //8 servos
#define Pide_Dato1 2
#define Pide_Dato2 3
#define dato1 4
#define dato2 5
#use delay(clock=20000000)
//#define I2C_SCL PIN_B7
//#define I2C_SDA PIN_C4
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Slave,Slow,sda=PIN_B0,scl=PIN_B1,address=0xB0)
este codigo permite enviar del master al esclavo,
con la pega que no le puedo quitar los printf //// recuadrados ///
de ser asi ya no envia ack sino Nack
tambien al ser asi el timer es interumpido inevitablemente.
a y aun hay mas el cuadro de mensajes dice
Spurios SCL trasmision ....xxxxs curiosamnete coincide con el tiempo que al inicio se queda en el debug i2c al arrancar
dice
21.200us ?
+ 21.200us noise SCL=0 (SL0)
+ 10.918s noise SCL=1 (WHI)
+ 10.918s S
....
....
aca empieza la comunicación
a mi me da que quiere entra al esclavo pero este como esta el timer no le deja
y repite y repite ....hasta entra porque el mensaje ese despues no lo muestra
Hay alguna forma humana de sacar el log de emnsajes de alguna forma racional?