Pin RA1 nemože pročitati DS18S20

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
majstor1
Pocetnik na forumu
Pocetnik na forumu
Posts: 47
Joined: 17-10-2014, 13:43

Pin RA1 nemože pročitati DS18S20

Post by majstor1 »

Pozdrav svima,
radim na Easypic5, s PIC 18F14520, 8 MHz. Modificirao sam primjer Mikroelektronike kojim se provjerava OneWire procedura. Imam potrebu da pročitam temperaturu s DS18S20 preko pina RA.1. Isključio sam AD konverter, komparator, definirao LATA i TRISA kao ulaz. Dobivam samo nulu. Sa bilo kojeg drugog pina PORTA čitam temperaturur bez problema. Više namam ideja, a neznam gdje griješim. Može li netko mi pomoći?

Code: Select all

program OneWire

' Lcd module connections
dim LCD_RS as sbit at RB4_bit
    LCD_EN as sbit at RB5_bit
    LCD_D4 as sbit at RB0_bit
    LCD_D5 as sbit at RB1_bit
    LCD_D6 as sbit at RB2_bit
    LCD_D7 as sbit at RB3_bit
    LCD_RS_Direction as sbit at TRISB4_bit
    LCD_EN_Direction as sbit at TRISB5_bit
    LCD_D4_Direction as sbit at TRISB0_bit
    LCD_D5_Direction as sbit at TRISB1_bit
    LCD_D6_Direction as sbit at TRISB2_bit
    LCD_D7_Direction as sbit at TRISB3_bit
' End Lcd module connections

const TEMP_RESOLUTION as byte = 9

dim text as char[9]
    temp as word

sub procedure Display_Temperature( dim temp2write as word )
const RES_SHIFT = TEMP_RESOLUTION - 8

dim temp_whole as byte
    temp_fraction as word

    text = "000.0000"
    ' Check if temperature is negative
    if (temp2write and 0x8000) then
        text[0] = "-"
        temp2write = not temp2write + 1
    end if

    ' Extract temp_whole
    temp_whole = word(temp2write >> RES_SHIFT)

    ' Convert temp_whole to characters
    if ( temp_whole div 100 ) then
      text[0] = temp_whole div 100  + 48
    else
      text[0] = "0"
    end if

    text[1] = (temp_whole div 10)mod 10 + 48               ' Extract tens digit
    text[2] =  temp_whole mod 10        + 48               ' Extract ones digit

    ' Extract temp_fraction and convert it to unsigned int
    temp_fraction  =  word(temp2write << (4-RES_SHIFT))
    temp_fraction  = temp_fraction and 0x000F
    temp_fraction  = temp_fraction * 625

    ' Convert temp_fraction to characters
    text[4] = word(temp_fraction div 1000)    + 48         ' Extract thousands digit
    text[5] = word((temp_fraction div 100)mod 10 + 48)     ' Extract hundreds digit
    text[6] = word((temp_fraction div 10)mod 10  + 48)     ' Extract tens digit
    text[7] = word(temp_fraction mod 10)      + 48         ' Extract ones digit

    ' Print temperature on Lcd
    Lcd_Out(2, 5, text)
end sub

main:
ADCON0=0x00          ' AD Converter module is disabled
ADCON1=0x0E          ' All pins are digital I/O
CMCON=0x07           ' Comparator module is disabled
LATA=1
TRISA=0XFF           ' All pins RA are input

  text = "000.0000"
  Lcd_Init()                                               ' Initialize Lcd
  Lcd_Cmd(_LCD_CLEAR)                                      ' Clear Lcd
  Lcd_Cmd(_LCD_CURSOR_OFF)                              ' Turn cursor off
  Lcd_Out(1, 1, " Temperature:")

  Lcd_Chr(2,13,223)                                        ' Print degree character, "C" for Centigrades
                                                           ' Different Lcd displays have different char code for degree
  Lcd_Chr(2,14,"C")                                        ' If you see greek alpha letter try typing 178 instead of 223

  '--- Main loop
  while (TRUE)
    '--- Perform temperature reading
    Ow_Reset(PORTA, 1)                                     ' Onewire reset signal
    Ow_Write(PORTA, 1, 0xCC)                               ' Issue command SKIP_ROM
    Ow_Write(PORTA, 1, 0x44)                               ' Issue command CONVERT_T
    Delay_us(120)

    Ow_Reset(PORTA, 1)
    Ow_Write(PORTA, 1, 0xCC)                               ' Issue command SKIP_ROM
    Ow_Write(PORTA, 1, 0xBE)                               ' Issue command READ_SCRATCHPAD

    temp =  Ow_Read(PORTA, 1)
    temp = (Ow_Read(PORTA, 1) << 8) + temp

    '--- Format and display result on Lcd
    Display_Temperature(temp)

    Delay_ms(520)
  wend
end.
User avatar
trax
Administrator sajta
Administrator sajta
Posts: 3509
Joined: 08-01-2005, 18:04
Location: 75k, BA
Contact:

Re: Pin RA1 nemože pročitati DS18S20

Post by trax »

Nisam radio sa tim PIC-em konkretno pa ne znam da li si sve podesio kako treba pa te mogu samo podsjetiti da pogledas i shemu EasyPIC5 ploce i vidis sta sve ima spojeno na tom RA.1? Mozda imas nesto sto ti smeta...
User avatar
bob4
Stariji član
Stariji član
Posts: 2572
Joined: 31-01-2010, 16:12
Location: Kutina

