#include #define pause_us() __asm nop __endasm XT-Frequenz code char at __CONFIG1H _conf0 = _IESO_OFF_1H & _FCMEN_OFF_1H & _OSC_XT_1H; code char at __CONFIG2L _conf1 = _BODEN_OFF_2L & _PUT_OFF_2L; code char at __CONFIG2H _conf2 = _WDT_DISABLED_CONTROLLED_2H; code char at __CONFIG4L _conf4 = _STVR_OFF_4L & _LVP_OFF_4L & _BACKBUG_OFF_4L; unsigned int a,b,c,i; unsigned char ein,in,wert,maske,werta,wertb,erg,t_ein,einer,zehner,hunderter,tausender,rest,j,count,n; unsigned char initcode[]={40,40,136,8,200,8,24,8,104}; unsigned char z1[]={74,218,106,26,122,154,42,218,74,42,122,42,106,154,122,74,122,74}; unsigned char lcd_4lowbits[] = {0,16,32,48,64,80,96,112,128,144}; unsigned char lcd_4highbits[] = {48,48,48,48,48,48,48,48,48,48}; //Funktionen vormerken void init(); void ausgabe_lcd(); void zeile1(); void zeile2(); void zeile3(); void zeile4(); void pause(); void pause_15us(); void pause_50us(); void pause_250us(); void pause_s(); void reset(); void write(); void read8bit(); //Hauptschleife void main() { ADCON1 = 112; TRISA = 0; TRISB = 0; LATA = 0; LATB = 0; a = 0; b = 0; c = 0; init(); for(i=0;i<12000;i++); //200ms warten while(1) { for(i=0;i<12000;i++); //200ms warten reset(); //wert = 0xEE; //Befehl start conversation //write(); //reset(); //wert = 0xAA; //Lese Temperatur vom Sensor //write(); //0xAA => 10101010 //read8bit(); ausgabe_lcd(); pause(); pause(); pause(); pause(); pause(); pause(); } } //Initialisierung Display******************************************************************************************** void init() { LATB = 0; for (i=0;i<3000;i++); //Wartezeit bis Display VDD erreicht hat > 30ms for(b=0;b<=8;b++) { LATB = initcode[b]; for(i=0;i<10;i++); //Wartezeit mehr als 100µs LATBbits.LATB3 = 0; for(i=0;i<350;i++); } } //******************************************************************************************************************* //Werte auf Display ausgeben***************************************************************************************** void ausgabe_lcd() { zeile1(); LATB = 74; //Highbit senden for(i=0;i<10;i++); LATBbits.LATB3 = 0; for(i=0;i<10;i++); LATB = 218; //Lowbit senden for(i=0;i<10;i++); LATBbits.LATB3 = 0; for(i=0;i<10;i++); } //******************************************************************************************************************* //In Zeile 1 springen (LCD)****************************************************************************************** void zeile1() { LATB = 136; for(i=0;i<10;i++); LATBbits.LATB3 = 0; for(i=0;i<10;i++); LATB = 8; for(i=0;i<10;i++); LATBbits.LATB3 = 0; for(i=0;i<10;i++); } //******************************************************************************************************************* //In Zeile 2 springen (LCD)****************************************************************************************** void zeile2() { LATB = 200; for(i=0;i<10;i++); LATBbits.LATB3 = 0; for(i=0;i<10;i++); LATB = 8; for(i=0;i<10;i++); LATBbits.LATB3 = 0; for(i=0;i<10;i++); } //******************************************************************************************************************* //In Zeile 3 springen (LCD)****************************************************************************************** void zeile3() { LATB = 152; for(i=0;i<10;i++); LATBbits.LATB3 = 0; for(i=0;i<10;i++); LATB = 72; for(i=0;i<10;i++); LATBbits.LATB3 = 0; for(i=0;i<10;i++); } //******************************************************************************************************************* //In Zeile 4 springen (LCD)****************************************************************************************** void zeile4() { LATB = 216; for(i=0;i<10;i++); LATBbits.LATB3 = 0; for(i=0;i<10;i++); LATB = 72; for(i=0;i<10;i++); LATBbits.LATB3 = 0; for(i=0;i<10;i++); } //******************************************************************************************************************* //DS1821 resetten**************************************************************************************************** void reset() { PORTAbits.RA4 = 0; LATAbits.LATA4 = 1; pause_250us(); //Wartezeit >500 µs pause_250us(); pause_250us(); //******* Umschalten auf Eingang RB0 ******************** TRISAbits.TRISA4 = 1; pause_50us(); pause_15us(); //******* Warten auf ds1821 ***************************** while(PORTAbits.RA4 == 1); //******* Warten während des presence pulse - Signales ******** while(PORTAbits.RA4 == 0); pause_250us(); //Wartezeit >500 µs pause_250us(); //******* Presence war vorhanden ***************************** } void umsetzung() { ein = 135; //Aufspaltung in Dezimalstellen rest = ein%100; hunderter = (ein - rest)/100; rest = (ein - hunderter * 100)%10; zehner = (ein - hunderter * 100 - rest)/10; einer = rest; j = hunderter; ausgabe_lcd(); j = zehner; ausgabe_lcd(); j = einer; ausgabe_lcd(); } void write() { //******* Umschalten auf Ausgang ************************ maske = 0x01; for (k=0;k<8;k++) { erg = wert & maske; PORTAbits.RA4 = 0; LATAbits.LATA4 = 0; TRISAbits.TRISA4 = 0; pause_us(); pause_us(); pause_us(); pause_us(); pause_us(); TRISAbits.TRISA4 = erg & 1; pause_50us(); //Wartezeit 60µs pause_15us(); TRISAbits.TRISA4 = 1; pause_15us(); wert=wert>>1; } pause_50us(); } void read8bit() { t_ein = 0; maske=0x01; for (k=0;k<8;k++) // 8 Bits einlesen { PORTAbits.RA4 = 0; LATAbits.LATA4 = 0; TRISAbits.TRISA4 = 0; pause_us(); pause_us(); pause_us(); TRISAbits.TRISA4 = 1; pause_us(); pause_us(); pause_us(); if (PORTAbits.RA4 == 1) t_ein |= maske; else while(PORTAbits.RA4 == 0); pause_50us(); //Wartezeit mindestens 100µs pause_50us(); maske<<=1; //nächstes Bit } } //Pausenfunktionen*************************************************************************************************** void pause() { unsigned char z = 0; T0CON = 199; while(z<=1) { TMR0H = 60; TMR0L = 176; while(INTCONbits.T0IF==0); z++; INTCONbits.T0IF = 0; } T0CON = 0; } //******************************************************************************************************************* void pause_15us() { for(i=0;i<1;i++); } //******************************************************************************************************************* void pause_50us() { for(i=0;i<3;i++); //3 * 17µs = 54µs } //******************************************************************************************************************* void pause_250us() { for(i=0;i<15;i++); //15 * 17µs = 255µs } //******************************************************************************************************************* void pause_s() { for (n=0;n<5;n++) { for(i=0;i<65530;i++); } }