Sari la conținut
ELFORUM - Forumul electronistilor

Problema PIC12F675


Postări Recomandate

Salut..... inca de la inceput vreau sa spun ca sunt incepator intr-ale microcontrollerelor.

Mi-am propus sa folosesc MikroC PRO iar ca programator folosesc Pickit 3. 

Primul proiect mi-a iesit  " LED BLINK ".... numai ca acum mi-am propus sa am 2 LED-uri care sa clipeasca sI nu stiu cum sa fac.

 void ini_sys () {  TRISIO0_bit = 0 ;  TRISIO1_bit = 0 ;  TRISIO2_bit = 0 ;}void init_ports(void) {   TRISIO = 1; // set as output}void main() {            init_ports();         #define PIN5  GPIO.F2         #define PIN6   GPIO.F1         #define ON 1         #define OFF 0          while(1) {           #define freq_Hz 2		  #define time 1000000 / 2      PIN5 = ON;      delay_ms(  time / freq_Hz );    //  ( delay_us(1000) = 1 milisecunda  )      PIN5 = OFF;      delay_ms(  time / freq_Hz );            PIN6 = 1  ;    /// AICI TREABA NU MERGE  /////       delay_ms(700);      PIN6 = 0 ;      delay_ms(300) ;        } }

LED din GP1... nu respecta delay-ul de 700 ms,  se aprinde foarte scurt dar pe frecventa  lui GP2, pe langa faptul ca se aprinde slab.

 

Chiar daca nu pun delay pe GP1 ci doar <  GPIO.F1 = 1  > ...... LED-ul  sta aprins dar  slab

 

 

Multumesc !

Editat de allez001
Link spre comentariu
  • Răspunsuri 16
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

void init_ports(void) {TRISIO = 1; // set as output}

1 inseamna intrare. Probabil ca nu e de aici e (m-as fi asteptat ca TRISIO = 1 sa faca GPIO0 intrare), da' asa, ca idee, ar fi bine sa fii consecvent intre cod si comentarii.

LED-urile le-ai montat cu rezistente de limitare a curentului, da?

Link spre comentariu

Pe langa ce spune Liviu (ADC, comp), eu ma intreb de unde ai incropit programul. Cand ON e ON, cand e 1. Gresit nu este dar e ca si cum ai raspunde pe strada trecatorilor si cu DA si cu YES. Primele 6 linii de program definesc I/O dar in mod contradictoriu. Caci primele 4 ii spun lui TRISIO sa se incarce cu xxx000, iar linia 6 ii zice 000001. Din fericire, GP0 nu e folosit in program.GP3 sau 4 e MCLR, deci numai intrare, nu-l poti defini cu 0 ca iesire. Oricum, chiar daca tu il incarci cu 0, tot intrare va fi considerat de PIC. Vezi ca Mikroe au o carte ( http://learn.mikroe.com/ebooks/piccprogramming/front-matter/introduction/ Gratuita) despre C. Citeste-o! Ciudata si definirea lui delay_ms(time/freq). Time e 1000000/2 = 500000. Iar freq = 2. Delay_ms() este deci 250000 de ms!!! De fapt, ce vrei tu sa obtii ca temporizari?

Editat de thunderer
Link spre comentariu

@Liviu M: Da , am pus rezistente de 100R pt fiecare LED.  Nu  functioneaza nici cu ADC si comparatorul dezactivat.

 

Pe langa ce spune Liviu (ADC, comp), eu ma intreb de unde ai incropit programul. Cand ON e ON, cand e 1. Gresit nu este dar e ca si cum ai raspunde pe strada trecatorilor si cu DA si cu YES.

 

M-am gandit in acel moment ca imi este mai usor asa, am vazut undeva pe net  nu mai stiu exact  pe unde si mi s-a parut mai sugestiv pt mine desi stiu ca 1 este ON so 0 este OFF.

 

 

Ciudata si definirea lui delay_ms(time/freq). Time e 1000000/2 = 500000. Iar freq = 2. Delay_ms() este deci 250000 de ms!!!

Acolo este o greseluta  trebuie  delay_us()  ->

Time = 1000000 microsecunde adica 1ms/2 => 500 ms activ respectiv 500 ms stins. // adica 1 Hz cu duty cycle 50%

si 500ms / freq_Hz care are valoarea 2  => 2 Hz  pe osciloscop

Multumesc pentru carte.... 

 

@ puriu

 

De ce am preferat #C ?  C-ul mi se pare mai logic si mai familiar pt ca stiu putin PHP .

ASM-ul imi este complet strain.   

Editat de allez001
Link spre comentariu

Conecteaza o rezistenta de 1-2k la LED-uri, nu de 100 ohmi ca omori iesirea PIC-ului.Nu stiu ce te astepti tu sa obtii, caci nu vrei sa descrii. E normal ca PIN 6 sa depinda de PIN 5, caci instructiunile sunt executate una dupa alta. Pe durata unui Delay_xs() PIC-ul nu face nimic altceva decat intarzierea. Deci, se clipoceste PIN 5 (o secventa ON-OFF) si apoi PIN 6 (tot una ON-OFF). Apoi iar PIN 5, samd. Asta voiai tu?Ia inverseaza PIN 5 cu PIN 6 in programul tau (simplu inlocuiesti pe 5 cu 6), cum se comporta? PS: sunt de acord cu organizarea intuitiva a programului (de ex: ON, OFF, PIN 5...) dar nu cred ca esti inca destul de ordonat sa le folosesti. @Puriu, nu spuneti gresit cu invatatul arhitecturii (citit Datasheet-ul), dar ASM-ul nu e solutia ideala cand esti nul. Asa cum zice Liviu, daca comentariile nu sunt consistente cu programul... pai de ce sa fim surprinsi ca nu merge. Eu mereu insist pe organizarea riguroasa a programului si pe definirea in program a tuturor registrilor (fie ca-i folosim, fie ca nu). Nu trebuie lucrat cu valorile standard, aici greseste help-ul Mikroe.LE: allez001, mars01 a scris un tutorial superb la sub-forumul PIC. Primul topic sticky, de citit.

Editat de thunderer
Link spre comentariu

 

//***************************// Simulare girofar politie *// LEDA = LED albastru      *// LEDR = LED rosu          *//***************************FLASH1()         { unsigned short LEDA;         for(LEDA=0; LEDA<4; LEDA++)  // numar<4 => LED-ul va trece dintr-o                                      // stare in cealalta de 4 ori         {          GPIO.F0 = 1;          delay_ms(50);          GPIO.F0 = 0;          delay_ms(50);        }      }FLASH2()       { unsigned short LEDR;         for(LEDR=0; LEDR<4; LEDR++)         {          GPIO.F1 = 1;          delay_ms(50);          GPIO.F1 = 0;          delay_ms(50);        }      }       void main()       {         ANSEL  = 0;         CMCON  = 7;         TRISIO = 0;         GPIO   = 0;            for(;;)            {             FLASH1();             FLASH2();             delay_ms(10);             }        }
Link spre comentariu

Cand este necesar un cod compact, rapid si foarte precis (comunicatii seriale, etc.), programarea in limbaj de asamblare este inevitabila. Textul programului trebuie sa fie foarte clar si bogat comentat. Pentru ca este vorba de un PIC12F675, dau mai jos un exemplu de program pentru un cardiograf cu acest microcontroler, cuplat prin interfata seriala la un PC.

 

Cardiograf.txt

Link spre comentariu

 

void init_ports() {TRISIO = 0;      ANSEL = 0;CMCON = 7;}void main() {init_ports();while(1) {GPIO = 3;        // 3 = GP0=H si GP1=H H=high = 1 logicdelay_ms(200);GPIO = 0;        // toate iesirile sun in LOW = 0 logicdelay_ms(1000);}}
Editat de Vizitator
Link spre comentariu

@va_cristi: sunt convins ca programelele tale functioneaza, dar... :)Dar e greu de urmarit.Incearca sa citesti cate ceva despre "coding style", te va ajuta sa scrii cod mai " citibil".Scriu greu acum ca sunt pe drumuri, asa ca dau doar un exemplu - cu litere mari (numai litere mari, adica) se scriu "definitiile" (#define ON 1) sau constantele (const...), nu numele functiilor.

Link spre comentariu

off topic

Multumesc Liviu M de sfat. Daca eram programator poate as fi stiut cate ceva.

Am invatat doar sa modifica codurile de pe net, pentru PIC-uri, si mai recent Arduino.

 

Asta inseamna ca unui programator ii va veni sa  :nas:  :qetrwe :57  :speriat cand vede codurile scrise  de mine

Stii, cum ar fi sa scriu asa cum vorbesc Moldovenii, sau Ardelenii!

Cam asa scriu codurile, in alt dialect  :rade: .

Editat de Vizitator
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