Hallo mensen,
Het viel mij op toen ik met grotere microcontrollers aan de slag ging, dat er zo weinig over te vinden was aan code om uit te proberen. Vandaar dat ik dacht dat het voor beginners misschien makkelijk is ze op weg te helpen, door voorbeeldcode te plaatsen van bepaalde functies van een PIC en uitbreidingen.
dan allereerst de software die nodig is om met name de 18F serie te "branden". bedenk dat je bij de wisp628 versie 1.11 op je "brand pic" moet hebben staan, anders herkent hij ze niet.
handleidingen en info:
structuur:
- plaats bovenaan in de reactie vetgedrukt wat de code doet.
- vermeld welke picburner je gebruikt.
- vermeld ook welke pic je hebt gebruikt en op welke frequentie
- vermeld de connectie, en eventueel zelfs met afbeelding
- Plaats vervolgens in een [ code ] de feitelijke code:
gelieve geen andere talen als C te behandelen svp, en maak er geen chatbox van!
een datasheet bekijken wil ook nogal handig zijn voor je iets vraagt 
Dan nog even standaard fuses voor 4 pic's, ik post er meer als ik er meer weet:
PIC18F2620:
#pragma config OSC = HS
#pragma config PWRT = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF
PIC28F4550:
#pragma config FOSC = HS
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config WDT = OFF
#pragma config CCP2MX = OFF
#pragma config LVP = OFF
PIC18F4620:
#pragma config OSC = HS
#pragma config PWRT = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF
PIC18F452:
#pragma config OSC = HS, OSCS = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config WDT = OFF
#pragma config CCP2MUX = OFF
#pragma config LVP = OFF
------------------------------------------------------
MPLAB PIC Voorbeeld
- bumblebee gebruikt met wisp628 v1.11
- PIC18Fxxxx met freq. X MHz
uitleg:
deze code is een voorbeeld
plaats hier je code
[/codeBlink LED op PIC microcontroller
- bumblebee gebruikt met wisp628 v1.11
- PIC 18F4620 met freq. 20 MHz
uitleg:
De eenvoudigste code die er bestaat, de blink led 
de led is verbonden van C1 via een 180 Ohm weerstand naar de ground.
//blinkled.c//
#include <p18f4620.h>
#include <delays.h>
///fuses instellen//
#pragma config OSC = HS
#pragma config PWRT = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF
void main(void) //Start programma
{
TRISC=0x00; //Maak alle pinnen van poort C output
ADCON1=0b00001111; //Zet AD-converters uit
while(1) //Draai continu continue het volgende stuk code
{
PORTCbits.RC1 = 1; //Maak pin C1 hoog
Delay10KTCYx(100);
PORTCbits.RC1 = 0; //Maak pin C1 laag
Delay10KTCYx(100);
}
}
EUSART op PIC microcontroller
- bumblebee gebruikt met wisp628 v1.11
- PIC 18F4620 met freq. 20 MHz
uitleg:
Deze code stuurt terug wat de pic ontvangt via de eusart (ENHANCED UNIVERSAL SYNCHRONOUS RECEIVER TRANSMITTER)
Denk eraan dat je een max232 of 233 gebruikt voor de levelconversie. RC7 is de Rx pin, RC6 is de Tx pin.
(receive gedeelte komt van Dark_Knight)
//usart.c//
#include <p18f4620.h>
#include <delays.h>
///fuses instellen//
#pragma config OSC = HS
#pragma config PWRT = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF
void init(void);
void send(char data);
char receive(void);
void main(void )
{
char data = 0x0;
init();
while(1)
{
send(receive());
}
}
void init(void)
{
TRISA = 0x0;
TRISB = 0x0;
TRISC = 0b10000000;
TRISD = 0x0;
TXSTA = 0b00100100;
RCSTA = 0b10010000;
BAUDCON = 0b01011010;
SPBRG = 129; //baud 9600 @ 20MHz
INTCONbits.PEIE = 0; // interrups OFF
INTCONbits.GIE = 0;
PIE1bits.RCIE = 0;
RCREG = 0;
TXREG = 0;
return;
}
void send(char data)
{
TXREG = data;
Delay10KTCYx(30);
return;
}
char receive(void)
{
char data;
while (!PIR1bits.RCIF);
PIR1bits.RCIF = 0;
data = RCREG;
return data;
}
character LCD op PIC microcontroller
- bumblebee gebruikt met wisp628 v1.11
- PIC 18F4620 met freq. 20 MHz
uitleg:
Deze code stuurt characters naar het LCD. de code bevat speciale functies zoals space, backspace, second_line, inttochar, cursor aan/uit (0 of 1 geven) en lookup tabel voor characters. De functie puttekst plaatst tekst op het LCD
//////////////Connections to PIC/////////
// RD0 = Enable
// RD1 = RS
// RD2 = R/W
// PORTB is connected to datalines LCD
//lcd.c//
#include <p18f4620.h>
#include <delays.h>
///fuses instellen//
#pragma config OSC = HS
#pragma config PWRT = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF
/////declare LCD functions////
void init (void);
void puttext(void);
void second_line(void);
char inttochar(int in);
void space(int u);
void backspace(int u);
void init_display(void);
void delay(void);
void clear_display(void);
void cursor(int u);
void searchchar (char input);
//////////////////////////////
void main(void) //Main program
{
init();
init_display();
clear_display();
puttext();
while(1)
{
Delay100TCYx(25); //lekker niks doen
}
}
////////////////////////////////LCD screen functions////////////////////////////////////////////
void init(void)
{
//PIC-things
TRISB = 0;
TRISC = 0b10010000; // make C0 & C6 inputs
TRISD = 0;
// make sure everything's OFF
PORTA = 0x0;
PORTB = 0x0;
PORTC = 0x0;
PORTD = 0x0;
}
////////////////////////////////////////////////////////////////////////////////////////////////
void puttext(void)
{
searchchar('H');
searchchar('e');
searchchar('l');
searchchar('l');
searchchar('o');
second_line();
searchchar('C');
searchchar('r');
searchchar('u');
searchchar('e');
searchchar('l');
space(1);
searchchar('w');
searchchar('o');
searchchar('r');
searchchar('l');
searchchar('d');
}
////////////////////////////////////////////////////////////////////////////////////////////////
void second_line(void)
{
PORTDbits.RD0 = 1;
PORTDbits.RD1 = 0;
PORTB = 0b11000000;
PORTDbits.RD0 = 0;
delay();
}
////////////////////////////////////////////////////////////////////////////////////////////////
char inttochar(int in)
{
char out;
if(in == 0) out = '0';
if(in == 1) out = '1';
if(in == 2) out = '2';
if(in == 3) out = '3';
if(in == 4) out = '4';
if(in == 5) out = '5';
if(in == 6) out = '6';
if(in == 7) out = '7';
if(in == 8) out = '8';
if(in == 9) out = '9';
return out;
}
////////////////////////////////////////////////////////////////////////////////////////////////
void space(int u)
{
int i;
for(i=0;i<u;i++)
{
PORTDbits.RD2 = 0;
PORTDbits.RD1 = 0;
PORTDbits.RD0 = 1;
PORTB = 0b00010100;
PORTDbits.RD0 = 0;
Delay1KTCYx(1);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
void backspace(int u)
{
int i;
for(i=0;i<u;i++)
{
PORTDbits.RD2 = 0;
PORTDbits.RD1 = 0;
PORTDbits.RD0 = 1;
PORTB = 0b00010000;
PORTDbits.RD0 = 0;
Delay1KTCYx(1);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
void init_display(void)
{
delay(); //give display time to wake up
PORTDbits.RD1 = 0;
PORTDbits.RD2 = 0;
// ----------------------------------------------------------------
// Function set
PORTDbits.RD0 = 1;
PORTB = 0b00111000;
PORTDbits.RD0 = 0;
delay();
// Turn on screen
cursor(0);
// Entry mode set
PORTDbits.RD0 = 1;
PORTB = 0b00000110;
PORTDbits.RD0 = 0;
delay();
// Cursor home
PORTDbits.RD0 = 1;
PORTB = 0b00000010;
PORTDbits.RD0 = 0;
delay();
return;
}
////////////////////////////////////////////////////////////////////////////////////////////////
void write_to_screen(char bytes)
{
PORTDbits.RD1 = 1;
PORTDbits.RD0 = 1;
PORTB = bytes;
PORTDbits.RD0 = 0;
delay();
return;
}
////////////////////////////////////////////////////////////////////////////////////////////////
void clear_display(void)
{
//int i;
PORTDbits.RD2 = 0;
PORTDbits.RD1 = 0;
// write text to LCD
PORTDbits.RD0 = 1;
PORTB = 0b00000001;
PORTDbits.RD0 = 0;
delay();
}
////////////////////////////////////////////////////////////////////////////////////////////////
void delay(void)
{
// wait 3.00 ms @ 20MHz
unsigned int i;
unsigned int t;
for(i = 0 ; i < 10000 ; i++)
t=t+1;
return;
}
////////////////////////////////////////////////////////////////////////////////////////////////
void cursor(int u)
{
PORTDbits.RD1 = 0;
PORTDbits.RD2 = 0;
// Turn on/off cursor
PORTDbits.RD0 = 1;
if(u)PORTB = 0b00001111;
else PORTB = 0b00001100;
PORTDbits.RD0 = 0;
delay();
}
////////////////////////////////////////////////////////////////////////////////////////////////
void searchchar (char input)
{
if(input == '!') write_to_screen(0b00100001);
if(input == '"') write_to_screen(0b00100010);
if(input == '#') write_to_screen(0b00100011);
if(input == '$') write_to_screen(0b00100100);
if(input == '%') write_to_screen(0b00100101);
if(input == '&') write_to_screen(0b00100110);
if(input == '(') write_to_screen(0b00101000);
if(input == ')') write_to_screen(0b00101001);
if(input == '*') write_to_screen(0b00101010);
if(input == '+') write_to_screen(0b00101011);
if(input == ',') write_to_screen(0b00101100);
if(input == '-') write_to_screen(0b00101101);
if(input == '.') write_to_screen(0b00101110);
if(input == '/') write_to_screen(0b00101111);
if(input == '0') write_to_screen(0b00110000);
if(input == '1') write_to_screen(0b00110001);
if(input == '2') write_to_screen(0b00110010);
if(input == '3') write_to_screen(0b00110011);
if(input == '4') write_to_screen(0b00110100);
if(input == '5') write_to_screen(0b00110101);
if(input == '6') write_to_screen(0b00110110);
if(input == '7') write_to_screen(0b00110111);
if(input == '8') write_to_screen(0b00111000);
if(input == '9') write_to_screen(0b00111001);
if(input == ':') write_to_screen(0b00111010);
if(input == ';') write_to_screen(0b00111011);
if(input == '<') write_to_screen(0b00111100);
if(input == '=') write_to_screen(0b00111101);
if(input == '>') write_to_screen(0b00111110);
if(input == '?') write_to_screen(0b00111111);
if(input == 'A') write_to_screen(0b01000001);
if(input == 'B') write_to_screen(0b01000010);
if(input == 'C') write_to_screen(0b01000011);
if(input == 'D') write_to_screen(0b01000100);
if(input == 'E') write_to_screen(0b01000101);
if(input == 'F') write_to_screen(0b01000110);
if(input == 'G') write_to_screen(0b01000111);
if(input == 'H') write_to_screen(0b01001000);
if(input == 'I') write_to_screen(0b01001001);
if(input == 'J') write_to_screen(0b01001010);
if(input == 'K') write_to_screen(0b01001011);
if(input == 'L') write_to_screen(0b01001100);
if(input == 'M') write_to_screen(0b01001101);
if(input == 'N') write_to_screen(0b01001110);
if(input == 'O') write_to_screen(0b01001111);
if(input == 'P') write_to_screen(0b01010000);
if(input == 'Q') write_to_screen(0b01010001);
if(input == 'R') write_to_screen(0b01010010);
if(input == 'S') write_to_screen(0b01010011);
if(input == 'T') write_to_screen(0b01010100);
if(input == 'U') write_to_screen(0b01010101);
if(input == 'V') write_to_screen(0b01010110);
if(input == 'W') write_to_screen(0b01010111);
if(input == 'X') write_to_screen(0b01011000);
if(input == 'Y') write_to_screen(0b01011001);
if(input == 'Z') write_to_screen(0b01011010);
if(input == '[') write_to_screen(0b01011011);
if(input == ']') write_to_screen(0b01011101);
if(input == '^') write_to_screen(0b01011110);
if(input == '_') write_to_screen(0b01011111);
if(input == '`') write_to_screen(0b01100000);
if(input == 'a') write_to_screen(0b01100001);
if(input == 'b') write_to_screen(0b01100010);
if(input == 'c') write_to_screen(0b01100011);
if(input == 'd') write_to_screen(0b01100100);
if(input == 'e') write_to_screen(0b01100101);
if(input == 'f') write_to_screen(0b01100110);
if(input == 'g') write_to_screen(0b01100111);
if(input == 'h') write_to_screen(0b01101000);
if(input == 'i') write_to_screen(0b01101001);
if(input == 'j') write_to_screen(0b01101010);
if(input == 'k') write_to_screen(0b01101011);
if(input == 'l') write_to_screen(0b01101100);
if(input == 'm') write_to_screen(0b01101101);
if(input == 'n') write_to_screen(0b01101110);
if(input == 'o') write_to_screen(0b01101111);
if(input == 'p') write_to_screen(0b01110000);
if(input == 'q') write_to_screen(0b01110001);
if(input == 'r') write_to_screen(0b01110010);
if(input == 's') write_to_screen(0b01110011);
if(input == 't') write_to_screen(0b01110100);
if(input == 'u') write_to_screen(0b01110101);
if(input == 'v') write_to_screen(0b01110110);
if(input == 'w') write_to_screen(0b01110111);
if(input == 'x') write_to_screen(0b01111000);
if(input == 'y') write_to_screen(0b01111001);
if(input == 'z') write_to_screen(0b01111010);
if(input == '{') write_to_screen(0b01111011);
if(input == '|') write_to_screen(0b01111100);
if(input == '}') write_to_screen(0b01111101);
if(input == '@') write_to_screen(0b11011111);
//type new lines here to add more characters
}
////////////////////////////////////////////////////////////////////////////////////////////////
ADC op PIC microcontroller
- bumblebee gebruikt met wisp628 v1.11
- PIC 18F4620 met freq. 20 MHz
uitleg:
deze code kan gebruikt worden om de analoog digitaal converter in de microcontroller te gebruiken. Het signaal is aangesloten op AN0, en de adc meet tussen 0 en 5 volt. als je dit wilt veranderen in Vref, moet je bit 4 en 5 van ADCON1 wijzigen in een 1. Denk ook aan je TRIS settings! resultn bevat het resultaat van de conversie.
//adconv.c//
#include <p18f4620.h>
#include <delays.h>
#include <adc.h>
///fuses instellen//
#pragma config OSC = HS
#pragma config PWRT = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF
void main(void )
{
int result, result2,resultn, resultt;
TRISA = 0b00111111;
ADCON0 = 0b00000001; //Channel 0, not started, ADC ON
ADCON1 = 0b00000111; //Portconfig: AN0 analog, other i/o digital, Vref- = Vss, Vref+ = Vdd
ADCON2 = 0b10111010; //Result left justified, aq time = 20 Tad, conversion clock = Fosc/32
while(1)
{
Delay10TCYx(5); //Delay for 50TCY
while( BusyADC() ); // Wait for ADC conversion
ADCON0bits.GO = 1; //Start conversion
while(ADCON0bits.GO == 1); //Wait for completion
result = ADRESL; //Read result, 8 MSBs
result2 = ADRESH;
resultt = (result2 << 8);
resultn = (result + resultt)>> 2;
//doe hier iets met je resultaat//
Delay10KTCYx(0); //korte pauze
}
}
3x4 matrixtoetsenbord op PIC microcontroller
- bumblebee gebruikt met wisp628 v1.11
- PIC 18F4620 met freq. 20 MHz
uitleg:
Deze code leest een 3x4 matrix folietoetsenbord uit. De integer perm werd gebruikt voor een tijd in te stellen. het is een trigger dat je bij minuten geen 60 bijvoorbeeld kunt intoetsen.
//usart.c//
#include <p18f4620.h>
#include <delays.h>
///fuses instellen//
#pragma config OSC = HS
#pragma config PWRT = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF
int getnumber(int perm);
void main (void)
{
int getnumber(1); //voor alle getallen
int getnumber(1); //voor 0-5
int getnumber(0); //voor * en #
}
int getnumber(int perm)
{
// RD7 = (1,4,7,*)
// RD6 = (2,5,8,0)
// RD5 = (3,6,9,#)
// RD4 = (*,0,#)
// RC7 = (7,8,9)
// RC6 = (4,5,6)
// RC5 = (1,2,3)
int result = 13; //valt buiten waardes, 0 is een waarde
int flag = 1;
TRISC = 0b11100000;
TRISD = 0b00010000;
PORTC = 0x00;
while(flag)
{
//check first column
PORTD = 0b10000000;
Delay1KTCYx(3); //give time to configure
if((PORTCbits.RC5 == 1) && ((perm == 1) || (perm == 2)))
{
result = 1;
//timearray[y] = 1;
//searchchar('1');
flag = 0;
}
if((PORTCbits.RC6 == 1) && ((perm == 1) || (perm == 2)))
{
result = 4;
//timearray[y] = 4;
//searchchar('4');
flag = 0;
}
if((PORTCbits.RC7 == 1) && (perm == 1))
{
result = 7;
//timearray[y] = 7;
//searchchar('7');
flag = 0;
}
if((PORTDbits.RD4 == 1) && (perm == 0))
{
result = 10;
//searchchar('*');
flag = 0;
}
//check second column
PORTD = 0b01000000;
Delay1KTCYx(3); //give time to configure
if((PORTCbits.RC5 == 1) && ((perm == 1) || (perm == 2)))
{
result = 2;
//searchchar('2');
flag = 0;
}
if((PORTCbits.RC6 == 1) && ((perm == 1) || (perm == 2)))
{
result = 5;
//searchchar('5');
flag = 0;
}
if((PORTCbits.RC7 == 1) && (perm == 1))
{
result = 8;
//searchchar('8');
flag = 0;
}
if((PORTDbits.RD4 == 1) && ((perm == 1) || (perm == 2)))
{
result = 0;
//searchchar('0');
flag = 0;
}
//check third column
PORTD = 0b00100000;
Delay1KTCYx(3); //give time to configure
if((PORTCbits.RC5 == 1) && ((perm == 1) || (perm == 2)))
{
result = 3;
//searchchar('3');
flag = 0;
}
if((PORTCbits.RC6 == 1) && (perm == 1))
{
result = 6;
//searchchar('6');
flag = 0;
}
if((PORTCbits.RC7 == 1) && (perm == 1))
{
result = 9;
//searchchar('9');
flag = 0;
}
if((PORTDbits.RD4 == 1) && (perm == 0))
{
result = 11;
//searchchar('#');
flag = 0;
}
}
Delay10KTCYx(100);
flag = 1;
return result; ///uiteindelijke resultaat ingedrukte toets
}
DS18S20 op PIC microcontroller
- bumblebee gebruikt met wisp628 v1.11
- PIC 18F4620 met freq. 20 MHz
uitleg:
Deze code leest de temperatuur uit van de digitale sensor via de onewire(maxim). De data bus is pin D3. speciale functies als splitbyte(in onewire_s), splitint(voor temperatuur op LCd zetten), catnate bits (in onewire_r). De code is geschreven voor slechts 1 device. voor meerdere devices moeten converttemp en readscratchpad en wellicht main gewijzigd worden. De onewirecommunicatie blijft echter gelijk 
//ds18s20.c//
#include <p18f4620.h>
#include <delays.h>
///fuses instellen//
#pragma config OSC = HS
#pragma config PWRT = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF
void init(void);
void converttemp(void);
void readscratchpad(void);
int presence(void);
void onewire_s(int sendbyte);
int onewire_r(void);
int exp(int a,int b);
void splitint(int in)
//////////////////////////////
void main(void )
{
while(1)
{
converttemp();
readscratchpad();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
void init(void)
{
//PIC-things
TRISB = 0;
TRISC = 0b10010000; // make C0 & C6 inputs
TRISD = 0;
// make sure everything's OFF
PORTA = 0x0;
PORTB = 0x0;
PORTC = 0x0;
PORTD = 0x0;
}
/////////////////////////////////////////DS1820 functions///////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
void converttemp(void)
{
int i,realtemp=0,calctemp=0,famcode=0,CRC=0;
int sensor_id[6];
int byte[9],flag = 0;
if(presence()==1) //check if sensor is present before continue
{
onewire_s(0xCC); //send "skip ROM" command
onewire_s(0x44); //send "Convert T" command
Delay10KTCYx(255);
Delay10KTCYx(255);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
int presence(void) //returns 1 if DS1820 is on bus, also called reset
{
int pr = 0;
TRISD = 0x00; //make bus output
PORTDbits.RD3 = 0; //make bus low
Delay100TCYx(25); //wait 500us
PORTDbits.RD3 = 1; //make bus high
TRISD = 0b00001000; //make bus input
Delay10TCYx(31); //wait 62us for sensor to respond
if(PORTDbits.RD3 == 0) //if sensor pulls down
{
Delay10TCYx(30); //wait 60us
if(PORTDbits.RD3 == 0)
{
pr =1; //if bus = still low, DS1820 it present
}
else pr=0;
}
Delay100TCYx(19); //wait 380us to end presence mode
return pr; //return presence bit
}
////////////////////////////////////////////////////////////////////////////////////////////////
void readscratchpad(void)
{
int i,realtemp=0,calctemp=0;
int bytes[9];
if(presence()==1) //check if sensor is present before continue
{
onewire_s(0xCC); //send "skip ROM" command
onewire_s(0xBE); //send "read scratchpad" command
for(i=0;i<10;i++)
{
bytes[i] = onewire_r();
}
splitint(bytes[0]*5);
//searchchar(';');
//splitint(bytes[1]);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
void onewire_s(int sendbyte)
{
//portD3 is used for one-wire
//send LSB first
//Write timeslot has duration at least 60 us, with at least 1us recovery
//The master(PIC) has to pull down and release within 15us for a logic 0, and a minimum of 60us for logic 1
int c;
///////////////procedure splitbyte//////////////////////
int biti,i;
int bits[8];
int rest=sendbyte;
for(i=0;i<8;i++) //split 8 times
{
biti = exp(2,7-i); //calculate current exponent
if( rest >= biti ) //if byte> calculated exponent
{
bits[i] = 1; //current bit of byte is 1
rest = rest - biti; //change rest value
}
else
{
bits[i] = 0; //else current bit = 0
}
}
//////////////////////////////////////////////////////
for(c=7;c>=0;c--)
{
if(bits[c] == 0) //if bit = 0, write "0" to DS1820
{
TRISD = 0x00; //make bus output
PORTDbits.RD3 = 0; //begin sending "0"
Delay100TCYx(5); //wait for 100us
PORTDbits.RD3 = 1; //pull back up
Delay10TCYx(1); //recovery time 2us
}
if(bits[c] == 1) //if bit = 1, write "1" to DS1820
{
TRISD = 0x00; //make bus output
PORTDbits.RD3 = 0; //begin sending "1"
Delay10TCYx(5); //wait for 10us
PORTDbits.RD3 = 1; //pull back up
Delay10TCYx(26); //recovery time 2us + time slot = 52us
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
int onewire_r(void)
{
//portD3 is used for one-wire
//receive LSB first
//Read timeslot has duration at least 60 us, with at least 1us recovery
//The master(PIC) must send "read-timeslot command" directly after sending Convert T(0x44)
int b,i,biti,byte,bitscatn=0;
int bits[8];
for(i=7;i>=0;i--) //collect 8 bits
{
//initiate read timeslot
TRISD = 0x00; //make bus output
PORTDbits.RD3 = 0; //initiate read time slot
Delay10TCYx(1); //pull down for 2us
TRISD = 0b00001000; //make bus input (listen)
Delay10TCYx(4); //wait 8us
if(PORTDbits.RD3 == 0) //bus still low?
{
bits[i] = 0; //if so, current bit =0
}
if(PORTDbits.RD3 == 1) //bus became high?
{
bits[i] = 1; //if so, current bit =1
}
Delay10TCYx(25); //wait 50us to get next bit
}
///Concatenate bits///bits[0] = MSB
for(b=0;b<8;b++)
{
biti = exp(2,7-b);
bitscatn = bitscatn +bits[b]*biti;
}
/////////result = bitscatn//////////
return bitscatn;
}
////////////////////////////////////////////////////////////////////////////////////////////////
int exp(int a,int b)
{
int exp = 1,c;
if(b == 0) {exp = 1; return exp;} //if exponent =0, then answer is always 1, return value
if(a == 0) {exp = 0; return exp;} //if a = 0, answer = 0, return value
else
{
for(c = 0;c<b;c++)
{
exp = exp * a; //multiplicate
}
return exp; //return value
}
}
////////////////////////////////End of DS1820 functions/////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
void splitint(int in)
{
int outa=0; //duizendtal
int outb=0; //hondertal
int outc=0; //tiental
int outd=0; //eenheid
int ref, temp;
// ----- duizendtal -----
ref=1000;
temp=1;
while(ref!=0)
{
if(ref<=in)
{
outa=temp;
break;
}
ref-=1000;
temp--;
}
// ----- hondertal -----
in-=(1000*outa);
ref=900;
temp=9;
while(ref!=0)
{
if(ref<=in)
{
outb=temp;
break;
}
ref-=100;
temp--;
}
// ----- tiental -----
in-=(100*outb);
ref=90;
temp=9;
while(ref!=0)
{
if(ref<=in)
{
outc=temp;
break;
}
ref-=10;
temp--;
}
// ----- eenheid -----
in-=(10*outc);
ref=9;
temp=9;
while(ref!=0)
{
if(ref<=in)
{
outd=temp;
break;
}
ref--;
temp--;
}
//doe iets leuks met (outa, outb, outc, outd);
}
Volgens mij is een link zinvoller dan al die lappen code: http://www.microchipc.com
hej,
die single wire usart heb ik (nog) niet. Als iemand zich geroepen voelt
....
ik denk dat de link een aanvulling geeft jowi, niet iedereen hier kan evengoed engels, en er staat niet uitgelegd bij de code wat het doet, zodat je de stappen niet snapt. voor elke toepassing moet je toch weer net je eigen invulling inbrengen. dus in zoverre ben ik het niet met je eens, maar de link is zeker zinvol 
Gr. Rik
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Wellicht off-topic, maar ik krijg ook nog steeds een enorme scroll-bar bij code met te veel kolommen. We hebben nog niet allemaal een 1900 pix breed scherm helaas...