pyu Postat Iunie 25, 2009 Partajează Postat Iunie 25, 2009 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
Liviu M Postat Iunie 25, 2009 Partajează Postat Iunie 25, 2009 Cum e definit delay_us()? Link spre comentariu
pyu Postat Iunie 25, 2009 Autor Partajează Postat Iunie 25, 2009 http://www.ccsinfo.com/forum/viewtopic. ... w=previous E functie din compilator. Link spre comentariu
Liviu M Postat Iunie 25, 2009 Partajează Postat Iunie 25, 2009 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
pyu Postat Iunie 25, 2009 Autor Partajează Postat Iunie 25, 2009 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
pyu Postat Iunie 30, 2009 Autor Partajează Postat Iunie 30, 2009 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
sofian Postat Iunie 30, 2009 Partajează Postat Iunie 30, 2009 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
pyu Postat Iulie 1, 2009 Autor Partajează Postat Iulie 1, 2009 Merci pentru raspunsul rapid :)Da, acum am vazut si eu ca oscilatorul intern este sau la 8, sau la 4Mhz.Am atasat un cristal, si mai diseara testez. 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