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;
}