1: #include 2: #include "biosdem2.h" 3: 4: #define __DEBUG 5: void init_i2c(void) { 6: char x ; 7: #ifdef __DEBUG 8: TRISB3=0; // RA4 reflete l'état du dernier ACK du SONAR 9: RB3 = 0 ; 10: #define ACKLED RB3 11: #endif 12: TRISC3 = 1 ; //SDA et SCL en entrée 13: TRISC4 = 1 ; 14: SSPSTAT = 0x80 ; // Pas de controle de slew rate, niveaux i2c 15: SSPCON = 0x28 ; // enable i2c 7bits master mode 16: SSPADD = 9 ; // fclock = 100khz = Fosc/(4(SSPADD+1) 17: x = SSPBUF ; // vide le buffer et raz flags 18: } 19: 20: char read_software_rev(void) 21: { 22: unsigned char srev ; 23: SEN = 1; // send start bit 24: while(SEN); // and wait for it to clear 25: ACKDT = 0; // acknowledge bit 26: 27: ACKSTAT=1; 28: SSPIF = 0; 29: SSPBUF = 0xC4; // C4 - write command 30: while(!SSPIF); // wait for interrupt 31: SSPIF = 0; 32: #ifdef __DEBUG 33: ACKLED=ACKSTAT; 34: ACKSTAT=1; 35: #endif 36: SSPIF = 0; 37: SSPBUF = 0x01; // adress of cmd register 38: while(!SSPIF); // wait for interrupt 39: SSPIF = 0; 40: #ifdef __DEBUG 41: ACKLED=ACKSTAT; 42: ACKSTAT=1; 43: #endif 44: PEN = 1; // send stop bit 45: while(PEN); // 46: 47: 48: SEN = 1; // send start bit 49: while(SEN); // and wait for it to clear 50: ACKDT = 0; // acknowledge bit 51: 52: SSPIF = 0; 53: SSPBUF = 0xC5; // 11000001 - read command 54: while(!SSPIF); // wait for interrupt 55: SSPIF = 0; // then clear it. 56: 57: RCEN = 1; // start receiving 58: while(!STAT_BF); // wait for data 59: srev = SSPBUF; // and get it 60: ACKEN = 1; // start acknowledge sequence 61: while(ACKEN); // wait for ack. sequence to end 62: 63: 64: PEN = 1; // send stop bit 65: while(PEN); // 66: #ifdef __DEBUG 67: ACKLED=1; 68: #endif 69: 70: 71: return srev ; 72: 73: 74: } 75: 76: void say_ok ( void ) 77: { 78: 79: SEN = 1; // send start bit 80: while(SEN); // and wait for it to clear 81: ACKDT = 0; // acknowledge bit 82: 83: ACKSTAT=1; 84: 85: SSPIF = 0; 86: SSPBUF = 0xC4; // C4 - write command 87: while(!SSPIF); // wait for interrupt 88: SSPIF = 0; 89: #ifdef __DEBUG 90: ACKLED=ACKSTAT; 91: ACKSTAT=1; 92: #endif 93: 94: SSPIF = 0; 95: SSPBUF = 0x00; // adress of cmd register 96: while(!SSPIF); // wait for interrupt 97: SSPIF = 0; 98: #ifdef __DEBUG 99: ACKLED=ACKSTAT; 100: ACKSTAT=1; 101: #endif 102: 103: SSPIF = 0; 104: SSPBUF = 0x00; // nop 105: while(!SSPIF); // 106: SSPIF = 0; 107: #ifdef __DEBUG 108: ACKLED=ACKSTAT; 109: ACKSTAT=1; 110: #endif 111: 112: SSPIF = 0; 113: SSPBUF = 0x00; // vol max 114: while(!SSPIF); // wait for interrupt 115: SSPIF = 0; 116: #ifdef __DEBUG 117: ACKLED=ACKSTAT; 118: ACKSTAT=1; 119: #endif 120: 121: SSPIF = 0; 122: SSPBUF = 0x05; // speed 123: while(!SSPIF); // 124: SSPIF = 0; 125: #ifdef __DEBUG 126: ACKLED=ACKSTAT; 127: ACKSTAT=1; 128: #endif 129: 130: SSPIF = 0; 131: SSPBUF = 0x03; // pitch 132: while(!SSPIF); // 133: SSPIF = 0; 134: #ifdef __DEBUG 135: ACKLED=ACKSTAT; 136: ACKSTAT=1; 137: #endif 138: 139: SSPIF = 0; 140: SSPBUF = 'O'; // 'o' 141: while(!SSPIF); // 142: SSPIF = 0; 143: #ifdef __DEBUG 144: ACKLED=ACKSTAT; 145: ACKSTAT=1; 146: #endif 147: 148: SSPIF = 0; 149: SSPBUF = 'K'; // 'k' 150: while(!SSPIF); // 151: SSPIF = 0; 152: #ifdef __DEBUG 153: ACKLED=ACKSTAT; 154: ACKSTAT=1; 155: #endif 156: 157: SSPIF = 0; 158: SSPBUF = 0x00; // null 159: while(!SSPIF); // 160: SSPIF = 0; 161: #ifdef __DEBUG 162: ACKLED=ACKSTAT; 163: ACKSTAT=1; 164: #endif 165: 166: PEN = 1; // send stop bit 167: while(PEN); // 168: 169: SEN = 1; // send start bit 170: while(SEN); // and wait for it to clear 171: ACKDT = 0; // acknowledge bit 172: 173: ACKSTAT=1; 174: SSPIF = 0; 175: SSPBUF = 0xC4; // C4 - write command 176: while(!SSPIF); // wait for interrupt 177: SSPIF = 0; 178: #ifdef __DEBUG 179: ACKLED=ACKSTAT; 180: ACKSTAT=1; 181: #endif 182: SSPIF = 0; 183: SSPBUF = 0x00; // adress of cmd register 184: while(!SSPIF); // wait for interrupt 185: SSPIF = 0; 186: #ifdef __DEBUG 187: ACKLED=ACKSTAT; 188: ACKSTAT=1; 189: #endif 190: SSPIF = 0; 191: SSPBUF = 0x40; // speak buffer ! 192: while(!SSPIF); // 193: SSPIF = 0; 194: #ifdef __DEBUG 195: ACKLED=ACKSTAT; 196: ACKSTAT=1; 197: #endif 198: 199: 200: PEN = 1; // send stop bit 201: while(PEN); // 202: 203: } 204: void say( unsigned char vol, unsigned char speed, unsigned char pitch, const char text[] ) 205: { 206: unsigned char i=0; 207: #ifdef __DEBUG 208: ACKLED=0; 209: 210: #endif 211: SEN = 1; // send start bit 212: while(SEN); // and wait for it to clear 213: ACKDT = 0; // acknowledge bit 214: 215: ACKSTAT=1; 216: 217: SSPIF = 0; 218: SSPBUF = 0xC4; // C4 - write command 219: while(!SSPIF); // wait for interrupt 220: SSPIF = 0; 221: #ifdef __DEBUG 222: ACKLED=ACKSTAT; 223: ACKSTAT=1; 224: #endif 225: 226: SSPIF = 0; 227: SSPBUF = 0x00; // adress of cmd register 228: while(!SSPIF); // wait for interrupt 229: SSPIF = 0; 230: #ifdef __DEBUG 231: ACKLED=ACKSTAT; 232: ACKSTAT=1; 233: #endif 234: 235: SSPIF = 0; 236: SSPBUF = 0x00; // nop 237: while(!SSPIF); // 238: SSPIF = 0; 239: #ifdef __DEBUG 240: ACKLED=ACKSTAT; 241: ACKSTAT=1; 242: #endif 243: 244: SSPIF = 0; 245: SSPBUF = vol; // vol 246: while(!SSPIF); // wait for interrupt 247: SSPIF = 0; 248: #ifdef __DEBUG 249: ACKLED=ACKSTAT; 250: ACKSTAT=1; 251: #endif 252: 253: SSPIF = 0; 254: SSPBUF = speed; // speed 255: while(!SSPIF); // 256: SSPIF = 0; 257: #ifdef __DEBUG 258: ACKLED=ACKSTAT; 259: ACKSTAT=1; 260: #endif 261: 262: SSPIF = 0; 263: SSPBUF = pitch; // pitch 264: while(!SSPIF); // 265: SSPIF = 0; 266: #ifdef __DEBUG 267: ACKLED=ACKSTAT; 268: ACKSTAT=1; 269: #endif 270: 271: while(text[i]!='\0') 272: { 273: SSPIF = 0; 274: SSPBUF = text[i++]; 275: while(!SSPIF); // 276: SSPIF = 0; 277: #ifdef __DEBUG 278: ACKLED=ACKSTAT; 279: ACKSTAT=1; 280: #endif 281: } 282: 283: 284: SSPIF = 0; 285: SSPBUF = 0x00; // null 286: while(!SSPIF); // 287: SSPIF = 0; 288: #ifdef __DEBUG 289: ACKLED=ACKSTAT; 290: ACKSTAT=1; 291: #endif 292: 293: PEN = 1; // send stop bit 294: while(PEN); // 295: 296: SEN = 1; // send start bit 297: while(SEN); // and wait for it to clear 298: ACKDT = 0; // acknowledge bit 299: 300: ACKSTAT=1; 301: SSPIF = 0; 302: SSPBUF = 0xC4; // C4 - write command 303: while(!SSPIF); // wait for interrupt 304: SSPIF = 0; 305: #ifdef __DEBUG 306: ACKLED=ACKSTAT; 307: ACKSTAT=1; 308: #endif 309: SSPIF = 0; 310: SSPBUF = 0x00; // adress of cmd register 311: while(!SSPIF); // wait for interrupt 312: SSPIF = 0; 313: #ifdef __DEBUG 314: ACKLED=ACKSTAT; 315: ACKSTAT=1; 316: #endif 317: SSPIF = 0; 318: SSPBUF = 64; // speak buffer ! 319: while(!SSPIF); // 320: SSPIF = 0; 321: #ifdef __DEBUG 322: ACKLED=ACKSTAT; 323: ACKSTAT=1; 324: #endif 325: 326: 327: PEN = 1; // send stop bit 328: while(PEN); // 329: 330: } 331: void stupid( void ) 332: { 333: 334: SEN = 1; // send start bit 335: while(SEN); // and wait for it to clear 336: ACKDT = 0; // acknowledge bit 337: 338: ACKSTAT=1; 339: 340: SSPIF = 0; 341: SSPBUF = 0xC4; // C4 - write command 342: while(!SSPIF); // wait for interrupt 343: SSPIF = 0; 344: #ifdef __DEBUG 345: ACKLED=ACKSTAT; 346: ACKSTAT=1; 347: #endif 348: 349: SSPIF = 0; 350: SSPBUF = 0x00; // adress of cmd register 351: while(!SSPIF); // wait for interrupt 352: SSPIF = 0; 353: #ifdef __DEBUG 354: ACKLED=ACKSTAT; 355: ACKSTAT=1; 356: #endif 357: 358: SSPIF = 0; 359: SSPBUF = 0x01; // 360: while(!SSPIF); // 361: SSPIF = 0; 362: #ifdef __DEBUG 363: ACKLED=ACKSTAT; 364: ACKSTAT=1; 365: #endif 366: 367: PEN = 1; // send stop bit 368: while(PEN); // 369: 370: } 371: 372: char read_cmd_reg(void) 373: { 374: unsigned char cmd_reg ; 375: SEN = 1; // send start bit 376: while(SEN); // and wait for it to clear 377: ACKDT = 0; // acknowledge bit 378: 379: ACKSTAT=1; 380: SSPIF = 0; 381: SSPBUF = 0xC4; // C4 - write command 382: while(!SSPIF); // wait for interrupt 383: SSPIF = 0; 384: #ifdef __DEBUG 385: ACKLED=ACKSTAT; 386: ACKSTAT=1; 387: #endif 388: SSPIF = 0; 389: SSPBUF = 0x00; // adress of cmd register 390: while(!SSPIF); // wait for interrupt 391: SSPIF = 0; 392: #ifdef __DEBUG 393: ACKLED=ACKSTAT; 394: ACKSTAT=1; 395: #endif 396: 397: RSEN = 1; // send start bit 398: while(RSEN); // and wait for it to clear 399: ACKDT = 0; // acknowledge bit 400: 401: SSPIF = 0; 402: SSPBUF = 0xC5; // 11000001 - read command 403: while(!SSPIF); // wait for interrupt 404: SSPIF = 0; // then clear it. 405: 406: RCEN = 1; // start receiving 407: while(!STAT_BF); // wait for data 408: cmd_reg = SSPBUF; // and get it 409: 410: DelayUs(100); 411: 412: ACKEN = 1; // start acknowledge sequence 413: while(ACKEN); // wait for ack. sequence to end 414: 415: 416: PEN = 1; // send stop bit 417: while(PEN); // 418: #ifdef __DEBUG 419: ACKLED=1; 420: #endif 421: 422: 423: return cmd_reg ; 424: 425: 426: }