Re: Pin RA1 nemože pročitati DS18S20

Post by bob4 »

Da možda treba otpornik prema napajanju (pull-up) ?
Cosa
Napredujem
Napredujem
Posts: 177
Joined: 09-08-2009, 10:55
Location: Hrvatska

Re: Pin RA1 nemože pročitati DS18S20

Post by Cosa »

Osim ovoga gore nabrojanoga, pogledaj i u datasheet.
Tamo stoji da za digitalne ulaze trebaju biti uključena prva tri bita ADCON1 registra tj. 0x07, a ti si stavio 0x0E.
Na nekim mikrokontrolerima iz ove 18F familije ide i 0x0F, nisam baš detaljno gledao datasheet pa pokušaj :-).
majstor1
Pocetnik na forumu
Pocetnik na forumu
Posts: 47
Joined: 17-10-2014, 13:43

Re: Pin RA1 nemože pročitati DS18S20

Post by majstor1 »

Hvala svimana odgovorima i pomoći,
Otpornik 10 K povezuje izvod broj 2 i izvod 5 V (MISLIM NA ds18s20).
Ovo je skraćena verzija izuzetno obimnog programa, pa je ostalo ADCON1=0x0E (to prema Datasheet nebi trebalo raditi probleme).
Provjerio sam Easypic5. Nema problema na njoj.
Nakon mog prvog posta uvidio sam u originalnom programu kako mi i pin RE0 ne radi kao izlaz. Pretpostavljam kako je moj problem u isključenju AD konvertera, komparatora, registara PIE1, PIR1 i IPR1. Sada pokušavam isključiti sve što se nalazi na pinovima RA i RE.
Javim rezulatat. Ako netko ima još kakvu ideju, rado prihvaćam sve jer ja sam na kraju. :roll:
majstor1
Pocetnik na forumu
Pocetnik na forumu
Posts: 47
Joined: 17-10-2014, 13:43

Re: Pin RA1 nemože pročitati DS18S20

Post by majstor1 »

Hvala svimana odgovorima i pomoći,
Otpornik 10 K povezuje izvod broj 2 i izvod 5 V (MISLIM NA ds18s20).
Ovo je skraćena verzija izuzetno obimnog programa, pa je ostalo ADCON1=0x0E (to prema Datasheet nebi trebalo raditi probleme).
Provjerio sam Easypic5. Nema problema na njoj.
Nakon mog prvog posta uvidio sam u originalnom programu kako mi i pin RE0 ne radi kao izlaz. Pretpostavljam kako je moj problem u isključenju AD konvertera, komparatora, registara PIE1, PIR1 i IPR1. Sada pokušavam isključiti sve što se nalazi na pinovima RA i RE.
Javim rezulatat. Ako netko ima još kakvu ideju, rado prihvaćam sve jer ja sam na kraju. :roll:
majstor1
Pocetnik na forumu
Pocetnik na forumu
Posts: 47
Joined: 17-10-2014, 13:43

Re: Pin RA1 nemože pročitati DS18S20

Post by majstor1 »

Uz pomoć tima Mikroelektronike utvrdio sam kako je vjerojatno HW problem, što se tiče pina RA i čitanja sonde DS18S20.
I dalje imam problem sa pinom RE.0. Vjerojatno je problem što su pinovi RE0, RE1 i RE2 vezani na parallel slave port (PSP). Uradio sam mali program za paljenje ledica na tim pinovima. Na RE0 nemam nikakav napon, na RE1 imam 3,6V, a na RE2 imam 5 V. Probao sam isključiti PSP, ali nisam dobio željeni rezultat. Program sam ubacio u 16F887 (bez dijela o PSP) i radi odlično.
Ima li netko iskustva sa PSP?

Code: Select all

program Led_porte

main:
CMCON=0x07          ' komparator je isključen
ADCON0=0            'AD konverter je isključen
ADCON1=0X0E         ' Samo RA0 je analogan
PIR1.PSPIF=0
PIE1.PSPIE=0
IPR1.PSPIP=0
INTCON.GIE=0
TRISE.PSPMODE=0     ' PSP je isključen
TRISE.0 = 0
TRISE.1 = 0
TRISE.2 = 0

  while TRUE
    LATE.1 = 1
    Delay_ms(1000)
    LATE=0
    LATE.0=1
    delay_ms (1000)
    LATE=0
    LATE.2=1
    delay_ms (1000)
    LATE=0
  wend
end.
majstor1
Pocetnik na forumu
Pocetnik na forumu
Posts: 47
Joined: 17-10-2014, 13:43

Re: Pin RA1 nemože pročitati DS18S20

Post by majstor1 »

Uspio sam riješiti problem.
Kod je odličan.
Imam nekoliko PIC 18F4520. Problem sam rješavao prvo sa jednim, a kasnije sa drugim. Možete li misliti koju glupu sreću moram imati da oba PICA imaju "oštećen" pin RE0. Svi ostali pinovi rade. Moje iskustvo. Kupio sam deset 1F4520 i dva imaju oštećen pin. Na njima sam radio i mislio kako kod nije dobar. Iskustvo za ubuduće. Svaki PIC prvo testirati po svim pinovima (ulaz - izlaz).
Post Reply