Sari la conținut
ELFORUM - Forumul electronistilor

Aceeasi problema, 2 x 18b20


pyu

Postări Recomandate

Imi cer scuze ca deschid un topic nou, dar nu il gasesc pe cel vechi.

Am cumparat senzori noi, un pic nou, mi-am facut o noua mini placa de dezvoltare, bazata pe pickit2. totul e ok pana cand conectez 2 senzori, pe acelasi port.

Folosesc CCS, o versiune destul de recenta.

 

Codul acesta imi mananca zilele:

int8 ow_reset(void) {    int8 presence;    output_low(DQ);    delay_us(488);          // Min. 480uS    output_float(DQ);    delay_us(72);           // Takes 15 to 60uS for devices to respond    presence = input(DQ);    delay_us(424);          // Wait for end of timeslot    return(presence);  }

In cazul in care procesorul ruleaza la 20Mhz, nu-mi merge nimic.

Daca micsoresc viteza la 4Mhz, codul e ok, imi returneaza ce trebuie, si afisez pe lcd ROM-urile senzorilor.

#use delay(clock=20000000) sau #use delay(clock=4000000) - asa setez viteza, din soft.

 

Am inteles ca CCS Compiler ajusteaza delay-ul in functie de frecventa cpu.

 

Are cineva idee de ce nu merge in cazul meu? E ceva ce trebuie sa stiu?

 

L.E.: folosesc pic 16f887.

Link spre comentariu
  • Răspunsuri 7
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • pyu

    5

  • Liviu M

    2

  • sofian

    1

Top autori în acest subiect

Pai se pare ca e ceva de genul

... delay_us(BYTE)
, adica parametrul trebuie sa fie BYTE. Daca nu ma insel, intr-un BYTE incap numere de la 0 la 255. Dupa parerea mea,
delay_us(488);
nu are cum sa functioneze corect.

Eu l-as scrie

delay_us(244);delay_us(244);
(ma rog, combinatii de 2 delay de-astia).
Link spre comentariu

As tinde sa cred ca valoarea introdusa de mine nu este byte, ci va fi transformata ulterior de catre compilator in byte.

 

Totusi o sa iau in considerare si varianta ta, voi incerca cum ai spus.

 

Am mai gasit o varianta, pentru precizie:

#include <16F877.H> #fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, PUT, NOLVP #use delay(clock = 4000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS) #int_ext void int_ext_isr(void) { delay_ms(1); } #use delay(clock = 4000000) //====================== void main() { enable_interrupts(INT_EXT); enable_interrupts(GLOBAL); while(1) { printf("Hello World\n\r"); delay_ms(100); } }

#use delay(clock = 4000000) - apare de doua ori.

 

Revin maine cu noi detalii :)

Link spre comentariu

Am facut un program simplu:

#include <16F887.H> #fuses XT,NOWDT,NOLVP,PUT,NOPROTECT,NOBROWNOUT,NOWRT #use delay(clock = 20000000) void main(void) {    while(1)    {       delay_ms(200);       output_toggle(PIN_E1);    } }

In cazul frecventei de 20Mhz ( nu am oscilator extern ), pentru ca ledul sa stea o secunda aprins, o secunda stins, si tot asa mai departe, trebuia sa folosesc delay_ms(40).

Din acest lucru imi dau seama ca de fapt nu lucreaza la 20Mhz, ci viteza este de 5 ori mai mica (4Mhz).

Stie cineva care ar fi cauza?

Sa folosesc un oscilator extern?

O fi din cauza ca am testat in mod debug (picKit2 + MPLAB)?

Altfel nu am putut testa, pentru ca nu "pornea" picul, cred ca din cauza ca trebuie o rezistenta de 47k sau 4.7k legata intre MCLR si +5v?

 

As fi profund recunoscator daca ma lamureste cineva.

Multumesc!

Link spre comentariu

prima data poti citi pdf piculuiMCLR poate configurat si ca port Inputdeci daca il configurezi ca MCLR extern atunci se activeaza automat si PullUp internoscilatorul intern al picului este la 4Mhz,ptr 20Mhz trebuie oscilator extern obligatoriu

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