; 07/01/2011 petit bug ; … la mise sous tension stockage directe en eeprom evry 10 secondes ; attention pour redemarrer une serie de stockage criture et enlever la

ause ; 21/03/2010 bug 2 fois le message date & time au debut de mise en page eeprom dont 1 alt‚r‚ ; consommation (avec RS232 active) ~13mA alim 6.5V ;Language tool versions: MPASMWIN.exe v5.34, mplink.exe v4.34 ;Sun Mar 21 11:29:04 2010 ;Clean: Deleting intermediary and output files. ;Clean: Deleted file "C:\Mplab8\_Mesprojets\_Datalogger\datalog_16F628_2010.o". ;.. Clean: Done. ;Executing: "C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F628 "datalog_16F628_2010.ASM"; ; /l"datalog_16F628_2010.lst" /e"datalog_16F628_2010.err" /x"datalog_16F628_2010.xrf" /aINHX8M ;Executing: "C:\Program Files\Microchip\MPASM Suite\mplink.exe" /p16F628 /l"C:\Mplab8\MPASM Suite"/k" ;C:\Mplab8\MPASM Suite" "datalog_16F628_2010.o" /z__MPLAB_BUILD=1 /m" ;C:\MPLAB8\_Mesprojets\datalog_16F628_2010.map" /w /aINHX8M /o" ;C:\MPLAB8\_Mesprojets\datalog_16F628_2010.cof" /x ;MPLINK 4.34, Linker ;Copyright (c) 2009 Microchip Technology Inc. ;Errors : 0 ;Loaded C:\MPLAB8\_Mesprojets\datalog_16F628_2010.cof. ;Release build of project `C:\Mplab8\_Mesprojets\_Datalogger\Datalogger_16F628.mcp' succeeded. ;Language tool versions: MPASMWIN.exe v5.34, mplink.exe v4.34 ;Sun Mar 21 11:29:08 2010 ;BUILD SUCCEEDED ;========================================= ;14/03/10 debug valeur temperature negative DS1624... teste OK avec FREEZER FRIGO ; bug = 04/03/10 23H22M06S Temp= 55,512 DegC !!! ;----------------------- ;05/12/2008 remplacement 2.7K par 5,6K sur led 1hz pour diminuer conso moyenne ;Accu 6V= 5.80V apres 3 jours ;alim 5V= 5.02V I=13.8mA avec LM335DZ connecté et liaison serie connectée ; to do ; passage en mode sleep pour reduction de la consommation si interval > 10" ;----------------------- ; usage d'une reference 4.096V pour l' AD7896 (impedance d'entree > 1Mohm!) ; rev 5 nov 06 : Datalog6.asm ; en attendant le remplacement de l'ADC ou alim 4,.096V ; rajout d'un pont diviseur resitif 1Mohms serie avec 2x820K en // sur entree pour diviseur par 2 ; => recalibrage en 0-10V pour 4096 pts ; supprimer la tempo inter page en lecture eeprom ;------------------------ ; test montage avec Circuit imprime OK ; Ualim Ureg (sortie regulateur LE50CV) ; 4.98V 4.93 ..OK ; 5.18 5.03 ..OK ; 5.31 5.05 ..OK ; 6.00 5.05 ..OK ; 9.00 5.05 ..OK ;consommation totale < 7mA (dont potar 10K 0.5mA + led &vec 2,7K 1hz ) ;Test avec alim pile 9V usagée U depart 8,88V ; start mesure 07/08/06 23H03M23S.. ; 48H apres 7,35V ; stop mesure 10/08/06 23H49M23S soit 3 jours ou 72H00 ; 3340 pts pour 5,05V en entree ADC , alimenté en 5,05V ;------------------------- ; rev 08 aout 2006 : Datalog6.asm ; suite creation circuit imprime et reorganisation E/S : ; croisement I2C : RA7= SDA et RA6=SCL, changement sortie RS232 sur RB1 , ; PB: plus de conversion ADC ; bug trouve dans SP NACK , "bsf PORTA,SDA" au lieu de bsf PORTB,SDA ; attention si RS232 croise (2-3) le circuit DS275 se renvoi l'echo tout seul !!! ;---------------------------------- ;rev 30 juil 06 datalog5.asm … la mise sous tension ou reset, Intervval=10sec et mise en MEM d'office! ;rev 28 juillet datalog4 : rajout test drapeau:5 pour saisie 2 car => binaire ou BCD ;car nouveau bug constate suite correctif du 6 juillet ;la valeur interval est en binaire sur 1 octet provenant de la saisie BCD de 2 caracteres 00 a 99 ;il faut donc convertir le byte format BCD en binaire> MSB *10 + LSB ;alors que la saisie 2 car BCD pour mise à l'heure doit rester en BCD , donc un simple declage de quartet ;rev juillet 06 Datalog3 correction bug saisie interval ;Datalog2 Globalement OK mais bug dans Modifie_IntervalSec..a suivre ;test datalog1 ..OK ;---------- ;Clean: Deleting intermediary and output files. ;Clean: Deleted file "C:\MPLAB722\_Datalogger\datalog5.err". ;Clean: Deleted file "C:\MPLAB722\_Datalogger\datalog5.cod". ;Clean: Deleted file "C:\MPLAB722\_Datalogger\datalog5.hex". ;Clean: Deleted file "C:\MPLAB722\_Datalogger\datalog5.lst". ;Clean: Deleted file "C:\MPLAB722\_Datalogger\datalog5.xrf". ;Clean: Done. ;Executing: "C:\MPLAB722\MPASM Suite\MPASMWIN.EXE" /q /p16F628 ;"datalog5.asm"/l"C:\MPLAB722\_DATAL~1\datalog5.lst" ;/e"C:\MPLAB722\_DATAL~1\datalog5.err" /x"C:\MPLAB722\_DATAL~1\datalog5.xrf" /aINHX8M ;Loaded C:\MPLAB722\_Datalogger\datalog5.COD. ;BUILD SUCCEEDED: Mon Aug 07 20:02:36 2006 ;--------------------------------------------- ;rev 21 mai rajout sauvegarde Mesure Ana (AD7896) dans EEPROM ;soit horodatage sur 4 octets + 15x2 mesures 16 bits -> 1 bloc de 64 octets ;rev 20 mai ..oubli config entree tor port A!!! ;voir ds16x_24.asm ; corrige un bug dans Modifie_IntervalSec ;mars 2006 c:\mplab722\DS1307\DS16xx_23.asm ;avec Quartz 6Mhz au lieu de 4Mhz pour 9600 bauds ;rajout ADC 12 bits AD7896 pour mesure distante Temp exterieure en mode simili SPI ;-------------------- ;19 fev 06 DS16xx_22.asm ; consommation interface < a 3mA avec uniquement une Led sur sortie 1Hz (avec ou sans liaison RS232) ; rajout saisie Interval_Seconde en decimal 00 a 99 puis transf en Binaire ;----------------- ; hardware : usage du DS275 en DIP8(seul)au lieu du Max232 DIP16 (avec4condos) ;10 fev 2006 DS16xx_21.asm ... version testee OK ;rajout gestion timer0, interrupt par signal 1Hz du DS1307 ; pour reglage timming acquisition (initialisee a 2 => 3sec ; 512*30=15360 mesures => 12.5Heures ; si IntervalSec=99 => plus de 15 jours ;Program Memory Words Used: 1499 ;Program Memory Words Free: 549 ;EEprom 16F628 Used:127 Free : 1 ; RAM bank0 used :48 ; RAM bank1 used : 64 ;common RAM banks 0,1 used :16 ;---------------------------------------------------------- ;Version OK...9 fev 2006 ds16x_20.asm fonctionne Ok avec EEprom 24LC256 ;Building DS16X_16.HEX... ;Compiling DS16X_16.ASM: ;Command line: "C:\MPLAB\MPASMWIN.EXE /e+ /l+ /x- /c+ /p16F628 /q C:\MPLAB\DS1307\DS16X_16.ASM" ;Build completed successfully. ; 11 janv 06 ..bug manipulation FSR en bank1 pour adresser A0h ; 09 janv 06 ..bug sur adresse device! attention au decalage a gauche ; version 16 du 28/12/05 corrections de bug, rajout Help menu... ; version ds16x_15.asm pour gestion MENU / clavier, gestion EEPROM ecr / lect ; et mise a l'heure sens Incremental ; version ds16x_14 .. OK avec saisie reverse Mise a l'heure! sens decremental ;14 dec 05 rajout dialogue ASCII RS232 pour mise a l"heure ;04 dec : rajout mise a l'heure par RS232 si RB1=0 ;02 dec 05 ACK apres lecture registre DS1307, NACK apres ecriture sur DS1307 ;28 nov 05... ;26 sept 05... ;version 1624_5.asm ecriture en eeprom 24C256 ;version 1624_4.asm 25 sept 05 ;rajout stockage 32 mots bank1 ;-------------------------------------------------------------- ;19 sept 2005 1624_3.asm rajout DS1307 RTC ;-------------------------------------------------------------- ;16 sept 05 passage au PIC16F628 ; attention decalage debut RAM et mode lecture EEPROM PIC ; car pas assez de memoire programme et RAM pour rajouter EEPROM 24LC256 ;---------------------------------------------------------------- ;1624_2.asm avec PIC16F84 circuit avec resolution 13 bits! ; mise a l'echelle partie decimale! step mini lsb=8 soit 0,03125 degC ;Version 0.0 avec PIC16F84 05 sept 05 rev DS1621_6.asm ;-----------HARDWARE ---------------------------------------- ;------- note I2C --------------------------------------------------------------------------- ; L'adresse de l'esclave est determinee par A2 (pin 5), A1 (pin 6) et A0 (pin 7) sur le DS1624 ; Le bus SCL et SDA peut gerer jusqu'a 8 composants, chacun etant repere par son ; unique adresse definie par A2 A1 A0 relie au +5V par des R de rappel de 4,7K ;---- Maitre I2C ----------- 3 esclaves sur le bus I2C -------------- ; PIC16F628 DS1624 24LC256 DS1307 ; RB7 (pin 13) --- output-->SDA (pin 1) -- SDA (pin 5)----- SDA (pin 5)----- I2C Devices..2.7K pullup ; RB6 (pin 12) <--in/out---> SCL (pin 2) -- SCL (pin 6)----- SCL (pin 6)---To Other ....2.7K pullup ;------- ; RB5 (pin 11) ----> output ----led--R--+5V ; RB4 (pin 10) ----> output ----led--R--+5V ; RB3 (pin 9) ----> output ---- not used ; RB2 (pin 8) <-+--- Input ----- pas de strap= 1 = Normal ; |---(Mettre entree a 0 pour 1ere Mise sous Tension INIT RTC) ;------ interface RS232 --------- ; RB1 (pin 7) ----> Output -- Pin 3 DS275 7 >---Rx RS232 pin2 DB9F ; RB0 (pin 6) <---- Input -- Pin 1 DS275 5 <-- Tx RS232 pin3 DB9F ;----- info horloge RTC DS1307 ---- ; RA4 (pin 3)<--+- input - info 1HZ du DS1307 (comptage Timer0) ; |--DS1307 Pin7 ----Led + 6.2K ---+5V led sur sortie 1Hz DS1307 ;------ ADC 12 bits ------------------------------------ ; RA3 (pin 2) output libre ; RA2 (pin 1 ) ----> output --> ---SCLK -- (pin 4 )AD7689 ; RA1 (pin 18) <---- Input ---< ---DATA -- (pin 5 )AD7689 ; RA0 (pin 17) ----> output --> ---CS ---- (pin 7 )AD7689 ; Busy (pin 8 )AD7689 ; Vin (pin 1 )AD7689 ; VDD (pin 2 )AD7689 ; Gnd (pin 3-6)AD7689 LIST p=16f628 #include <..\common\p16f628_.inc> ; Attention dialogue en BANK 1 pour EEPROM 16F628 different du 16F84! ; attention Config differente de 16F84 !! ; attention debut Zone RAM differente de 16F84 ; b13 12 | 11 10 09 08 | 07 06 05 04 | 03 02 01 00 ; 1 1 | 1 1 1 0 | 0 0 1 0 | 0 0 0 1 ;__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & ;_EXTCLK_OSC & _XT_OSC __CONFIG 0x3F21 ERRORLEVEL -302 CONSTANT SDA=7 ; PORTB CONSTANT SCL=6 ; PORTB CONSTANT DATA_BUFF=0xA0 ; measurements saved to bank1 ! CONSTANT BUFF_SIZE=.64 ; number of measurements CONSTANT DI= 7 ; bit a entrer dans la DS_EEPROM CONSTANT DO= 6 ; bit a sortir de la DS_EEPROM CONSTANT TABUL =.9 ; caractere ascii tabulation ;#define Tracage Buffer_MAJ equ 0x20 cblock 0x20 SEC MIN HEURE JourSem Jour Mois Annee CtrlReg dummy2 DEV_DS1307 ; adresse DS1307 RTC DEV_1621 ; Adresse DS1621 mesure T° DEV_1624 ; Adresse DS1624 mesure T° DEV_24LC256 ; Adresse EEPROM 24LC256 32K ADDR DATA_2_OUT bdixmil bmille bcent bdix bun btmp Conf STR_INDEX _N _N0 _N1 O_BYTE I_BYTE LOOP1 LOOP2 _TEMP1 _TEMP2 _SAVE_W _SAVE_STAT _DELAY_RS _RsByte _RsCount _count1 _Cpt1 _Cpt2 _LOOP1 _LOOP2 Drapeau Status_Temp w_temp _tmpB BitsTaches ; 0 MajRTC 1= 1=Maj RTC ; 1 Pause 2= 1= Pause stockage en EEPROM, sinon stockage ; 2 Re_Lecture en EEPROM 4= 1= Relecture en EEPROM ; 3 EEPROM Full 8= 0=OK 1=Memoire Pleine EEPROM ; 4 Start Ecriture / Eprom 16= 1=Ecriture en EEPROM ; 5 Affiche Heure reactu 32= M/A Affichage Heure Now ; 6 Affiche Temperature 64= M/A Affichage temperature ; 7 Affiche Analog 128=M/A Affichage Analogue IntervalSec ;nb de secondes entre mesures spares :2 LastRambank0 endc RamUtilisee EQU (LastRambank0-0x20) IF ( (LastRambank0) > 0x70 ) ERROR "Attention debordement zone RAM" ENDIF ;Drapeau:7= signe mesure temp 1=negatif 0=positif pour DS1624 ;Drapeau:6= Elligibilite de stockage mesure ;Drapeau:5 =test si saisie binaire ou BCD ;Drapeau:4= choix format 1=999 0=65535 pour bcd53 (5 ou 3 digits) ;Drapeau:3= choix format 1=XX 0=XXX pour bcd3 ;Drapeau:2= choix output 1=Rs232 0=LCD ;Drapeau:1= choix format 1=XXXX.X 0=XXXXX pour bcd5 ;Drapeau:0= pour effacer zero inutile ;****************************************************** ; VARIABLES ZONE COMMUNE inter bank 0,1,2 ;****************************************************** ; Zone de 16 bytes cblock 0x70 val1:2 val2:2 valx:2 TC_HI TC_LO Ana_Hi Ana_Lo Serie:2 ADR_HI ADR_LO endc ;********************************* ; VARIABLES BANQUE 1 * ;********************************* ; Zone de 80 bytes ; ---------------- cblock 0xA0 ; Debut de la zone (0xA0 ..0xEF) ; variables buffer eprom Buffer_EE : 64 endc ;****************************************** ; VARIABLES BANQUE 2 120H ..14FH * ;****************************************** ; Zone de 48 bytes ; ---------------- cblock 0x120 ShiftRegister : 32 mot1:2 mot2:2 PointerS Nshift N2 Moy16 :2 Total :3 endc ;********************* #define OSC_FREQ 6000000 #define Rs_Port PORTB #define Rs_Rx 0 ; serial RS232 input #define Rs_Tx 1 ; serial RS232 output #define inp_MAJ_RTC PORTB,2 #define Led_Rouge PORTB,5 #define Led_Jaune PORTB,4 #define ELLIGIBLE Drapeau,6 ;----------------------------- busy equ 3 ;BUSY status clk equ 2 ; clock ----> output --> ---SCLK -- (pin 4 )AD7689 dataq equ 1 ;DATA line <---- Input ---< ---DATA -- (pin 5 )AD7689 cs equ 0 ;Conversion start output --> ---CS ---- (pin 7 )AD7689 #define Adc_CS PORTA,cs ;output to 7 Adc7896 Conv Start #define Adc_CLOCK PORTA,clk ;output to 4 Adc7896 clock line #define Adc_DATA PORTA,dataq ;input to 5 Adc7896 Output Data line #define Adc_Busy PORTA,busy ;input to 8 Adc7696 busy line ;#define KELVIN 2730 + 0 ; 273øK*10mv =2730 + ajustage offset 0øC ORG 000H goto Configuration ;================================================================ ; Interruptions sur Entree caractere ou Nb de secondes ecoulees ;================================================================ Org 0004H bank0 bcf INTCON,GIE ;interdit all interrupt UTILITe ????? movwf w_temp ;On sauve le registre W est le registre STATUS swapf STATUS,w ;Dans les variables W_TEMP et Status_Temp movwf Status_Temp ; interrupt sur RB0 ? receive RS232 btfss INTCON,INTF goto timer_int bcf INTCON,INTE ; raz autorise int RB0 call Read_RS ; lecture caractere bcf INTCON,INTF ; raz drapeau bsf ELLIGIBLE ; rajoute 28 /07/06 pour sortir boucle attente si car recu goto Fin_it timer_int btfsc INTCON,T0IE ; tester si interrupt timer autorisee btfss INTCON,T0IF ; oui, tester si Flag interrupt arme goto Fin_it ; non test suivant bsf ELLIGIBLE ; arme drapeau,6 => ok pour mesure movf IntervalSec,w ; re-init timer0 movwf TMR0 comf TMR0,f ; complement a 1! 9 => 255-9=246 => 328æS bcf INTCON,T0IF ; Fin_it bank0 swapf Status_Temp,W ;Restaure les valeurs originales des registres movwf STATUS ;W et STATUS swapf w_temp,F swapf w_temp,W retfie ;------------------------------------------- TABLE_ST Msg1_lookup ADDWF PCL, F DT "Temp= ", 0 Msg2_lookup ADDWF PCL, F DT "RAZ @ MEM",.13,.10,0 Msg3_lookup ADDWF PCL, F DT "M/Aemper",.13,.10 DT "M/A

ause MEM",.13,.10 DT "M/Aate/Heure",.13,.10 DT "M/Analog",.13,.10 DT "nterv.Sec",.13,.10 DT "crit.MEM",.13,.10 DT "AJ Heure",.13,.10 DT "ect.MEM",.13,.10 DT "Abort",.13,.10 DT "az Adr.MEM",.13,.10 DT "elp",.13,.10,0 Msg4_lookup ADDWF PCL, F DT ".STOP MEMO.",.13,.10,0 Msg5_lookup ADDWF PCL, F DT .13,.10," Abort",.13,.10,0 HexTable ADDWF PCL, F DT "0123456789ABCDEF",0 Adr_Now equ $ IF ( (Adr_Now) > 0x100 ) ERROR "Attention debordement Page 0" ENDIF ;------------------------------------------- org 0x100 Configuration bank0 clrf INTCON ;no interrupts clrf T1CON clrf PORTA movlw 0x07 ; attention config pour entree TOR et non ANA sur PIC16F628 movwf CMCON bank1 MOVLW B'00000101' ;outputs RB7,6,5,4,3,1 inputs =RB2,RB0 MOVWF TRISB MOVLW B'00010010' ; outputs:RA0,RA2,RA3 inputs: RA4,RA1 MOVWF TRISA clrf PIE1 ; disables all interrupts clrf OPTION_REG bsf OPTION_REG,7 ;=1 disable pull_up bcf OPTION_REG,6 ;INTEDG =0 int sur front descendant RB0 reli‚ … info 1HZ du DS1307 bsf OPTION_REG,5 ;T0CS =1 transition RA4 -> clock du timer bcf OPTION_REG,4 ;T0SE =0 incr sur front montant RA4 bsf OPTION_REG,3 ;PSA =1 -> WDT ( pas de prescaler pour TMR0) bcf OPTION_REG,2 ;PS2 =0 valeur prescaler bcf OPTION_REG,1 ;PS1 =0 valeur prescaler bcf OPTION_REG,0 ;PS0 =0 valeur prescaler bank0 ;initialisations Bcf Rs_Port,Rs_Tx ; niveau logique 0 movlw 0x02 <<1 ; A2=0 A1=1 A0=0 = adresse hardware x2 movwf DEV_24LC256 MOVLW 0x01 <<1 ; A2=0 A1=0 A0=1 = adresse hardware x2 MOVWF DEV_1624 clrf _RsByte clrf Drapeau clrf BitsTaches clrf Serie clrf Serie+1 clrf ADR_LO clrf ADR_HI clrf _Cpt1 movlw 9 ; valeur initialisee a 10 secondes (comptage de 0 … 9 =10 fronts 1Hz) movwf IntervalSec ; movwf TMR0 ;0x02 comf TMR0,f ;0xFD ;Presentation CALL Rs_CrLf Pres1 clrf _Cpt1 movf _Cpt1,w call Msg_Eeprom Pres2 CALL Rs_CrLf movlw EE1-EE0 MOVWF _Cpt1 call Msg_Eeprom Pres3 movlw "-" call Choix_Out movlw EE9-EE0 MOVWF _Cpt1 call Msg_Eeprom Pres4 CALL Rs_CrLf movlw EE2-EE0 MOVWF _Cpt1 call Msg_Eeprom CALL Rs_CrLf DEBUT ; si entree bit 2 portB = 0=> init RTC DS1307 avec valeurs par defaut ;sinon conserve la date et heure (sauvegardee par pile lithium!) bcf Led_Rouge bcf Led_Jaune btfsc inp_MAJ_RTC goto MAIN0 MOVLW 0x00 ;00 S MOVWF SEC movlW 0X30 ;30 M movWF MIN MOVLW 0x20 ; 20 H MOVWF HEURE MOVLW 0x05 ;day 02 MOVWF JourSem MOVLW 0x08 ;date 08 MOVWF Jour MOVLW 0x01 ;Mois 01 MOVWF Mois MOVLW 0x09 ; ANNEE=09 MOVWF Annee MOVLW B'10010000' ;Registre de controle SQWE=1 RS0=RS1=0 sortie 1Hz MOVWF CtrlReg call Init_RTC ; la Led sur RTC DS1307 doit clignoter a 1HZ! MAIN0: call Rs_CrLf clrf _N clrf BitsTaches bcf Drapeau,5 bsf Drapeau,3 ; pour affichage restreint 000 a 999 bsf Drapeau,4 bsf Drapeau,0 CALL Rs_CrLf CALL CONFIG_1624 ; mode AC 02 CALL BEGIN_CNVT ;lancement conversion CALL DELAY_250mS call MEASURE ; car 1ere mesure erronee ??? CALL Rs_CrLf call Lecture_DS1307 call Affiche_Time CALL Rs_CrLf clrf _N bsf Led_Jaune bsf Led_Rouge goto Start_Write ; init ecriture en eeprom ;--------- Main_Boucle: call Lecture_DS1307 ;lecture heure btfss BitsTaches,5 ; afficher l'heure? goto MAIN10 call Affiche_Time movlw TABUL CALL Rs_Putchar MAIN10: CALL MEASURE ; Mesure Temperature btfss BitsTaches,6 ; afficher Temper? goto MAIN11 CALL Msg_Out_1 call Affiche_Mesure movlw TABUL CALL Rs_Putchar MAIN11 call Adc7896 ; mesure ANA btfss BitsTaches,7 ; afficher Analog? goto MAIN12 CALL Affiche_Valeur movlw TABUL CALL Rs_Putchar MAIN12 movlw B'11100000' ; insere CRLF que si on affiche une data andwf BitsTaches,w btfss STATUS,Z CALL Rs_CrLf MAIN2 clrf _RsByte bsf INTCON,INTE ;Autorise interrupt RB0 bsf INTCON,T0IE ;Autorise interrupt Timer0 bsf INTCON,GIE ; Autorise IT MAIN20 ; boucle d'attente fin d'intervalle. nop Btfss ELLIGIBLE goto MAIN20 bcf ELLIGIBLE bcf INTCON,INTE ;interdit interrupt RB0 bcf INTCON,T0IE bcf INTCON,GIE movlw 0xFF ; test zero andwf _RsByte,w btfsc STATUS,Z goto MAIN3 ; pas de caracteres dans RsByte ;routage et traitement caractere recu ;si car alpha en minuscule -> passe en majuscule call Rs_CrLf movlw 0x60 ; 96 subwf _RsByte,w btfss STATUS,C goto MAIN21 movlw 0x20 ;32 subwf _RsByte,f MAIN21 movf _RsByte,W CALL Rs_Putchar ; echo car sur ecran CALL Rs_CrLf movlw 'M' ; MAJ horloge RTC xorwf _RsByte,W btfsc STATUS,Z goto MAJ_DS1307 movlw 'E' ; Ecriture Start Write EEPROM xorwf _RsByte,W btfsc STATUS,Z goto Start_Write movlw 'H' ; Help xorwf _RsByte,W btfsc STATUS,Z goto Affiche_Help movlw 'L' ; Lecture Read EEPROM -> RS232 xorwf _RsByte,W btfsc STATUS,Z goto Lecture_EE movlw 'R' ; reset adresse et stop stockage xorwf _RsByte,W btfsc STATUS,Z goto Reset_EE movlw 'I' ; modifie Interval secondes xorwf _RsByte,W btfsc STATUS,Z goto Modifie_IntervalSec movlw 'A' ; toggle M/A affiche Analog xorwf _RsByte,W btfsc STATUS,Z goto Toggle_Affiche_Analog movlw 'T' ; toggle M/A affiche Temperature xorwf _RsByte,W btfsc STATUS,Z goto Toggle_Affiche_Temper movlw 'P' ; Toggle Pause/continue stockage EEPROM xorwf _RsByte,W btfsc STATUS,Z goto Toggle_Pause_EE movlw 'S' ; Status xorwf _RsByte,W btfsc STATUS,Z goto Affiche_BitsTaches movlw .27 ; ESC=abort xorwf _RsByte,W btfsc STATUS,Z goto Abort_ movlw 'D' ; toggle M/A affiche Date et Heure xorwf _RsByte,W btfsc STATUS,Z goto Toggle_Affiche_Time goto Main_Boucle ; si inconnu Affiche_Help call Msg_Out_3 goto Main_Boucle Abort_ clrf BitsTaches call Msg_Out_5 ; rajout 20 mai 06 goto Main_Boucle ;*************************** Reset_EE bcf BitsTaches,3 ;Raz flag full eeprom bcf BitsTaches,1 ;Pause=0 bcf BitsTaches,4 ;Full=0 call Msg_Out_2 goto Start_Write1 ;---------------------------- Toggle_Pause_EE CALL Rs_CrLf movlw 1<<1 ; bit 1 => poids=2 xorwf BitsTaches,f ; btfsc BitsTaches,1 goto Toggle_P_On movlw EE3-EE0 ; Pause ,arrete stockage MOVWF _Cpt1 goto Toggle_P1 Toggle_P_On movlw EE5-EE0 ; continue stockage MOVWF _Cpt1 Toggle_P1 call Msg_Eeprom movlw TABUL call Choix_Out movf ADR_HI,w movwf val1 movf ADR_LO,w movwf val1+1 call bcd53 CALL Rs_CrLf goto Main_Boucle ;-------------- Toggle_Affiche_Time movlw 1<<5 xorwf BitsTaches,f ; inverse bit 5 goto Main_Boucle ;--------------- Toggle_Affiche_Temper movlw 1<<6 xorwf BitsTaches,f ; inverse bit 6 goto Main_Boucle ;----------------- Toggle_Affiche_Analog movlw 1<<7 xorwf BitsTaches,f ; inverse bit 7 goto Main_Boucle ;----------------- Modifie_IntervalSec movlw EE8-EE0 ; MOVWF _Cpt1 call Msg_Eeprom movf IntervalSec,w ;recatualise variable binaire sur 1 octet addlw 1 call bcd3 ; valeur en BCD 000 a 099 movlw "-" call Choix_Out movlw ">" call Choix_Out bsf Drapeau,5 movlw 1 ; W contient (N-1) cars a saisir call Saisie_Caracteres ; saisie de 2 caracteres alpha => 00 a 99 bcf Drapeau,5 movlw .27 ; ESC=abort xorwf _RsByte,W btfsc STATUS,Z goto Main_Boucle ;pour debug movlw TABUL call Choix_Out movf _RsByte,w addlw .255 movwf IntervalSec ;recatualise variable ;pour debug addlw 1 ; car comptage de 0 a X ! call bcd3 ; valeur en BCD 000 a 099 CALL Rs_CrLf goto Main_Boucle ;------------------- Affiche_BitsTaches movlw BitsTaches call Affiche_Hexa movlw 'h' call Choix_Out movlw TABUL call Choix_Out movlw BitsTaches call bcd3 CALL Rs_CrLf goto Main_Boucle ;------------------- Start_Write bcf BitsTaches,1 ; Raz Flag pause stockage 1= Etat Pause bsf BitsTaches,4 ; 1=Flag ecriture Start_Write1 bcf BitsTaches,3 ; raz Flag EEPROM PLEINE clrf _N ; pointeur buffer octet clrf Serie ; pointeur page 24LC256 clrf Serie+1 clrf ADR_LO ; adrese Eprom clrf ADR_HI goto Main_Boucle ;---------------------------------- MAIN3 clrf _RsByte btfsc BitsTaches,1 ; Pause stockage eeprom =1 ? goto Main_Boucle ; oui, en pause, donc on sort sur debut de boucle btfss BitsTaches,3 ; Flag Memoire pleine ? goto MAIN31 ; non , on saute … la suite ! ; on arrete le stockage bcf BitsTaches,1 ; Pause stockage eeprom bcf BitsTaches,4 ; Flag stockage eeprom CALL Rs_CrLf call Msg_Out_2 ; message STOP MEMO goto Main_Boucle ; stockage des datas MAIN31 ;stockage en RAM de l'horodatage et 2 valeurs 16 bits ; write entete page EEPROM si debut de page movf _N,w btfsc STATUS,Z call Horodatage movf _N,w addlw Buffer_EE ; 0xA0 bank1 movwf FSR movf TC_HI,W movwf INDF bank0 incf _N,f movf _N,w Addlw Buffer_EE; 0xA0 bank1 movwf FSR movf TC_LO,w movwf INDF bank0 incf _N,f movf _N,w Addlw Buffer_EE; 0xA0 bank1 movwf FSR movf Ana_Hi,w movwf INDF bank0 incf _N,f movf _N,w Addlw Buffer_EE; 0xA0 bank1 movwf FSR movf Ana_Lo,w movwf INDF bank0 incf _N,f btfss _N,6 ; modulo 64 octets ? goto Main_Boucle ;une page est prete a mettre en EEPROM bcf Led_Rouge ; allume led rouge clrf _N CALL Rs_CrLf movlw EE2-EE0 ; Memoire Write MOVWF _Cpt1 call Msg_Eeprom movlw TABUL ; TAB call Choix_Out bcf Drapeau,4 movf Serie,W movwf val1 movf Serie+1,W movwf val1+1 call bcd53 movlw TABUL ; TAB call Choix_Out movf ADR_HI,w movwf val1 movf ADR_LO,w movwf val1+1 call bcd53 CALL Rs_CrLf ;****************** call SEQ_WRITE ; ecriture page de 64 octets dans EEPROM 24LC256 ;***************** movlw .64 movwf val2+1 ; nb d'octets 64 clrf val2 movf val2,w ; addition 16 bits addwf ADR_HI,f movf val2+1,w addwf ADR_LO,f btfsc STATUS, C incf ADR_HI,f incf Serie+1,f btfsc STATUS,Z incf Serie,f movlw 2 andwf Serie,w btfss STATUS,Z ; 512 . bsf BitsTaches,3 ; drapeau EEPROM PLEINE bsf Led_Rouge ; eteint led rouge goto MAIN10 ; @21/3/2010 was Main_Boucle ;--------------------------- Lecture_EE clrf BitsTaches ;pas d'affichage Time ni Temper bsf BitsTaches,2 ; lecture eeprom clrf _N ; pointeur buffer octet clrf Serie ; pointeur page 24LC256 clrf Serie+1 clrf ADR_LO ; adresse EEprom clrf ADR_HI clrf _RsByte CALL Rs_CrLf movlw EE4-EE0 ; Memoire read MOVWF _Cpt1 call Msg_Eeprom ;---------------------------- MAIN4 bcf Led_Rouge CALL Rs_CrLf bcf Drapeau,4 movf Serie,W movwf val1 movf Serie+1,W movwf val1+1 call bcd53 ;affichage Num de serie de 00 ..until 512 max movlw .9 ; TAB call Choix_Out ;***************************** ;Lecture page de 64 octets dans EEPROM 24LC256 ;*************************** movf ADR_HI,w movwf val1 movf ADR_LO,w movwf val1+1 call bcd53 ; affichage adresse EEPROM 0000 ... 32768 par pas de 64 call SEQ_READ bsf Led_Rouge ;------------- ; affichage zone ram bank1 movf 0xA0,w bank0 movf SEC,w bank1 movf 0xA1,w bank0 movwf MIN bank1 movf 0xA2,w bank0 movwf HEURE clrf JourSem bank1 movf 0xA3,w ; attention stockage EEPROM du jour Day au lieu de jourSem bank0 movwf Jour movlw 4 ;init pointeur sur 1ere data movwf _N ; affiche horodatage recupere sans affecter le DS1307 CALL Rs_CrLf call Affiche_Time CALL Rs_CrLf Main43 ; affiche ensuite les (64-4)/4 =15 mesures movf _N,w addlw Buffer_EE; 0xA0 bank1 movwf FSR movf INDF,w movwf TC_HI bank0 incf _N,f movf _N,w addlw Buffer_EE; 0xA0 bank1 movwf FSR movf INDF,w bank0 movwf TC_LO call Affiche_Mesure movlw TABUL call Choix_Out incf _N,f movf _N,w addlw Buffer_EE; 0xA0 bank1 movwf FSR movf INDF,w movwf Ana_Hi bank0 incf _N,f movf _N,w addlw Buffer_EE; 0xA0 bank1 movwf FSR movf INDF,w bank0 movwf Ana_Lo call Affiche_Valeur CALL Rs_CrLf incf _N,f btfss _N,6 ; modulo 64 = fin de page goto Main43 ;next page movlw .64 movwf val2+1 ; nb d'octets 64 clrf val2 movf val2,w ; addition 16 bits addwf ADR_HI,f movf val2+1,w addwf ADR_LO,f btfsc STATUS, C incf ADR_HI,f incf Serie+1,f btfsc STATUS,Z incf Serie,f bsf INTCON,INTE ;Autorise interrupt RB0 bsf INTCON,GIE ; Autorise IT ;lecture caractere autorsiée pendant cette tempo MOVLW .250 ; 250*2.5=625mS MOVWF LOOP1 DELAY100: MOVLW .250 ; 2,5ms MOVWF _LOOP2 DELAY200: goto $+1 goto $+1 goto $+1 DECFSZ _LOOP2, F GOTO DELAY200 DECFSZ _LOOP1, F GOTO DELAY100 bcf INTCON,INTE ; Interdit interrupt RB0 bcf INTCON,GIE ; Interdit IT movlw .27 ; ESC=abort xorwf _RsByte,W btfsc STATUS,Z goto Fertig movlw 2 andwf Serie,w btfsc STATUS,Z ; < 512 pages ? goto MAIN4 bsf BitsTaches,3 ; drapeau EEPROM PLEINE Fertig call Msg_Out_4 movlw B'00101010' ;affiche date, drapeau FULL eeprom, PAUSE movlw .60 movwf IntervalSec ; 1 minute interval acq! clrf _N ; pointeur buffer octet clrf Serie ; pointeur page 24LC256 clrf Serie+1 clrf ADR_LO ; adresse EEprom clrf ADR_HI clrf _RsByte goto Main_Boucle ;------------------------------------- MAJ_DS1307 bsf BitsTaches,0 call Rs_CrLf movlw EE6-EE0 MOVWF _Cpt1 Actu1 movf _Cpt1,w CALL Read_EE incf _Cpt1,f ANDLW 0x0FF BTFSC STATUS,Z GOTO Actu2 call Choix_Out goto Actu1 Actu2 bcf Drapeau,5 movlw .13 ; 13 a 0 AAMMJJWWHHMMSS call Saisie_Caracteres ; W contient N-1 caracters a saisir ;Abort si caractere ESC=27 -> W=0 movlw .27 ; ESC=abort xorwf _RsByte,W btfsc STATUS,Z goto Abort_MAJ ; 14 car saisis 7 valeurs rangees call Init_RTC call Lecture_DS1307 clrf _RsByte call Rs_CrLf call Affiche_Time call Rs_CrLf goto Main_Boucle Abort_MAJ clrf BitsTaches bsf BitsTaches,5 ; affiche date goto Main_Boucle ;************************************************ ; sous programmes ;************************************************ Affiche_Valeur ; call Adc7896 bcf Drapeau,4 ; affichage 10000 movf Ana_Hi,W movwf val1 movf Ana_Lo,W movwf val1+1 ; bcf STATUS,C ; rlf val1+1,f ; btfsc STATUS,C ; report carry ? ; rlf val1,f call bcd53 movlw 'm' call Choix_Out movlw 'V' call Choix_Out return ;----------------- Adc7896 ; en mode 1 au repos CONVST=1 BUSY=0 SCLK=0 bcf Adc_CLOCK bcf Adc_CS ; track CONVST =0 nop nop nop bsf Adc_CS ; track CONVST =1 clrf Ana_Lo clrf Ana_Hi call I2C_DELAY ; TCONVERT= 8uS mini! call I2C_DELAY call I2C_DELAY call A_clk call A_clk call A_clk call A_clk ; 4 pulses Zero data movlw 4 movwf _Cpt2 bcf STATUS,C Adc1 call A_clk ; 4 x pulses MSB rlf Ana_Hi,f btfss Adc_DATA bcf Ana_Hi,0 btfsc Adc_DATA bsf Ana_Hi,0 Decfsz _Cpt2,f goto Adc1 ;---- movlw 8 movwf _Cpt2 bcf STATUS,C Adc2 call A_clk ;8 x pulses LSB rlf Ana_Lo,f btfss Adc_DATA bcf Ana_Lo,0 btfsc Adc_DATA bsf Ana_Lo,0 Decfsz _Cpt2,f goto Adc2 bcf Adc_CLOCK bsf Adc_CS return A_clk bcf Adc_CLOCK nop bsf Adc_CLOCK nop return ;----------------------- Saisie_Caracteres: ; 2 caracteres par octet => BCD format 00 a 99 ; preciser la longueur du buffer a remplir dans W <= N-1 caracteres ; Buffer_MAJ = buffer de stockage en page 0 movwf _N1 ; Index de rangement 2 car -> 1 emplacement bsf INTCON,GIE bcf INTCON,T0IE ; interdit interrupt timer0 Actualise clrf _RsByte bsf INTCON,INTE ;Autorise interrupt RB0 ;attente saisi caractere au clavier Actu3 movlw 0xFF andwf _RsByte,w btfsc STATUS,Z goto Actu3 bcf INTCON,INTE ;interdit interrupt RB0 movf _RsByte,W ;echo call Choix_Out movlw .27 ;esc (abandon) xorwf _RsByte,w btfss STATUS,Z goto Test_Back movlw .255 movwf _RsByte return Test_Back movlw .8 ;back space (<- correction) xorwf _RsByte,w btfss STATUS,Z goto Test_Tab movlw Buffer_MAJ subwf _N1,w btfsc STATUS,C ; negatif ? goto Actualise incf _N1,f ;incremente indice goto Actualise Test_Tab movlw .9 ;tabulation (-> correction) xorwf _RsByte,w btfss STATUS,Z goto Test_Num decf _N1,w btfsc STATUS,C ; negatif ? goto Test_Num decf _N1,f ;decremente indice goto Actualise Test_Num movlw '0' subwf _RsByte,w btfsc STATUS,C goto SUP_0 goto Actualise SUP_0 movlw '9' subwf _RsByte,w btfsS STATUS,C goto LESS_EQ_9 ; less <9 btfsC STATUS,Z goto LESS_EQ_9 ;or egal =9 goto Actualise LESS_EQ_9 btfsc _N1,0 ;test bit 0 du compteur goto HB goto LB HB MOVLW .48 subWF _RsByte,w movwf _tmpB ;=x1 bcf STATUS,C rlf _tmpB,f ;x2 rlf _tmpB,f ;x4 btfsc Drapeau,5 ; si drapeau:5=1 *10 , sinon *16 goto HB1 rlf _tmpB,f ;x2 rlf _tmpB,f ;x4 goto HB2 HB1 addwf _tmpB,w ;x5 movwf _tmpB rlf _tmpB,f ;x10 HB2 decf _N1,f goto Actualise LB MOVLW .48 subWF _RsByte,w AndLW 0x0F ; MSB + LSB addwf _tmpB,W movwf _RsByte Rangement bcf STATUS,C rrf _N1,W ; Index/2= deplacement en octet ADDLW Buffer_MAJ ; offset table movwf FSR movf _RsByte,w movwf INDF ; sauvegarde W -> @FSR() movf _N1,w btfsc STATUS,Z goto OK_Saisie decf _N1,f btfss STATUS,Z goto Actualise OK_Saisie movf _RsByte,w return ;-------------------------- ; sous programmes ;-------------------------- Horodatage: ; les 4 premiers octets de chaque serie de 64 contiendront ; l'horodatage DDHHMMSS suivit de 30 mesures 16 bits call Raz_buffer_RAM_bank1 clrf _N ; pointeur buffer octet call Lecture_DS1307 call Affiche_Time CALL Rs_CrLf ; Lecture Heure et write entete page sur debut de page ; Horodatage movf SEC,w bank1 movwf 0xA0 bank0 movf MIN,w bank1 movwf 0xA1 bank0 movf HEURE,w bank1 movwf 0xA2 bank0 movf Jour,w ; attention ce n'est pas JourSem! bank1 movwf 0xA3 bank0 movlw 4 ;init pointeur sur 1ere data movwf _N return ;*************************** Raz_buffer_RAM_bank1 MOVLW DATA_BUFF ; clear the data buffer just to be sure MOVWF FSR ; the following seq read works MOVLW BUFF_SIZE MOVWF _N CLR: bank1 CLRF INDF ; clear each location in the data buffer INCF FSR, F bank0 DECFSZ _N, F GOTO CLR return ;---------------------- Affiche_Mesure: btfss Drapeau,7 goto PosTemp movlw '-' call Choix_Out goto NegTemp PosTemp movlw ' ' call Choix_Out NegTemp movf TC_HI,w call bcd3 movlw ',' ; "," au lieu du "." pour excel Francais call Choix_Out movf TC_LO,w movwf val1+1 bcf STATUS,C clrf val1 rlf val1+1,f ; LSB * 4 rlf val1,f bcf STATUS,C rlf val1+1,f rlf val1,f ; val1 16 bits contient LSB *4 bsf Drapeau,4 call bcd53 btfsc BitsTaches,2 ; lecture 24LC256 sans suffixe DEG return movlw ' ' call Choix_Out movlw 'D' call Choix_Out movlw 'e' call Choix_Out movlw 'g' call Choix_Out movlw 'C' call Choix_Out return CONFIG_1624: ; configures device for CPU operation - continuous CALL START BCF STATUS, C Movf DEV_1624,W IORLW 90H CALL OUT_BYTE CALL NACK MOVLW 0ACH ; send config information CALL OUT_BYTE CALL NACK MOVLW 02H CALL OUT_BYTE CALL NACK CALL STOP CALL DELAY_10mS RETURN BEGIN_CNVT: ; turns on circuitry to begin conversions CALL START BCF STATUS, C Movf DEV_1624,W IORLW 90H CALL OUT_BYTE CALL NACK MOVLW 0EEH CALL OUT_BYTE CALL NACK CALL STOP CALL DELAY_10mS RETURN MEASURE: ; bug : avec temperature negative bcf Drapeau,7 ; flag temp positive CALL START BCF STATUS, C Movf DEV_1624,W IORLW 90H CALL OUT_BYTE CALL NACK MOVLW 0AAH CALL OUT_BYTE CALL NACK CALL START BCF STATUS, C Movf DEV_1624,W ; bit R/W doit etre a 1 pour lecture IORLW 91H ; soit 90H + 02H +1= 93H CALL OUT_BYTE CALL NACK CALL IN_BYTE ; lecture MSB MOVF I_BYTE, W MOVWF TC_HI ; sauve dans TC_HI ; call Affiche_Hexa CALL ACK CALL IN_BYTE ; lecture LSB MOVF I_BYTE, W MOVWF TC_LO ; sauve dans TC_LO ; call Affiche_Hexa CALL NACK CALL STOP call Negate ; traitement si negatif RETURN Negate btfss TC_HI,7 return ; positive bsf Drapeau,7 ; flag temp negative movf TC_HI,w sublw .255 movwf TC_HI RETURN FETCH_CONFIG: ; lecture configuration / STATUS register ; resultat dans in i_byte CALL START BCF STATUS, C Movf DEV_1624,W IORLW 90H CALL OUT_BYTE CALL NACK MOVLW 0ACH ; AC command CALL OUT_BYTE CALL NACK CALL START BCF STATUS, C Movf DEV_1624,W IORLW 90H IORLW 01H ; lecture! CALL OUT_BYTE CALL NACK CALL IN_BYTE MOVF I_BYTE, W movwf Conf CALL STOP RETURN ;--------------------------- Msg_Out_1: CLRF STR_INDEX Msg_Out_11: MOVF STR_INDEX, W CALL Msg1_lookup ; fetch the character ADDLW 0 ; be sure zero flag is valid BTFSC STATUS, Z GOTO Msg_Out_12 ; done if null CALL Choix_Out INCF STR_INDEX, F GOTO Msg_Out_11 ; keep going Msg_Out_12: RETURN ;------------- Msg_Out_2: CLRF STR_INDEX Msg_Out_21: MOVF STR_INDEX, W CALL Msg2_lookup ADDLW 0 BTFSC STATUS, Z GOTO Msg_Out_22 CALL Choix_Out INCF STR_INDEX, F GOTO Msg_Out_21 Msg_Out_22: RETURN ;----------------- Msg_Out_3: CLRF STR_INDEX Msg_Out_31: MOVF STR_INDEX, W CALL Msg3_lookup ADDLW 0 BTFSC STATUS, Z GOTO Msg_Out_32 CALL Choix_Out INCF STR_INDEX, F GOTO Msg_Out_31 Msg_Out_32: RETURN ;----------------- Msg_Out_4: CLRF STR_INDEX Msg_Out_41: MOVF STR_INDEX, W CALL Msg4_lookup ADDLW 0 BTFSC STATUS, Z GOTO Msg_Out_42 CALL Choix_Out INCF STR_INDEX, F GOTO Msg_Out_41 Msg_Out_42: RETURN ;----------------- Msg_Out_5: CLRF STR_INDEX Msg_Out_51: MOVF STR_INDEX, W CALL Msg5_lookup ADDLW 0 BTFSC STATUS, Z GOTO Msg_Out_52 CALL Choix_Out INCF STR_INDEX, F GOTO Msg_Out_51 Msg_Out_52: RETURN ;----------------------- SEQ_WRITE: CALL START movf DEV_24LC256,w IORLW 0A0H CALL OUT_BYTE ;envoi adresse device CALL ACK MOVF ADR_HI, W CALL OUT_BYTE ;envoi MSB de l'adresse CALL ACK MOVF ADR_LO, W CALL OUT_BYTE ;envoi LSB de l'adresse CALL ACK MOVLW .64 MOVWF _N ;Initialise Compteur _N MOVLW DATA_BUFF bank1 MOVWF FSR ;Initialise Pointeur zone eeprom SEQ_WRITE_1: bank1 MOVF INDF, W ; fetch the data byte from the buffer bank0 CALL OUT_BYTE CALL ACK CALL DELAY_10mS ; 10mS bank1 INCF FSR, F bank0 DECFSZ _N, F GOTO SEQ_WRITE_1 CALL STOP CALL DELAY_10mS ; 10mS RETURN ;--------------------------- SEQ_READ: CALL START movf DEV_24LC256,w IORLW 0A0H ; bit R/W a 0 pour ECRITURE CALL OUT_BYTE ; envoi adresse device CALL ACK MOVF ADR_HI, W CALL OUT_BYTE ;envoi adresse MSB CALL ACK MOVF ADR_LO, W CALL OUT_BYTE ;envoi adresse LSB CALL ACK CALL START ;64 Data lues en EEPROM a partir de ADR_HI & ADR_LO stockees dans ;zone RAM a partir de adresse pointee par DATA_BUFF (en bank1) movf DEV_24LC256,w IORLW 0A1H ; bit R/W a 1 pour LECTURE CALL OUT_BYTE ;init LECTURE CALL ACK MOVLW DATA_BUFF bank1 MOVWF FSR ;init pointeur debut zone RAM en bank1 bank0 clrf _N ;Lecture sequentielle de l'EEPROM avec auto-increment adresse EEPROM SEQ_READ_1: CALL IN_BYTE ; Lecture data en sequence MOVF I_BYTE, W bank1 MOVWF INDF ; sauve data en Ram INCF FSR, F bank0 incf _N, F ; compteur de byte btfss _N,6 ; bit a 0 de 0 a 63 GOTO SEQ_READ_2 ; pas fini GOTO SEQ_READ_3 ; fini,une page de 64 data ont ete lues SEQ_READ_2: CALL ACK ; pas fini,donc envoi un ACK et continuee GOTO SEQ_READ_1 SEQ_READ_3: CALL NACK ;Fini,donc envoi un NACK CALL STOP RETURN ;-------------------------------------- ; The following routines are low level I2C routines applicable to most ; interfaces with I2C devices. IN_BYTE ; read byte on i2c bus CLRF I_BYTE MOVLW .8 MOVWF _N0 ; set index to 8 CALL HIGH_SDA ; be sure SDA is configured as input IN_BIT CALL HIGH_SCL ; clock high BTFSS PORTB, SDA ; test SDA bit GOTO IN_ZERO GOTO IN_ONE IN_ZERO BCF STATUS, C ; clear any carry RLF I_BYTE, F ; i_byte = i_byte << 1 | 0 GOTO CONT_IN IN_ONE BCF STATUS, C ; clear any carry RLF I_BYTE, F INCF I_BYTE, F ; i_byte = (i_byte << 1) | 1 GOTO CONT_IN CONT_IN CALL LOW_SCL ; bring clock low DECFSZ _N0, F ; decrement index GOTO IN_BIT NOP NOP RETURN ;---------------------------- OUT_BYTE: ; send o_byte on I2C bus MOVWF O_BYTE MOVLW .8 MOVWF _N0 OUT_BIT: BCF STATUS,C ; clear carry RLF O_BYTE, F ; left shift, most sig bit is now in carry BTFSS STATUS, C ; if one, send a one GOTO OUT_ZERO GOTO OUT_ONE OUT_ZERO: CALL LOW_SDA ; SDA at zero CALL CLOCK_PULSE CALL HIGH_SDA GOTO OUT_CONT OUT_ONE: CALL HIGH_SDA ; SDA at logic one CALL CLOCK_PULSE GOTO OUT_CONT OUT_CONT: DECFSZ _N0, F ; decrement index GOTO OUT_BIT RETURN ;-------------------------------- NACK: ; bring SDA high and clock BSF PORTB,SDA ; bug 07/08/06 was PORTA !!!! bank1 BSF TRISB, SDA ; make SDA pin an input bank0 BSF PORTB, SCL ;SCL clock call I2C_DELAY ;SDA = 1 if device doesn't ACK bsf STATUS,Z ;SDA = 0 if device acknowledges btfsc PORTB, SDA bcf STATUS,Z bcf PORTB, SCL ;SCL clock ;STATUS,Z=1 if device acknowledges ;STATUS,Z=0 if device doesn't ACK call I2C_DELAY bsf PORTB, SCL ;SCL clock return ACK: CALL LOW_SDA call I2C_DELAY CALL CLOCK_PULSE call I2C_DELAY RETURN START: CALL HIGH_SCL CALL HIGH_SDA CALL HIGH_SCL CALL LOW_SDA ; bring SDA low while SCL is high call LOW_SCL RETURN STOP: CALL HIGH_SCL CALL LOW_SDA CALL HIGH_SCL CALL HIGH_SDA ; bring SDA high while SCL is high RETURN CLOCK_PULSE: ; SCL momentarily to logic one CALL HIGH_SCL call I2C_DELAY CALL LOW_SCL call I2C_DELAY RETURN HIGH_SDA: ; high impedance by making SDA an input BSF PORTB, SDA bank1 BSF TRISB, SDA ; make SDA pin an input bank0 call I2C_DELAY RETURN LOW_SDA: bank1 BCF TRISB, SDA ; make SDA pin an output bank0 BCF PORTB, SDA call I2C_DELAY RETURN HIGH_SCL: BSF PORTB, SCL bank1 BSF TRISB, SCL ; make SCL pin an input bank0 call I2C_DELAY RETURN LOW_SCL: bank1 BCF TRISB, SCL ; make SCL pin an output bank0 BCF PORTB, SCL call I2C_DELAY RETURN ;------------------------------------------------------ ;special pour routine d'attente 4800 bauds ou autre ; .58 pour 4800 bauds a 3.58MHz ; .67 pour 4800 bauds a 4MHZ ; .50 pour 9600 bauds a 6MHz delay_RS IF OSC_FREQ == 6000000 MOVLW .50 ; valeur plus faible mais 9600 bauds! ENDIF IF OSC_FREQ == 4000000 MOVLW .67 ENDIF IF OSC_FREQ == 3580000 MOVLW .58 ENDIF IF OSC_FREQ < 3580000 ERROR "definir frequence quartz horloge CPU" ENDIF MOVWF _DELAY_RS ; 1000000/4800=208AS DECFSZ _DELAY_RS,F ; 1 cycle si pas de saut GOTO $-1 ; 2cycles return ;---------------------- I2C_DELAY goto $+1 goto $+1 goto $+1 goto $+1 IF OSC_FREQ > 4000000 goto $+1 goto $+1 ENDIF return ;--------------------- DELAY_100uS: ; provides nominal 100 usec delay IF OSC_FREQ == 3580000 MOVLW .28 ENDIF IF OSC_FREQ == 4000000 MOVLW .31 ENDIF IF OSC_FREQ == 6000000 MOVLW .48 ENDIF MOVWF LOOP2 DELAY_SHORT_1: NOP DECFSZ LOOP2, F GOTO DELAY_SHORT_1 RETURN ;------ DELAY_250mS: MOVLW .255 ; 250 msec delay MOVWF LOOP1 GOTO DELAY_1mS ;-------- DELAY_10mS: MOVLW .10 ; 10 msec delay MOVWF _LOOP1 DELAY_1mS: IF OSC_FREQ == 3580000 MOVLW .52 ENDIF IF OSC_FREQ == 4000000 MOVLW .60 ENDIF IF OSC_FREQ == 6000000 MOVLW .90 ENDIF MOVWF _LOOP2 _DELAY_2: goto $+1 goto $+1 goto $+1 DECFSZ _LOOP2, F GOTO _DELAY_2 DECFSZ _LOOP1, F GOTO DELAY_1mS RETURN ;------ DELAY_1S call DELAY_250mS call DELAY_250mS call DELAY_250mS call DELAY_250mS return ;---------------------- Choix_Out btfss Drapeau,2 ; si bit 2 a zero choix=RS232 sinon LCD goto Rs_Putchar goto LCD_Putchar LCD_Putchar ;not implemented return ;------------------------------------------------------ Read_RS Clrf _RsByte Movlw H'08' ;byte 8 bit Movwf _RsCount Rx1 call delay_RS ;bit de start Bcf STATUS,C ;Carry=0 Btfsc Rs_Port,Rs_Rx ;lit et test l'entree RB0 Bsf STATUS,C ;Rx =1, saute si Rx =0 rrf _RsByte,f Decfsz _RsCount,f Goto Rx1 call delay_RS ;bit de stop call delay_RS ;bit de stop return ;----------------- Rs_Putchar movwf _TEMP1 Movlw H'08' ;correspond a un byte de 8 bits Movwf _RsCount ;place dans RsCount Bcf Rs_Port,Rs_Tx ;bit start a 0 Call delay_RS ;wait valeur 1bit 4800 Bauds Rrf _TEMP1,F ;shift droite dans carry Btfsc STATUS,C ;si carry 0 alors saute Goto $+3 ;carry =1 Bcf Rs_Port,Rs_Tx ;Tx dans PORTX =0 Goto $+2 Bsf Rs_Port,Rs_Tx ;Tx dans PORTx =1 Call delay_RS Decfsz _RsCount,F ;RsCount =RsCount -1 Goto $-8 Bsf Rs_Port,Rs_Tx ;bit de stop Call delay_RS ;byte envoye Call delay_RS return ;--------------- Rs_CrLf movlw .13 call Choix_Out movlw .10 call Choix_Out return ;---------------------------- Msg_Eeprom movf _Cpt1,w bank1 ; pIC16F628 ! MOVWF EEADR BSF EECON1,RD ; bit 0 MOVF EEDATA,W bank0 incf _Cpt1,f ANDLW 0x0FF BTFSC STATUS, Z Return call Choix_Out goto Msg_Eeprom return ;------- Read_EE bank1 ; pIC16F628 ! MOVWF EEADR BSF EECON1,RD ; bit 0 MOVF EEDATA,W bank0 return ;----------------- Affiche_Hexa movwf btmp ; affichage octet --> Hexadecimal 2 digits ( de 00 a FF ) swapf btmp,w andlw 0x0F call HexTable call Choix_Out movf btmp,w andlw 0x0f call HexTable call Choix_Out return ;----------------------------------------------------- bcd3 movwf btmp ; affichage octet --> decimal 3 digits ( de 0 a 255 ) movlw '0' movwf bcent movwf bdix bcd31 movlw .100 subwf btmp,w bnc bcd32 movwf btmp incf bcent,f goto bcd31 bcd32 movlw .10 subwf btmp,w bnc bcd33 movwf btmp incf bdix,f goto bcd32 bcd33 movlw '0' addwf btmp,w movwf bun btfsc Drapeau,3 goto Only_99 movf bcent,w call Choix_Out Only_99 movf bdix,w call Choix_Out movf bun,w call Choix_Out return ;----------------------------------- ; affichage word --> decimal 3ou 5 digits ;f(Drapeau,4)=1 -> 000 a 999 =0 -> 0000 … 65535 bcd53 movf val1,w movwf valx movf val1+1,w movwf valx+1 swapf val1,w iorlw 0xf0 movwf bmille addwf bmille,f addlw 0xE2 movwf bcent addlw 0x32 movwf bun movf val1,w andlw 0x0F addwf bcent,f addwf bcent,f addwf bun,f addlw 0xE9 movwf bdix addwf bdix,f addwf bdix,f swapf val1+1,w andlw 0x0F addwf bdix,f addwf bun,f rlf bdix,f rlf bun,f comf bun,f rlf bun,f movf val1+1,w andlw 0x0F addwf bun,f rlf bmille,f movlw 0x07 movwf bdixmil movlw 0x0A Lb1: addwf bun,f decf bdix,f btfss STATUS,C goto Lb1 Lb2: addwf bdix,f decf bcent,f btfss STATUS,C goto Lb2 Lb3: addwf bcent,f decf bmille,f btfss STATUS,C goto Lb3 Lb4: addwf bmille,f decf bdixmil,f btfss STATUS,C goto Lb4 btfsc Drapeau,4 goto Lb5 movf bdixmil,w addlw '0' call Choix_Out movf bmille,w addlw '0' call Choix_Out Lb5: bcf Drapeau,4 movf bcent,w addlw '0' call Choix_Out movf bdix,w addlw '0' call Choix_Out movf bun,w addlw '0' call Choix_Out movf valx,w movwf val1 movf valx+1,w movwf val1+1 return ;------------------------------------- Affiche_Time SWAPF Jour,W ANDLW 0x0F ADDLW 30H CALL Choix_Out MOVF Jour,W ANDLW 0FH ADDLW 30H CALL Choix_Out MOVLW "/" CALL Choix_Out SWAPF Mois,W ANDLW 0x0F ADDLW 30H CALL Choix_Out MOVF Mois,W ANDLW 0FH ADDLW 30H CALL Choix_Out MOVLW "/" CALL Choix_Out SWAPF Annee,W ANDLW 0x0F ADDLW 30H CALL Choix_Out MOVF Annee,W ANDLW 0FH ADDLW 30H CALL Choix_Out MOVLW " " CALL Choix_Out SWAPF HEURE,W ANDLW 0x0F ADDLW 30H CALL Choix_Out MOVF HEURE,W ANDLW 0x0F ADDLW 30H CALL Choix_Out MOVLW "H" CALL Choix_Out SWAPF MIN,W ANDLW 0x0F ADDLW 30H CALL Choix_Out MOVF MIN,W ANDLW 0FH ADDLW 30H CALL Choix_Out MOVLW "M" CALL Choix_Out SWAPF SEC,W ANDLW 0x0F ADDLW 30H CALL Choix_Out MOVF SEC,W ANDLW 0FH ADDLW 30H CALL Choix_Out MOVLW "S" CALL Choix_Out return ;------------------------ Init_RTC CALL STOP CALL DELAY_10mS ; 10mS CALL START MOVLW 0xD0 ; B'11010000'=0xD0 = adresse device CALL OUT_BYTE CALL ACK clrf ADDR MOVF ADDR, W ; addresse registre CALL OUT_BYTE CALL ACK MOVF SEC,W CALL OUT_BYTE CALL ACK ; a ce momment la led connectée sur pin7 doit osciller a 1HZ ! MOVf MIN,W CALL OUT_BYTE CALL ACK Movf HEURE,w CALL OUT_BYTE CALL ACK Movf JourSem,w ;day of the week CALL OUT_BYTE CALL ACK Movf Jour,w ;date 02 CALL OUT_BYTE CALL ACK MOVF Mois,W ;Mois 12 CALL OUT_BYTE CALL ACK MOVF Annee,W ; ANNEE=5 CALL OUT_BYTE CALL ACK MOVLW B'10010000' ;Registre de controle SQWE=1 RS0=RS1=0 sortie 1Hz CALL OUT_BYTE CALL NACK call STOP CALL DELAY_10mS ; 10mS return ;----------------------------- Lecture_DS1307 Call STOP CALL START MOVLW 0xD0 ; B'11010000' MOVWF DEV_DS1307 ; @D0H adresse device CALL OUT_BYTE CALL ACK clrf ADDR ; adresse 0 MOVF ADDR, W ; send high byte of address CALL OUT_BYTE CALL NACK CALL STOP MOVLW 0xD1 ; B'11010001' MOVWF DEV_DS1307 ;Mode Lecture CALL START ;genere un start bit MOVF DEV_DS1307,W CALL OUT_BYTE CALL NACK ;-------- CALL IN_BYTE Call ACK MOVF I_BYTE,W MOVWF SEC CALL IN_BYTE Call ACK MOVF I_BYTE,W MOVWF MIN CALL IN_BYTE Call ACK MOVF I_BYTE,W MOVWF HEURE CALL IN_BYTE Call ACK MOVF I_BYTE,W MOVWF JourSem CALL IN_BYTE Call ACK MOVF I_BYTE,W MOVWF Jour CALL IN_BYTE Call ACK MOVF I_BYTE,W MOVWF Mois CALL IN_BYTE Call ACK MOVF I_BYTE,W MOVWF Annee CALL IN_BYTE Call ACK MOVF I_BYTE,W MOVWF CtrlReg call NACK CALL STOP call DELAY_10mS return ;----------------------------------- ORG 0x2100 EEPROM_16F628 equ $ ; "1234567890123456" ; message taille 16 car maxi (LCD) EE0 DT "Datalog7 6Mhz AD7896",.0 EE1 DT "16F628_100321",.0 EE2 DT "EcriMem Page:",.0 EE3 DT "Pause:",.0 EE4 DT "LectMem Page:",.0 EE5 DT "Continue:",.0 EE6 DT "MAJ DS1307",.13,.10 EE7 DT "AAMMJJWWHHMMSS",.13,.10,.0 EE8 DT "Inter.Sec=",.0 EE9 DT "0210HHB",.0 ; 16F628 avec point blanc finEEprom EQU $ EEpromLibre EQu 128-(finEEprom - EEPROM_16F628) END