Sari la conținut
ELFORUM - Forumul electronistilor

DACOUT pin la PIC16F1847


Postări Recomandate

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

post-175068-0-56391000-1516533940_thumb.png

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 de Kreator
Link spre comentariu

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 de Bandi Szasz
Link spre comentariu

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

post-175068-0-47074300-1516537122_thumb.png

 

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 de Kreator
Link spre comentariu

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări