ciao
sto utilizzando un PIC16F88 con oscillatore interno a 8Mhz per leggere la temperatura da un TMP36 utilizzando una VRef di 2.048 V. Nonostante nel programma la temperatura venga letta ad intervalli e poi calcolata la media, questa oscilla sempre (+/- 0.2=B0C che poi =E8 la risoluzione max che posso ottenere). Per esempio:
17.0 / 16.8 / 17.2 / 17.0 im un arco di 10 secondi varier=E0 un paio di volte. L'alimentazione =E8 stabilizzata a 3.3V, di condesatori ce ne sono... Altri suggerimenti? lo schema =E8 in :[FIDOCAD ] LI 100 30 105 30 LI 110 35 115 35 LI 105 30 150 30 LI 110 35 100 35 MC 105 50 0 0 045 LI 100 40 105 40 LI 105 40 105 50 MC 110 40 1 0 170 LI 110 35 110 40 LI 110 50 105 50 SA 110 35 SA 105 50 LI 95 80 100 80 LI 95 90 100 90 RV 80 75 95 95 TY 81 93 5 3 90 1 0 * LM4040 TY 91 88 4 2 0 0 0 * A TY 92 77 4 2 0 0 0 * C LI 90 65 120 65 LI 120 65 120 35 LI 120 35 115 35 LI 105 65 105 70 LI 105 80 100 80 SA 105 65 LI 100 90 105 90 LI 150 30 155 30 LI 150 35 155 35 LI 150 40 155 40 LI 150 45 155 45 LI 150 50 155 50 LI 150 55 155 55 LI 150 60 155 60 LI 150 65 155 65 LI 150 70 155 70 LI 180 30 185 30 LI 180 35 185 35 LI 180 40 185 40 LI 180 45 185 45 LI 180 50 185 50 LI 180 55 185 55 LI 180 60 185 60 LI 180 65 185 65 LI 180 70 185 70 RV 155 25 180 75 TY 157 28 4 2 0 0 0 * RA2 TY 157 33 4 2 0 0 0 * RA3 TY 157 38 4 2 0 0 0 * RA4 TY 157 43 4 2 0 0 0 * RA5 TY 157 48 4 2 0 0 0 * VSS TY 157 53 4 2 0 0 0 * RB0 TY 157 58 4 2 0 0 0 * RB1 TY 157 63 4 2 0 0 0 * RB2 TY 157 68 4 2 0 0 0 * RB3 TY 172 68 4 2 0 0 0 * RB4 TY 172 63 4 2 0 0 0 * RB5 TY 172 58 4 2 0 0 0 * RB6 TY 172 53 4 2 0 0 0 * RB7 TY 172 48 4 2 0 0 0 * VDD TY 172 43 4 2 0 0 0 * RA6 TY 172 38 4 2 0 0 0 * RA7 TY 172 33 4 2 0 0 0 * RA0 EV 165 25 171 29 TY 172 28 4 2 0 0 0 * RA1 TY 166 58 5 3 90 1 0 * 16F88 MC 105 70 1 0 080 LI 105 80 125 80 LI 125 80 125 35 LI 125 35 150 35 SA 105 80 MC 135 35 1 0 170 MC 135 45 0 0 045 SA 135 35 MC 105 100 0 0 045 LI 105 90 105 100 TY 115 50 3 2 90 0 0 * 0.1u TY 110 75 3 2 90 0 0 * 1k TY 140 45 3 2 90 0 0 * 2.2u LI 25 30 30 30 LI 25 35 30 35 LI 25 40 30 40 LI 25 45 30 45 RV 30 25 50 50 LI 50 30 55 30 LI 55 35 50 35 LI 55 40 50 40 LI 55 45 50 45 LI 95 30 100 30 LI 95 40 100 40 RV 80 25 95 45 TY 81 41 5 3 90 1 0 * TMP36 LI 95 35 100 35 TY 88 39 4 2 0 0 0 * GND TY 88 28 4 2 0 0 0 * OUT TY 89 34 4 2 0 0 0 * V+ TY 35 45 5 3 90 1 0 * MAX619 MC 35 55 0 0 170 MC 35 20 0 0 170 LI 55 45 55 55 LI 55 55 45 55 LI 35 55 25 55 LI 25 55 25 45 LI 25 30 25 20 LI 25 20 35 20 LI 45 20 55 20 LI 55 20 55 30 LI 55 35 60 35 LI 60 35 60 40 LI 60 40 55 40 LI 55 40 60 40 LI 60 40 70 40 LI 70 40 70 50 LI 70 50 105 50 SA 60 40 MC 10 65 0 0 460 LI 25 35 10 35 LI 10 35 10 65 MC 10 85 0 0 045 TY 15 85 4 2 90 1 0 * 3v(2x1.5) MC 15 35 1 0 170 SA 15 35 MC 15 45 0 0 045 TY 15 35 3 2 0 0 0 * 10u LI 25 40 20 40 LI 20 40 20 65 LI 20 65 30 65 MC 30 65 1 0 170 MC 30 75 0 0 045 LI 30 65 50 65 RV 50 60 65 70 LI 90 65 65 65 LI 60 70 60 85 MC 60 85 0 0 045 SA 30 65 TY 35 70 3 2 0 0 0 * 10u LI 70 65 70 75 LI 70 85 70 90 MC 70 90 0 0 045 SA 70 65 MC 70 75 1 0 170 TY 70 75 3 2 0 0 0 * 1u TY 52 61 3 2 0 0 0 * TC1263 TY 50 64 3 2 0 0 0 * I TY 62 64 3 2 0 0 0 * O TY 56 66 3 2 0 0 0 * GND TY 40 15 3 2 0 0 0 * 0.22u TY 30 55 3 2 0 0 0 * 0.22u TY 85 90 3 2 90 0 0 * 2.048 TY 80 20 3 2 0 0 0 * 10mV/=B0C TY 45 60 3 2 0 0 0 * 5V TY 70 60 3 2 0 0 0 * 3.3v LI 120 65 135 65 LI 135 65 135 80 LI 135 65 145 65 LI 145 65 145 80 MC 135 80 1 0 170 MC 145 80 1 0 170 MC 135 90 0 0 045 MC 145 90 0 0 045 TY 135 80 3 2 0 0 0 * 10u TY 145 80 3 2 0 0 0 * 100n SA 135 65 SA 120 65
PROGRAM TermoLight; //{$DEFINE DEBUG_MODE} USES EEpromLib_E_a; Const ZonaTmpMax=3D$30; ZonaTmpMin=3D$20; MaxSteps=3D3;
D7S:ARRAY[0..17] of byte=3D($3f,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F,$77,$7C,$39,$37,$30,$40,$54= ,$76); VAR StepCorrente:Byte; Tick_count : longint; absolute $20; TempValida : Byte; absolute $30; AppoDT:Byte; TmpLettaGradi:Integer; Segno:Byte; TkCnt:Byte; Tmp_Prec:Word; Tmp_Max:Word; Tmp_Min:Word; FUNCTION mask(num: byte):byte; // this function returns masks begin // for common cathode 7-seg. display { case num of 0 : result :=3D $3F; 1 : result :=3D $06; 2 : result :=3D $5B; 3 : result :=3D $4F; 4 : result :=3D $66; 5 : result :=3D $6D; 6 : result :=3D $7D; 7 : result :=3D $07; 8 : result :=3D $7F; 9 : result :=3D $6F; 65: result :=3D $77; //10=3DA 66: result :=3D $7C; //11=3DB 67: result :=3D $39; //12=3DC 77: result :=3D $37; //M //13 73: result :=3D $30; //I //14 45: result :=3D $40; //- //15 78: result :=3D $54; //n //16 88: result :=3D $76; //X //17 end; //case end}
result:=3DD7S[Num]; end; FUNCTION TastoFn:Byte; //pressione del tasto Function su PORT A bit 4, attivo alto per 1 ms; //VAR OK:Byte; Begin {Ok:=3D0; While Button(PORTA, 4, 1, 1) do Begin nop; Ok:=3D255; end;} Result:=3DButton(PORTA, 4, 75, 1) //Result:=3DOk; End; FUNCTION TastoRes:Byte; //pressione del tasto Reset su PORT A bit 5, attivo alto per 1 ms; //VAR OK:Byte; Begin { Ok:=3D0; While Button(PORTA, 5, 1, 1) do Begin nop; Ok:=3D255; end;} Result:=3DButton(PORTA, 5, 75, 1) End;
PROCEDURE AbilitaDisplay(Num:Byte); Begin //PortA.7:=3D1; //PortA.0:=3D1; //PortA.1:=3D1; PortA:=3DPortA OR $83; case num of
1: PortA.1:=3D0; 2: PortA.0:=3D0; 3: PortA.7:=3D0; end; end; Procedure Scrivi7Seg(Quale,Cosa:Byte); Begin PortB:=3D$00; PORTB:=3DMask(Cosa); AbilitaDisplay(Quale); {$IF_DEF DEBUG_MODE} {$ELSE} // delay_ms(1); {$END_IF} End; PROCEDURE Scrivi(D_1,D_2,D_3:Byte); Begin Scrivi7Seg(1,D_1); Scrivi7Seg(2,D_2); Scrivi7Seg(3,D_3); End; PROCEDURE WriteTempToEprom(Indirizzo:Byte; Tmp:Word); Begin Eeprom_Write(Indirizzo,integer((Tmp SHR 8)) AND $FF); Delay_ms(20); Eeprom_Write(Indirizzo+1,byte(Tmp AND $FF)) ; End; FUNCTION LeggiTempFromEprom(Indirizzo:Byte):Word; VAR B1,B2:Byte; OutT:Word; Begin OutT:=3D0; B1:=3DEEprom_Read(Indirizzo); Delay_ms(20); B2:=3DEEprom_Read(Indirizzo+1);If (B1=3D$FF) AND (B2=3D$FF) then OutT:=3D0 Else Begin Outt:=3DB1; //OutT:=3DOutT*$100; OutT:=3DOutT SHL 8; OutT:=3DOutT+B2;
end; Result:=3DOutT; ENd; Procedure tmpWord_ToInt(TmpIn:Word; VAR OutT:Integer; VAR OutSegno:Byte); Var TmpLettaAppo:Integer; Begin OutSegno:=3D0; Outt:=3D0; TmpLettaAppo:=3D (TmpIn SHL 1) ; //TmpLettaAppo:=3D((TmpIn *2)-480); If TmpLettaAppo=3D255 then Begin If AppoTmp_Max then Begin Tmp_Max:=3DAppo; WriteTempToEprom(ZonaTmpMax,aPPo) ; End; End;
{ TmpLettaGradi:=3D((aPPo *2)-500); If TmpLettaGradi=3D112); Appo:=3D0; Repeat Appo:=3DAPpo+1; if (TastoFn=3D255) Then GoTo FineProc; if (TastoRes=3D255) Then GoTo FineProcReset; DisplayTemp(T,S);
Until (Appo>=3D220); Until False; FineProcReset: Nop; if CheAddr=3DZonaTmpMin Then Begin WriteTempToEprom(ZonaTmpMin,1500) ; Tmp_Min:=3D1500; end; if CheAddr=3DZonaTmpMax Then Begin WriteTempToEprom(ZonaTmpMax,0) ; Tmp_Max:=3D0; end; Appo:=3D0; Repeat Appo:=3DAPpo+1; //Scrivi7Seg(1,Ord('-')); Scrivi7Seg(1,15); Scrivi7Seg(2,15); Scrivi7Seg(3,15); Until (Appo>=3D4095); FineProc: Nop; //StepCorrente:=3D1;
end; begin OPTION_REG :=3D $80; OSCCON:=3D$70; //Internal 8Mhz clock Ansel:=3D$0C; //Input analogico da RA2/AN2 segnale, RA3 vref+ ADCon0:=3D$D0; //clock a/d rc osc , Ch RA2/AN2 ADCon1:=3D$A0; //right justified,RA3 vref+ TrisB:=3D0; //porta B =E8 output per display TrisA:=3D$3C; // Port A input tranne RA1/AN1 e Ra0/An0 e Ra7 e ra6(segno) AbilitaDisplay(4); PortA.6:=3D0; //segno Tick_count:=3D0; CCP1Con:=3D0; TempValida:=3D0; Segno:=3D0; TmpLettaGradi:=3D0; Tmp_Prec:=3DAdc_Read(2); Tmp_Min:=3DLeggitempFromEprom( ZonaTmpMin); If (Tmp_MIN=3D$FFFF) Then Tmp_Min:=3D$05DC;
Tmp_Max:=3DLeggitempFromEprom( ZonaTmpMax); If (Tmp_Max=3D$FFFF) Then Tmp_max:=3D$0; TkCnt:=3D128; TmpLettaGradi:=3D0; StepCorrente:=3D1; Repeat Tick_count:=3DTick_count+1; If StepCorrente=3D1 then begin { AppoDT:=3D0; If TempValida>=3D254 then Repeat TkCnt:=3D3; AppoDT:=3DAppoDT+1;
DisplayTemp(TmpLettaGradi,Segno); Until AppoDt>=3D32 Else } DisplayTemp(TmpLettaGradi,Segno); end; If StepCorrente=3D2 then DisplayMinMax(ZonaTmpMin); If StepCorrente=3D3 then DisplayMinMax(ZonaTmpMax);
If (TastoFn=3D255) Then If StepCorrente=3DMaxSteps THen StepCorrente:=3D1 Else StepCorrente:=3DStepCorrente+1; If Tick_Count=3DTkCnt then Begin DoLettura2; Tick_Count:=3D0; If TempValida