Effektivisera C kod
Postat: 18 april 2007, 10:42:58
Denna kod ska få en PIC att agera slav vilket gör den väldigt tidskritisk. Därför publicerar jag den här och hoppas att ni kan tycka till om hur jag skulle kunna effektivisera den så att den blir snabbare.
Kompilatorn är MikroC som tyvärr inte går att ställa in för att få en så snabb kod som möjligt. Jag skulle kunna lägga upp den C-kommenterade kompilerade ASM koden om ni vill.
Kompilatorn är MikroC som tyvärr inte går att ställa in för att få en så snabb kod som möjligt. Jag skulle kunna lägga upp den C-kommenterade kompilerade ASM koden om ni vill.
Kod: Markera allt
/*
Test konfiguration:
MCU: PIC16F88
Dev.Board: EasyPIC4
Kristall : 20.0000 MHz
Ext. Modules: -
SW: mikroC v6.2
*/
#include "USART.h"
#include "ERx00TRS.h"
#include "1Wire_Common.h"
#include "1Wire_Master.h"
#include "Common.h"
union
{
T_RF_Data_Struct Data;
byte Buffer[1];
} Rx_Data;
byte ROM_id[8];
byte SCRATCHPAD[8];
byte *ANSWARE_DATA;
byte ow_active = 0;
enum states { WAITING_FOR_RESET=0, GET_CMD, SEARCH_ROM_BIT, SEARCH_ROM_CMP_BIT, SEARCH_ROM_READ_BIT, MATCH_ROM_READ, ANSWARE_REQUEST } onewire_state;
void main() {
init();
ow_get_id(&ROM_id,OW_PORT,OW_PIN);
ow_get_ds18b20_data(&SCRATCHPAD,OW_PORT,OW_PIN);
onewire_state=WAITING_FOR_RESET;
while(1) {}
}
void interrupt() {
byte olow_cmd;
byte bit_index;
byte byte_index;
byte bit_temp;
if (INTCON.INTF) {
switch (onewire_state) {
case GET_CMD : TRISB.F0=1;
olow_cmd >>= 1;
delay_us(10);
if(PORTB.F0)
olow_cmd |= 0x80;
bit_index++;
if (bit_index > 7) {
byte_index=0;
bit_index=0;
if (ow_active) {
switch (olow_cmd) {
case READ_SCRATCHPAD :
onewire_state=ANSWARE_REQUEST;
ANSWARE_DATA=SCRATCHPAD;
bit_temp=(ANSWARE_DATA[byte_index] >> bit_index) & 0b00000001;
break;
default :
onewire_state=WAITING_FOR_RESET;
break;
}
}
else {
switch (olow_cmd) {
case SEARCH_ROM :
onewire_state=SEARCH_ROM_BIT;
bit_temp=(ROM_id[byte_index] >> bit_index) & 0b00000001;
break;
case SKIP_ROM :
ow_active=1;
break;
case MATCH_ROM :
onewire_state=MATCH_ROM_READ;
bit_temp=(ROM_id[byte_index] >> bit_index) & 0b00000001;
break;
case READ_ROM :
onewire_state=ANSWARE_REQUEST;
ANSWARE_DATA=ROM_id;
bit_temp=(ANSWARE_DATA[byte_index] >> bit_index) & 0b00000001;
break;
default :
onewire_state=WAITING_FOR_RESET;
break;
}
}
}
break;
case SEARCH_ROM_BIT :
if(bit_temp) {
MACRO_OLOW_HI
}
else {
MACRO_OLOW_LO
}
delay_us(20);
MACRO_OLOW_HI
onewire_state=SEARCH_ROM_CMP_BIT;
break;
case SEARCH_ROM_CMP_BIT :
if(!bit_temp) {
MACRO_OLOW_HI
}
else {
MACRO_OLOW_LO
}
delay_us(20);
MACRO_OLOW_HI
onewire_state=SEARCH_ROM_READ_BIT;
break;
case SEARCH_ROM_READ_BIT : delay_us(10);
onewire_state=SEARCH_ROM_BIT;
if (PORTB.F0!=bit_temp) {
onewire_state=WAITING_FOR_RESET;
}
bit_index++;
if (bit_index>7) {
bit_index=0;
byte_index++;
}
if (byte_index>7) {
bit_index=0;
ow_active=1;
onewire_state=GET_CMD;
}
else
bit_temp=(ROM_id[byte_index] >> bit_index) & 0b00000001;
break;
case MATCH_ROM_READ : delay_us(10);
if (PORTB.F0!=bit_temp) {
onewire_state=WAITING_FOR_RESET;
}
bit_index++;
if (bit_index>7) {
bit_index=0;
byte_index++;
}
if (byte_index>7) {
bit_index=0;
ow_active=1;
onewire_state=GET_CMD;
}
else
bit_temp=(ROM_id[byte_index] >> bit_index) & 0b00000001;
break;
case ANSWARE_REQUEST :
if(bit_temp) {
MACRO_OLOW_HI
}
else {
MACRO_OLOW_LO
}
delay_us(20);
MACRO_OLOW_HI
bit_index++;
if (bit_index>7) {
bit_index=0;
byte_index++;
}
if (byte_index>7) {
bit_index=0;
ow_active=1;
onewire_state=GET_CMD;
}
else
bit_temp=(ANSWARE_DATA[byte_index] >> bit_index) & 0b00000001;
break;
case WAITING_FOR_RESET :
break;
default : break;
}
TMR0=0;
INTCON.INTF=0;
INTCON.INTE=1;
}
if (INTCON.T0IF) {
if (!PORTB.F0) {
while(!PORTB.F0){}
delay_us(14);
MACRO_OLOW_LO
delay_us(103);
MACRO_OLOW_HI
bit_index=0;
TRISB.F0=1; // Ska vara OLOW_DIR=1;
TRISA.F0=0; //För debugging
INTCON.INTF=0;
ow_active=0;
onewire_state=GET_CMD;
}
INTCON.T0IF=0;
}
}
void init() {
ANSEL = 0x00;
TRISA = 0b11111011;
TRISB = 0b11111111;
PORTB = 0b00000000;
PORTA = 0b00000000;
INTCON = 0b10010000; // Enable GIE, RBIE
OPTION_REG = 0x02;
INTCON.T0IE=1;
}