- 12V Akku mit 280 Ah bauen         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: 1Wire DS1820 Problem mit Scratchpad

  1. #11
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.06.2004
    Ort
    HDN
    Alter
    43
    Beiträge
    102
    Anzeige

    Praxistest und DIY Projekte
    Also ich melde mich grad von arbeit.
    In der gastronomie is es halt nicht so mit 8 h arbeiten hab 16 uhr angefangen.jetzt werd ich irgendwannmal!! so um 3!!!!ins bett gehen und vieleicht bis um 12 schlafen und Sa um 16 uhr gehts weiter.Sontag hab ich von 10 bis 23 uhr Schicht.werd mi ins zeug legen aber ich denke bis montag abend werden wir ergebnisse haben.

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.06.2004
    Ort
    HDN
    Alter
    43
    Beiträge
    102
    Bin schon dabei.Zwischenfrage benutzt du die Hardware also PIC + MAX
    das erspart mir viel zeit beim proggen.TX is pin 17 und RX is 18.(RS232)
    Für den ds... kan ich PORTA auser pin4 und PORt B nehmen.W§ird doch mehr arbeit als ich dachte Es giebt auch ne Softwär und ne schlatung um den chip direckt am pc zu betreiben da sparst du dir den pic.Such mal bei elektor.

  3. #13
    goethe
    Gast
    PIC und seperaten MAX
    C6 Tx
    C7 Rx
    bei mir!

    alles auf PORT C PIN C4!

    ...brauchs nicht fürn PC
    brauchs fürn PIC
    schaffst das?

  4. #14
    goethe
    Gast
    ich kann da noch meinen Code zeigen...

    ..vielleicht findest ja n Fehler so...



    CODE:

    #include <16f870.h>
    #use delay(clock=4000000)
    #fuses XT,NOWDT,NOLVP

    #define SKIP_ROM 0xCC
    #define CONVERT_T 0x44
    #define READ_SCRATCHPAD 0xBE

    #define DQ PIN_C4
    //#define Tx_DS1820 PIN_C5

    #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)


    //////////////////////////////////////////////////////////////////////////////
    // OW_RESET - performs a reset on the one-wire bus and
    // returns the presence detect. Reset is 480us, so delay
    // value is (480-24)/16 = 28.5 - we use 29. Presence checked
    // another 70us later, so delay is (70-24)/16 = 2.875 - we use 3.
    //
    unsigned char ow_reset(void)
    {
    unsigned char presence;
    output_low(DQ); //pull DQ line low
    delay_us(480); // leave it low for 480us
    input(DQ); // allow line to return high
    delay_us(70); // wait for presence
    presence = DQ; // get presence signal
    delay_us(424); // wait for end of timeslot
    return(presence); // presence signal returned
    } // 0=presence, 1 = no part




    //////////////////////////////////////////////////////////////////////////////
    // READ_BIT - reads a bit from the one-wire bus. The delay
    // required for a read is 15us, so the DELAY routine won't work.
    // We put our own delay function in this routine in the form of a
    // for() loop.
    //
    unsigned char read_bit(void)
    {
    unsigned char i;
    output_low(DQ); // pull DQ low to start timeslot
    input(DQ);// then return high
    for (i=0; i<3; i++); // delay 15us from start of timeslot
    return(DQ); // return value of DQ line
    }




    //////////////////////////////////////////////////////////////////////////////
    // WRITE_BIT - writes a bit to the one-wire bus, passed in bitval.
    //
    void write_bit(char bitval)
    {
    output_low(DQ); // pull DQ low to start timeslot
    if(bitval==1) input(DQ); // return DQ high if write 1
    delay_us(104); // hold value for remainder of timeslot
    input(DQ);
    }// Delay provides 16us per loop, plus 24us. Therefore delay(5) = 104us


    //////////////////////////////////////////////////////////////////////////////
    // READ_BYTE - reads a byte from the one-wire bus.
    //
    unsigned char read_byte(void)
    {
    unsigned char i;
    unsigned char value = 0;
    for (i=0;i<8;i++)
    {
    if(read_bit()) value|=0x01<<i; // reads byte in, one byte at a time and then
    // shifts it left
    delay_us(120); // wait for rest of timeslot
    }
    return(value);
    }



    //////////////////////////////////////////////////////////////////////////////
    // WRITE_BYTE - writes a byte to the one-wire bus.
    //
    void write_byte(char val)
    {
    unsigned char i;
    unsigned char temp;
    for (i=0; i<8; i++) // writes byte, one bit at a time
    {
    temp = val>>i; // shifts val right 'i' spaces
    temp &= 0x01; // copy that bit to temp
    write_bit(temp); // write bit in temp into
    }
    delay_us(104);
    }

    void main()
    {
    char get[10];
    int k;
    char temp_f,temp_c;

    while(1)
    {

    ow_reset();
    write_byte(0xCC); //Skip ROM
    write_byte(0x44); // Start Conversion
    delay_us(104);
    ow_reset();
    write_byte(0xCC); // Skip ROM
    write_byte(0xBE); // Read Scratch Pad
    for (k=0;k<9;k++)
    { get[k]=read_byte();
    }

    printf("\n ScratchPAD DATA = %X%X%X%X%X\n",get[8],get[7],get[6],get[5],get[4],get[3],get[2],get[1],get[0]);


    }
    }

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.06.2004
    Ort
    HDN
    Alter
    43
    Beiträge
    102
    (Wieder auf arbeit)Wie ich schon sagte kann kein C
    ASM BASIC HTML bissel Pascal und java aber kein c is mir zu unübersichtlich.ich brauch grad mal das komma und den Hochstrich ' .
    und 35 befehle.
    Ach ja schau mal hier im forum da giebt es einen threat über den ds.
    Mit lcd ansteuerung.Das ganze in C geschrieben.Das kann dir sicherlich weiterhelfen.

    Werd mal sehen wann ich hier heute rauskomme und mich dransetzen.wenn ich nicht einschlafe.Hast du icq oder sowas wenn ich progge must du ein zwei mal bestimmt das prog draufbrennen.
    Hab mir die 1wire routienen schon mal überlegt das init kann ich jetzt auch endlich anfangen.Montag hab ich frei und Zeit.

  6. #16
    goethe
    Gast
    Icq:95-809-519
    hab aber nur n Galep brenner...

    kyky
    thxthx


  7. #17
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.06.2004
    Ort
    HDN
    Alter
    43
    Beiträge
    102
    Solange der die progs bennt solte es gehen.wie hast du morgen zeit?

    So lade das mal drauf schließ alles an ds an C4 und loß comterminal auf 2400 Baud einstellen.wenn der max und der chip gehen müßte im terminel check stehen.is nur das init des ds das Das die kom. klappt.
    Angehängte Dateien Angehängte Dateien

  8. #18
    goethe
    Gast
    http://www.maxim-ic.com/appnotes.cfm...te_number/2420

    auf deutsch,bitte schön

    hoffe das es jetzt klappt [-o<

    vielleicht tust du dir leichter wenn du s in Word kopierst..
    also..

    um das 1-wire protokoll als master zu bertreiben bruacht man nur 2 gpio zustände -> high und low. der folgende code erreicht diese 2 zustände. der pic 16f628 hat 2 gpio ports, porta und portb. beide können für die kommunikation verwendet werden aber in diesem beispiel wird portb verwendet. der folgende code nimmt an, das ein konstanter DQ im assembler code definiert wurde um anzuzeigen, welches bit in portb der 1wire pin ist. im code wird diese bit nummer DQ genannt. von außen muss dieser pin an eine betriebsspannung mit einem pullup widerstand angeschlossen werden.
    OW_HIZ:MACRO
    ;Force the DQ line into a high impedance state.
    BSF STATUS,RP0 ; wähle slot 1 im speicher
    BSF TRISB, DQ ; setze DQ high
    BCF STATUS,RP0 ; wähle slot 0 im speciher
    ENDM

    OW_LO:MACRO
    ;Force the DQ line to a logic low.
    BCF STATUS,RP0 ; Select Bank 0 of data memory
    BCF PORTB, DQ ; resette das DQ bit
    BSF STATUS,RP0 ; Select Bank 1 of data memory
    BCF TRISB, DQ ; setze DQ pin als ausgang
    BCF STATUS,RP0 ; Select Bank 0 of data memory
    ENDM

    beide code teile sind als makros geschrieben. makros werden automatisch in den assembler code reinghaut indem man das makro aufruft. das bedeutet man muss den code nicht dauernd neu schreiben. das erste makro OW_HIZ zwingt die DQ line high zu gehen. erste schritt -> wähle slot 1 im speicher weil das TRISB register dort ist. dann wird der DQ ausgang auf high gesetzt in dem man das DQ bit im TRISB register setzt. die letzte zeile wechselt das ganze in den slot 0. die letzte zeile ist nicht notwendig aber es bedeutet, dass alle makros und funktions aufrufe den speicher in einem bekannten zustand lassen
    das zweite makro OW_LO zwingt die DQ line low zu gehen. zuerst wird slot0 im speicher ausgewählt damit auf das PORTB register zugegriffen werden kann. das PORTB register ist das datenregister und beinhaltet die werte die auf die TRISB pins gelegt werden, wenn diese als ausgang definiert werden

    das DQ bit von PORTB ist gelöscht/null gesetzt damit die Line auf low gezigen wird. schlussendliuch wird slot 1 vom speicher ausgewählt und das DQ bit des TRISB registers wird gelöscht/zurückgesetzt und wird somit zum ausgang. wie immer endet das makro mit dem slektieren von slot 0.


    ein drittes makro namems WAIT ist dabei um verzögerungen für die 1-wire signalisierung zu produzieren. WAIT wird benutzt um verzögerungen zu erzeugen, die ein vielfaches von 5µs sind. das makro wir mit dem wert TIME in µs aufgerufen und der entsprechende verzögerung wird generiert. das makro berecvhnet einfach die anzahl von zeiten, wo ein 5µs verzögerung gebraucht wird und wiederholt sich dann in einer schelife mit WAIT5U. die routine WAIT5U wird in der nächsten abschnitt geziegt. für jede instruktion innerhalb von WAIT wird die zeit die gebraucht wird um das zu verarbeiten angeziegt um verständlich zu machen, wie die verzögerung erreicht wird.
    WAIT:MACRO TIME
    ;Delay for TIME µs.
    ;Variable time must be in multiples of 5µs.
    MOVLW (TIME/5) - 1 ;1µs to process
    MOVWF TMP0 ;1µs to process
    CALL WAIT5U ;2µs to process
    ENDM


    allgemeine 1-wire routinen:
    das 1-wire timing protokoll enthält spezifische zeitliche beschränkungen die eingehaltren werden müssen um eine erfolgreiche kommunikation zu erzielen. um im erzeugen von besitmmten verzögerungen zu helfen gibt es die routine WAIT5U die 5µs verzögerungen erzeugt. diese routine wird hier gezeigt.
    WAIT5U:
    ;This takes 5µs to complete
    NOP ;1µs to process
    NOP ;1µs to process
    DECFSZ TMP0,F ;1µs if not zero or 2µs if zero
    GOTO WAIT5U ;2µs to process
    RETLW 0 ;2µs to process
    wenn diese in verbindung mit dem WAIT makro verwendet werden können einfache verzögerungen erzeugt werden. zum beispiel, wenn ein 40µs delay gebraucht wird würde WAIT 0.40 aufgerufen werden. daas veranlasst die ersten 3 zeilen in WAIT auszuühren und 4µs erzeugen. die nächsten 4 zeilen in WAIT5U erzeugen 5µs und wiederholen soich 6mal für ein totale anzahl von 30µs. die letzte schelfie von WAIT5U braucht 6µs und kehrt dann zum WAIT makro zurück. somkit ergibt sich eine summe von 30+4+6=40µs

    Table 1. Regular speed 1-Wire interface timing
    2.5V < VDD < 5.5V, TA = -20‹C to 70‹C.)
    Parameter Symbol Min Typ Max Units
    Time Slot tSLOT 60 120 µs
    Recovery Time tREC 1 µs
    Write 0 Low Time tLOW0 60 120 µs
    Write 1 Low Time tLOW1 1 15 µs
    Read Data Valid tRDV 15 µs
    Reset Time High tRSTH 480 µs
    Reset Time Low tRSTL 480 960 µs
    Presence Detect High tPDH 15 60 µs
    Presence Detect Low tPDL 60 240 µs

    der anfang jeder 1-wire kommunikation beginnt mit einem reset puls vom master device gefolgt von einem presence detect puls vom slave device. bild 1 zeigt diese aktion. diese initialsierungssequenz can leicht mit einem PIC geschickt werden. der assembler code befindete sich unter bild 1. die 1-wire timing spezifikationen für initialisierung, lesen und schreiben sind oben in tabelle 1. diese paramter werden im ganzen text verwende.
    Figure 1. 1-Wire initialization sequence.
    OW_RESET:
    OW_HIZ ; Start with the line high
    CLRF PDBYTE ; Clear the PD byte
    OW_LO
    WAIT .500 ; Drive Low for 500µs
    OW_HIZ
    WAIT .70 ; Release line and wait 70µs for PD Pulse
    BTFSS PORTB,DQ ; Read for a PD Pulse
    INCF PDBYTE,F ; Set PDBYTE to 1 if get a PD Pulse
    WAIT .430 ; Wait 430µs after PD Pulse
    RETLW 0










    die OW_RESET routine beginnt mit dem sicherstellen das der DQ pin auf high ist damit er mit einem pullup widerstand auf high gezogen wrd. dann wird das PDBYTE register gelöscht damit es den nächsten presence detect pusle verabwiten kann. nachher wird der DQ pin für 500µs auf low gezogen. dies kommt dem tRSTL register zugute, der in tabelle 1 gezeigt5 wird und stellt auch einen zusätzlichen 20µs puffer zur verfügung. nachdem der pin low gezofgen wurde wird er auf einen hohen impedanz zustand freeigeben und eine verzögerung von 7µs wird addiert bevor der presence detect pulse glesen wird. diese 70µs ermöglichen es das der pic eine gültige abtastzeit für jede mögliche kombination von tPDL and tPDH. wenn der presence piuls gelsen wurde wird das PDBTE register so eingerichtet das es den logsichen pegel anzeigt. der DQ pin wird im hohen impedanzzustand gelassen für weitere 430µs um sicherzustellen das die tRSTH erfüllt wurde und inmkludiert ienen zusätzlichen 20µs puffer.



    die nächste benöigte routine ist DSTXBYTE die verwedntet wid um daten zu einem slave device zu überttragen. der pic code für diese routine ist unter bild 2. diese routine wird aufgerufen mit den daten die in das WREG register gespeichert werden sollen und wird sofort ins IOBYTE register übertragen. dann ein COUNT register gestartet mit dem wert 8 um die anzahl von bits zu zählen die auf die DQ line gegeben werden. beginnend bei DSTXLP, beginnt der PIC daten ausztusenden. zuerst wird der DQ pin auf low gezigen für 5µs egal welcher logische pegel übertrasgen witrd. das sichert das die tLOW1 zeizt eingehalten witrd.. dann wurd das lsbb von IOBYTE in ein CARRY bit umgewandelt und dann getestet obs ne 1 oder ne 0 ist. wenn der carry ne 1 ist das wird das DQ bit von PORTB gesetzt und changed den pin in einen hohen impedanz zustand und die line wird augf high gezigeb. wenn der caryy ne 0 ist wird die line 0 gehalten. dann wird eine verzögerung von 60µs dazu addiert um auf die minimum tLOW0 zeit zu kommen. nach den 60µs wird der pin in einen hohen impedanzzustand gegeben und zusätzliche 2µs werden für den pullup widerstand addiert. schlussendlich wird das COUNT register dekrementiert. wenn das register 0 ist wurden alle 8 bits vershcikt und die routine ist zu ende. wenns ungleich 0 ist wird ein neues bit gesendete, beninned bei DSTXLP. eine grafische darstellunh davon ist in bild 2 zu sehen









    Figure 1. 1-Wire write time slots.
    DSTXBYTE: ; Byte to send starts in W
    MOVWF IOBYTE ; We send it from IOBYTE
    MOVLW .8
    MOVWF COUNT ; Set COUNT equal to 8 to count the bits
    DSTXLP:
    OW_LO
    NOP
    NOP
    NOP
    NOP
    NOP ; Drive the line low for 5µs
    RRF IOBYTE,F ; The data byte
    BTFSC STATUS,C ; Check the LSB of IOBYTE for 1 or 0
    BSF PORTB,DQ ; Drive the line high if LSB is 1
    WAIT .60 ; Continue driving line for 60µs
    OW_HIZ ; Release the line for pullup
    NOP
    NOP ; Recovery time of 2µs
    DECFSZ COUNT,F ; Decrement the bit counter
    GOTO DSTXLP
    RETLW 0












    die final routine für die kommunikation ist DSRXBYTE die es dem PIC ermöglicht die information vom slave zu erhalten. der code ist beibild 3. das COUNT register wird initialsiert mit 8 bevor jede DQ aktivität beginnt und ihre funktion ist die erhaltenen bits zu zählen. das DSRXLP beginnt indem es den DQ pin auf low zieht um dem slave device zu signalisieren das der pic bereit ist. die line wird low gezogen für 6µs und dann freigebenen iundem der DQ pin in einen high impedance zustand gezogen wird. dann wartet der pic weitere 4µs vor beginn der abtastung. in OW_LO gibt's eine code zeile nachdem die line auf low gezoigen wird und 3 zeilen innerhalb von OW_HIZ. jede zeile braucht 1µs zur verarbeitung. summe -> 1+6+3+4=14µs was unterhalb der tRDV spezifikationen von 15µs ist. nachdem das PORTB register gelesen wurde, wird des DQ bit demaskiert und das register wird zu 255 dazuaddiert um das CARRY zu zwingen das DQ bit zu spiegeln. das CARRY bit wird dann in IOBYTE kopiert wo das ankommende byte gespeichert wird. wenn das byte gespeichert wurde wird eine verzögerung von 50µs addiert um tSLOT zu erfüllen. der letzte check ist um zu bestimmen ob das COUNT register 0 ist. wenn ja dann wurden 8 bits gelesen und die routine wird verlassen. andernalls wird die schleife wiederholt mit DSRXLP. die read zero und read one aktionen sind in bild 3.

    Figure 1. 1-Wire read time slots.
    DSRXBYTE: ; Byte read is stored in IOBYTE
    MOVLW .8
    MOVWF COUNT ; Set COUNT equal to 8 to count the bits
    DSRXLP:
    OW_LO
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP ; Bring DQ low for 6µs
    OW_HIZ
    NOP
    NOP
    NOP
    NOP ; Change to HiZ and Wait 4µs
    MOVF PORTB,W ; Read DQ
    ANDLW 1<<DQ ; Mask off the DQ bit
    ADDLW .255 ; C = 1 if DQ = 1: C = 0 if DQ = 0
    RRF IOBYTE,F ; Shift C into IOBYTE
    WAIT .50 ; Wait 50µs to end of time slot
    DECFSZ COUNT,F ; Decrement the bit counter
    GOTO DSRXLP
    RETLW 0



    Appendix A: 1-Wire Include File (1W_16F6X.INC)
    ; ************************************************** *****
    ;
    ; Dallas 1-Wire Support for PIC16F628
    ;
    ; Processor has 4MHz clock and 1µs per instruction cycle.
    ;
    ; ************************************************** *****


    ; ************************************************** *****
    ; Dallas Semiconductor 1-Wire MACROS
    ; ************************************************** *****
    OW_HIZ:MACRO
    BSF STATUS,RP0 ; Select Bank 1 of data memory
    BSF TRISB, DQ ; Make DQ pin High Z
    BCF STATUS,RP0 ; Select Bank 0 of data memory
    ENDM
    ; --------------------------------------------------------
    OW_LO:MACRO
    BCF STATUS,RP0 ; Select Bank 0 of data memory
    BCF PORTB, DQ ; Clear the DQ bit
    BSF STATUS,RP0 ; Select Bank 1 of data memory
    BCF TRISB, DQ ; Make DQ pin an output
    BCF STATUS,RP0 ; Select Bank 0 of data memory
    ENDM
    ; --------------------------------------------------------
    WAIT:MACRO TIME
    ;Delay for TIME µs.
    ;Variable time must be in multiples of 5µs.
    MOVLW (TIME/5)-1 ;1µs
    MOVWF TMP0 ;1µs
    CALL WAIT5U ;2µs
    ENDM

    ; ************************************************** *****
    ; Dallas Semiconductor 1-Wire ROUTINES
    ; ************************************************** *****
    WAIT5U:
    ;This takes 5uS to complete
    NOP ;1µs
    NOP ;1µs
    DECFSZ TMP0,F ;1µs or 2µs
    GOTO WAIT5U ;2µs
    RETLW 0 ;2µs
    ; --------------------------------------------------------
    OW_RESET:
    OW_HIZ ; Start with the line high
    CLRF PDBYTE ; Clear the PD byte
    OW_LO
    WAIT .500 ; Drive Low for 500µs
    OW_HIZ
    WAIT .70 ; Release line and wait 70µs for PD Pulse
    BTFSS PORTB,DQ ; Read for a PD Pulse
    INCF PDBYTE,F ; Set PDBYTE to 1 if get a PD Pulse
    WAIT .400 ; Wait 400µs after PD Pulse
    RETLW 0
    ; --------------------------------------------------------
    DSRXBYTE: ; Byte read is stored in IOBYTE
    MOVLW .8
    MOVWF COUNT ; Set COUNT equal to 8 to count the bits
    DSRXLP:
    OW_LO
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP ; Bring DQ low for 6µs
    OW_HIZ
    NOP
    NOP
    NOP
    NOP ; Change to HiZ and Wait 4µs
    MOVF PORTB,W ; Read DQ
    ANDLW 1<<DQ ; Mask off the DQ bit
    ADDLW .255 ; C=1 if DQ=1: C=0 if DQ=0
    RRF IOBYTE,F ; Shift C into IOBYTE
    WAIT .50 ; Wait 50µs to end of time slot
    DECFSZ COUNT,F ; Decrement the bit counter
    GOTO DSRXLP
    RETLW 0
    ; --------------------------------------------------------
    DSTXBYTE: ; Byte to send starts in W
    MOVWF IOBYTE ; We send it from IOBYTE
    MOVLW .8
    MOVWF COUNT ; Set COUNT equal to 8 to count the bits
    DSTXLP:
    OW_LO
    NOP
    NOP
    NOP
    NOP
    NOP ; Drive the line low for 5µs
    RRF IOBYTE,F ; The data byte
    BTFSC STATUS,C ; Check the LSB of IOBYTE for 1 or 0
    BSF PORTB,DQ ; Drive the line high if LSB is 1
    WAIT .60 ; Continue driving line for 60µs
    OW_HIZ ; Release the line for pullup
    NOP
    NOP ; Recovery time of 2µs
    DECFSZ COUNT,F ; Decrement the bit counter
    GOTO DSTXLP
    RETLW 0
    ; --------------------------------------------------------

    Appendix B: PIC16F628 to DS2761 Assembly Code (PIC_2_1W.ASM)
    ; *******************************************
    ;
    ; Dallas Semiconductor PIC code
    ;
    ; This code will interface a PIC16F628 microcontroller to
    ; a DS2761 High-Precision Li+ Battery Monitor
    ;
    ; *******************************************;

  9. #19
    Gast
    ;
    ; VCC
    ; ^
    ; |
    ; |
    ; /
    ; \ Rpup
    ; /
    ; \
    ; |
    ; 16F628 | DS2761
    ; RB1 (pin 7) ------------------------------ DQ (pin 7)
    ;
    ; *******************************************;

    ;---------------------------------------------------------
    ; List your processor here.

    list p=16F628

    ; Include the processor header file here.

    #include <p16F628.inc>
    ;---------------------------------------------------------
    ; Assign the PORTB with Constants

    constant DQ=1 ; Use RB1 (pin7) for 1-Wire
    ;--------------------------------------------------------
    ; These constants are standard 1-Wire ROM commands

    constant SRCHROM=0xF0
    constant RDROM=0x33
    constant MTCHROM=0x55
    constant SKPROM=0xCC
    ;---------------------------------------------------------
    ; These constants are used throughout the code

    cblock 0x20
    IOBYTE
    TMP0 ; Address 0x23
    COUNT ; Keep track of bits
    PICMSB ; Store the MSB
    PICLSB ; Store the LSB
    PDBYTE ; Presence Detect Pulse
    endc
    ;---------------------------------------------------------
    ; Setup your configuration word by using __config.

    ; For the 16F628, the bits are:
    ; CP1,CP0,CP1,CP0,N/A, CPD, LVP, BODEN, MCLRE, FOSC2, PWRTE, WDTE, FOSC1, FOSC0
    ; CP1 and CP0 are the Code Protection bits
    ; CPD: is the Data Code Protection Bit
    ; LVP is the Low Voltage Programming Enable bit
    ; PWRTE is the power-up Timer enable bit
    ; WDTE is the Watchdog timer enable bit
    ; FOSC2, FOSC1 and FOSC0 are the oscillator selection bits.

    ; CP disabled, LVP disabled, BOD disabled, MCLR enabled, PWRT disabled, WDT disabled, INTRC I/O oscillator
    ; 11111100111000

    __config 0x3F38
    ;---------------------------------------------------------
    ; Set the program origin for subsequent code.

    org 0x00
    GOTO SETUP
    NOP
    NOP
    NOP
    GOTO INTERRUPT ; PC 0x04...INTERRUPT VECTOR!
    ;---------------------------------------------------------
    INTERRUPT:
    SLEEP
    ;---------------------------------------------------------
    ; Option Register bits
    ; ____
    ; RBPU,INTEDG,TOCS,TOSE,PSA,PS2,PS1,PS0
    ; 7=PORTB Pullup Enable, 6=Interrupt Edge Select, 5=TMR0 Source,
    ; 4=TMR0 Source Edge, 3=Prescaler Assign, 2-0=Prescaler Rate Select

    ; 11010111
    ; PORTB pullups disabled,rising edge,internal,hightolow,TMR0,1:256

    SETUP:
    BCF STATUS,RP1
    BSF STATUS,RP0 ; Select Bank 1 of data memory
    MOVLW 0xD7
    MOVWF OPTION_REG
    BCF STATUS,RP0 ; Select Bank 0 of data memory
    ;---------------------------------------------------------

    BCF INTCON,7 ; Disable all interrupts.

    ;---------------------------------------------------------
    GOTO START
    ;---------------------------------------------------------
    ; Include the 1-Wire communication routines and macros

    #INCLUDE 1w_16f6x.inc
    ;---------------------------------------------------------
    START:
    ;---------------------------------------------------------
    GET_TEMP:
    CALL OW_RESET ; Send Reset Pulse and read for Presence Detect Pulse
    BTFSS PDBYTE,0 ; 1 = Presence Detect Detected
    GOTO NOPDPULSE
    MOVLW SKPROM
    CALL DSTXBYTE ; Send Skip ROM Command (0xCC)
    MOVLW 0x69
    CALL DSTXBYTE ; Send Read Data Command (0x69)
    MOVLW 0x0E
    CALL DSTXBYTE ; Send the DS2761 Current Register MSB address (0x0E)
    CALL DSRXBYTE ; Read the DS2761 Current Register MSB
    MOVF IOBYTE,W
    MOVWF PICMSB ; Put the Current MSB into file PICMSB
    CALL DSRXBYTE ; Read the DS2761 Current Register LSB
    MOVF IOBYTE,W
    MOVWF PICLSB ; Put the Current LSB into file PICLSB
    CALL OW_RESET

    NOPDPULSE: ; Add some error processing here!
    SLEEP ; Put PIC to sleep
    ;---------------------------------------------------------
    end

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.06.2004
    Ort
    HDN
    Alter
    43
    Beiträge
    102
    erledigt und läuf in 24h ohne hardware geproggt!!!

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests