Kreator Postat Ianuarie 21, 2018 Partajează Postat Ianuarie 21, 2018 (editat) Buna ziua! Va rog frumos sa-mi explicati cum pot se setez pinul DACOUT la PIC16F1847 ai acesta sa aiba tensiuna de referinta FVR (Fixed Voltage Reference). DS-ul spune ca pot obtine o tensiune de referinta multiplu de 1,024V. Schema este Tin sa precizez ca am folosit instructiunile de mai jos dar tensiunea masurata pe pinul 1 RA2 DACOUT este 0V. sub procedure initializare ' setari porturi ANSELA=0x0C ' RA2 - RA3 analog, restul digital ANSELB=0 ' all digital TRISA= 0xEB ' RA4 output TRISB = 0xFF ' all input WPUA=0 ' pull_up disabled WPUB=0xFF ' pull_up enabled PORTB = 0xFF TRISB = 0xFF 'setare oscilator OSCCON=%01110011 ' 8 MHz 'setari intreruperi INTCON.GIE = 1 '7 Global Interrupt Enable bit INTCON.PEIE = 0 '6 Peripheral Interrupt Enable bit INTCON.TMR0IE = 1 '5 Timer0 Overflow Interrupt Enable bit INTCON.INTE = 0 '4 INT External Interrupt Enable bit INTCON.IOCIE = 0 '3 Interrupt-on-Change Enable bit INTCON.TMR0IF = 0 '2 Timer0 Overflow Interrupt Flag bit INTCON.INTF = 0 '1 INT External Interrupt Flag bit INTCON.IOCIF = 0 '0 Interrupt-on-Change Interrupt Flag bit 'setari option_reg OPTION_REG.NOT_WPUEN = 0 ' pull_up enabled OPTION_REG.INTEDG = 0 OPTION_REG.T0CS = 0 'set Timer0 clock source to internal OPTION_REG.T0SE = 0 OPTION_REG.PSA = 0 'asign prescaler to Timer 0 OPTION_REG.PS2 = 0 'asign prescaler value 2 OPTION_REG.PS1 = 1 'asign prescaler value 1 OPTION_REG.PS0 = 0 'asign prescaler value 0 ' setari FVR Control FVRCON = %11000011 DACCON0 = %11101000 DACCON1= 255 'setari temperatura tset = 345 tvrf = 314 prm = 0 Init_Rotary_Encoder end sub sub procedure Interrupt TMR0 = 6 if prm = 0 then LCDINIT end if Check_Rotary_Encoder if Rotary_Direction > 0 then select case Rotary_Direction case 1 ' inc(tset) case 2 ' dec(tset) end select Rotary_Direction = 0 ' reset to zero after usage end if j = j + 1 If j = 100 Then j = 0 PORTA.4 = not PORTA.4 afisare prm = 1 End if prm = 1 INTCON.T0IF = 0 end sub Si apoi cum pot citi tensiunea de pe cursorul pot-ului? Este prima mea incercare de a lucra cu analoage la PIC-uri si nu-i dau de cap.... Va multumesc! Editat Ianuarie 21, 2018 de Kreator Link spre comentariu
Bandi Szasz Postat Ianuarie 21, 2018 Partajează Postat Ianuarie 21, 2018 (editat) La pagina 126 a datasheet-ului ai diagrama modulului FVR, unde arata ca iesirea FVR se poate trimite catre: ADC, Compoaratori interni si DAC , deci nu poti obtine FVR-ul la un pin extern. Ar fi bine venita o mica explicatie cam ce vrei sa faci, daca ai nevoie de FVR il poti seta ca referinta pozitiva a DAC-ului, apoi pornesti DAC-ul si il setezi pe cea mai mare scala sa ai iesirea pe pinul de DACOUT insa daca te uiti la diagrama DAC-ului o sa observi ca si cea mai mare scala trece de primul divizor rezistiv deci nu o sa obtii exact valoarea FRV ci o valoare mai mica Edit: Acuma am observat ca ai incercat sa faci exact ce am sugerat eu. FVRCON = %11000011 - este gresit, bitii 0-1 pornesc FVR - ul pentru ADC iar bitii 2-3 pentru DAC , incearca cu FVRCON = 0xCC Editat Ianuarie 21, 2018 de Bandi Szasz Link spre comentariu
Kreator Postat Ianuarie 21, 2018 Autor Partajează Postat Ianuarie 21, 2018 (editat) Salut Bandi! Incerc sa fac o statie de lipit, si ca sa nu mai folosesc o sursa de referinta externa pentru masurarea tensiunii vroiam sa folosesc FVR-ul MCU-ului. Nu conteaza ca-i mai mica decat 4,096V, important este sa fie stabila. Asta-i schema completa Si asta-i codul scris pana acum program Statie_de_lipit ' Declarations section ' Lcd module connections dim LCD_RS as sbit at RB6_bit LCD_EN as sbit at RB7_bit LCD_D4 as sbit at RA6_bit LCD_D5 as sbit at RA7_bit LCD_D6 as sbit at RA0_bit LCD_D7 as sbit at RA1_bit LCD_RS_Direction as sbit at TRISB6_bit LCD_EN_Direction as sbit at TRISB7_bit LCD_D4_Direction as sbit at TRISA6_bit LCD_D5_Direction as sbit at TRISA7_bit LCD_D6_Direction as sbit at TRISA0_bit LCD_D7_Direction as sbit at TRISA1_bit ' End Lcd module connections dim txt1, txt2 as string[16] txt3, txt4 as string[6] tset, tvrf as integer j as byte prm as bit dim Rotary_Encoder_A as sbit at RB4_bit ' to be defined in the using program Rotary_Encoder_B as sbit at RB5_bit ' to be defined in the using program Rotary_State as byte ' 0: both lines are 0' 1: both lines are 1' 2: both lines differ Rotary_Direction as byte ' 0: no rotation 1: left rotation 2: right rotation Rotary_Val as byte sub procedure Init_Rotary_Encoder Rotary_Direction = 0 ' no rotation detected Rotary_State = 2 ' for safety end sub sub procedure Check_Rotary_Encoder Rotary_Val = Rotary_Encoder_A + (Rotary_Encoder_B << 1) ' bit 0 = A, bit 1 = B select case Rotary_val case 0, 3 ' both A and B are the same (0,0 or 1,1) Rotary_State = Rotary_Val.0 case else ' A and B differ, A changed or B changed... if (Rotary_State <> 2) then ' no detecion ongoing if Rotary_Val.0 <> Rotary_State then Rotary_Direction = 1 ' clockwise rotation, A changed before B else Rotary_Direction = 2 ' Counter clockwise rotation, B Changed before A end if Rotary_State = 2 end if end select end sub sub procedure afisare() txt1 = "Tset=" txt2 = "Tvrf=" IntToStr(tset,txt3) IntToStr(tvrf,txt4) ltrim(txt3) ltrim(txt4) txt1 = txt1 + txt3 txt2 = txt2 + txt4 Lcd_Out(1,1,txt1) ' Write text in first row Lcd_Chr_Cp(223) Lcd_Out(1,10,"C P=85%") Lcd_Out(2,1,txt2) ' Write text in second row Lcd_Chr_Cp(223) Lcd_Out(2,10,"C St_By") end sub sub procedure LCDINIT Lcd_Init() ' Initialize Lcd Lcd_Cmd(_LCD_CLEAR) ' Clear display Lcd_Cmd(_LCD_CURSOR_OFF) ' Cursor off end sub sub procedure initializare ' setari porturi ANSELA=0x0C ' RA2 - RA3 analog, restul digital ANSELB=0 ' all digital TRISA= 0xEB ' RA4 output TRISB = 0xFF ' all input WPUA=0 ' pull_up disabled WPUB=0xFF ' pull_up enabled PORTB = 0xFF TRISB = 0xFF 'setare oscilator OSCCON=%01110011 ' 8 MHz 'setari intreruperi INTCON.GIE = 1 '7 Global Interrupt Enable bit INTCON.PEIE = 0 '6 Peripheral Interrupt Enable bit INTCON.TMR0IE = 1 '5 Timer0 Overflow Interrupt Enable bit INTCON.INTE = 0 '4 INT External Interrupt Enable bit INTCON.IOCIE = 0 '3 Interrupt-on-Change Enable bit INTCON.TMR0IF = 0 '2 Timer0 Overflow Interrupt Flag bit INTCON.INTF = 0 '1 INT External Interrupt Flag bit INTCON.IOCIF = 0 '0 Interrupt-on-Change Interrupt Flag bit 'setari option_reg OPTION_REG.NOT_WPUEN = 0 ' pull_up enabled OPTION_REG.INTEDG = 0 OPTION_REG.T0CS = 0 'set Timer0 clock source to internal OPTION_REG.T0SE = 0 OPTION_REG.PSA = 0 'asign prescaler to Timer 0 OPTION_REG.PS2 = 0 'asign prescaler value 2 OPTION_REG.PS1 = 1 'asign prescaler value 1 OPTION_REG.PS0 = 0 'asign prescaler value 0 ' setari FVR Control FVRCON = %11000011 DACCON0 = %11101000 DACCON1= 255 'setari temperatura tset = 345 tvrf = 314 prm = 0 Init_Rotary_Encoder end sub sub procedure Interrupt TMR0 = 6 if prm = 0 then LCDINIT end if Check_Rotary_Encoder if Rotary_Direction > 0 then select case Rotary_Direction case 1 ' inc(tset) case 2 ' dec(tset) end select Rotary_Direction = 0 ' reset to zero after usage end if j = j + 1 If j = 100 Then j = 0 PORTA.4 = not PORTA.4 afisare prm = 1 End if prm = 1 INTCON.T0IF = 0 end sub main: initializare while TRUE ' Endless loop wend end. LE Merci Bandi! A aparut tensiune pe RA2 ! Editat Ianuarie 21, 2018 de Kreator Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum