Sari la conținut
ELFORUM - Forumul electronistilor

On/Off PIC 17F73 - begins


Postări Recomandate

  • 4 luni mai târziu...

Pentru a fi mai usor inteles si de modificat de catre utilizatorii incepatori, l-am scris asa:

sbit LED at PORTB.B1;
sbit BUTON at PORTB.B0;
bit x;

void main(){
             PORTB=0;
             TRISB=0b00000001;
          do{
             if(!BUTON){
                        x=~x;
                        while(!BUTON){}
                        }
             LED=x;
             }while(1);
            }

HEX:

:020000000328D3
:1000060083120313860101308316860083120618B5
:1000160011280130A006061811280E2820181528C8
:0A00260086101628861409281728F2
:02400E001B0095
:00000001FF
Editat de Marius Rotundu
Link spre comentariu

Eu folosesc debounce de 10-15ms si este suficient, nu am avut probleme cu detectari false. Daca folosesti mikroC for Pic ai librarie gata facuta pt buton cu debounce cu tot, in plus ai si un exemplu pe a ignora butonul pana nu i se da drumul inatai dupa o apasare, este exact ce iti trebuie. Se mai poate face debounce si cu timer0 si fara delay ca sa poti executa instructiuni cat timp se face debounce la buton, dar asta putin mai complex.

Editat de Bandi Szasz
Link spre comentariu
  • 2 ani mai târziu...

Salutare...am si eu nevoie de un mic ajutor...nu am mai lucrat de mult cu PIC...as vrea sa anulez efectul de tranzitie dintre ON si OFF la apasarea unui switch

(buton de pe o telecomanda)

multumesc

 

#define pompa_dir TRISA.F5      //pompa pe iesirea RC1
#define pompa PORTA.F5
#define radio1_dir TRISA.F4      //buton start pompa
#define radio1 PORTA.F4
void start_pompa()
{
  static unsigned char old_state = ON;
  if (!radio1 && old_state == ON)
  {
  pompa = ON;
  old_state = OFF;
  delay_ms(200);
  }
  if (!radio1 && old_state == OFF)
  {
  pompa = OFF;
  old_state = ON;
  delay_ms(200);
  }
 }

 

Link spre comentariu

Microcontrolerul folosit este 16F876A...se pare ca nu reusesc sa fac porturile A sa lucreze ca intrari/iesiri digitale.

Pe RA0 am un senzor de temperatura (LM35), iar apoi (RA1..RA5) cateva taste...am incercat sa le pun ca iesiri pe niste relee, insa nu vrea sa le comande...

Link spre comentariu
Acum 33 minute, catalin004 a spus:

Microcontrolerul folosit este 16F876A...se pare ca nu reusesc sa fac porturile A sa lucreze ca intrari/iesiri digitale.

Pe RA0 am un senzor de temperatura (LM35), iar apoi (RA1..RA5) cateva taste...am incercat sa le pun ca iesiri pe niste relee, insa nu vrea sa le comande...

Vezi registrul ADCON1, probabil setarea este 0b??001110, ?? = cum vrei sa citesti si ca de repede sa faca conversia. Ultimul bit (la mine pus pe zero) indica referinta de tensiune. Mai multe in datasheet.

Apoi, bineinteles, TRISA, LATA, PORTA.

Spor!

Link spre comentariu
Acum 15 minute, kit a spus:

Vezi registrul ADCON1, probabil setarea este 0b??001110, ?? = cum vrei sa citesti si ca de repede sa faca conversia. Ultimul bit (la mine pus pe zero) indica referinta de tensiune. Mai multe in datasheet.

Apoi, bineinteles, TRISA, LATA, PORTA.

Spor!

Am doar ADCON1=0x06;             

intrari/iesiri le am declarate (mai sus este programelul doar pt un buton)...am incercat sa le folosesc si ca butoane si ca iesire pentru LED...

Ca butoane nu le vedea deloc...ca iesiri face urmatoarea chestie: imi aprinde iesirea RA3 de exemplu, apoi o stinge si aprinde pe RA4 (eu din cod ii spun sa le aprinda pe ambele am un delay de 200ms )

Link spre comentariu
Acum 2 ore, catalin004 a spus:

Am doar ADCON1=0x06;             

intrari/iesiri le am declarate (mai sus este programelul doar pt un buton)...am incercat sa le folosesc si ca butoane si ca iesire pentru LED...

Ca butoane nu le vedea deloc...ca iesiri face urmatoarea chestie: imi aprinde iesirea RA3 de exemplu, apoi o stinge si aprinde pe RA4 (eu din cod ii spun sa le aprinda pe ambele am un delay de 200ms )

 

Acum 1 oră, catalin004 a spus:

Conform tabelului de la PIC-ul respectiv, as avea ADCON1 = 0000 011x; (adica toti pinii ca digitall, cu exceptia lui RA0), este corect?

Ca eu asa am hard, un senzor pe RA0 iar pe restul de RA (fara pinii de oscilator) butoane...

Cf datasheet, asa se trec toti pinii pe digital, inclusiv RA0.

Pentru ca doar RA0 sa fie analogic, pt TMP35, trebuie in ANCON1 1110.

Mai trebuie verificat daca comparatorul este off, CMCON:CM2:CM0 = 111. In mod normal la POR comparatorul este off.

La pag. 41 este un exemplu de initializare pentru toti pinii pe digital.

La pag. 43 sunt tablele 4-1 si 4-2 care arata care sunt functiunile pinilor PORTA si registrii care ii influenteaza.

N-am lucrat cu picul asta, dar daca este suportat de MCC din MPLABX atunci este mult mai usor de initializat un pic folosind aceasta unealta.

Ar fi ajutat daca ai fi postat codul de initializare...

Cu unealta ce lucrezi pentru a face programarea? MPLAB, altceva... Ca mi se pare ciudata folosirea PORTA.Fx, nu de alta...

Spor!

Link spre comentariu

Mediul de programare este MikroC...am pus 0x0E si face la fel

#define light_dir TRISC.F1     			  //iluminat LCD pe iesirea RC1
#define light PORTC.F1
#define lamp_dir TRISB.F0        		  //lampa panou pe iesirea RB0
#define lamp PORTB.F0
#define relay1_dir TRISB.F2        		  //stalp 1 pe iesirea RB2
#define relay1 PORTB.F2
#define relay2_dir TRISB.F1       		  //stalp 2 pe iesirea RB1
#define relay2 PORTB.F1
#define relay3_dir TRISA.F3       		  //stalp 3 pe iesirea RB3
#define relay3 PORTA.F3
#define pompa_relay_dir TRISA.F5          //pompa pe iesirea RA5
#define pompa_relay PORTA.F5
#define RCT1_dir TRISA.F4                 //buton telecomanda C
#define RCT1 PORTA.F4
#define RCT2_dir TRISB.F4                 //buton telecomanda D
#define RCT2 PORTB.F4
#define RCT3_dir TRISB.F5                 //buton telecomanda B
#define RCT3 PORTB.F5
#define RCT4_dir TRISC.F2                 //buton telecomanda A
#define RCT4 PORTC.F2
#define buton1_dir TRISB.F3               //buton start pompa
#define buton1 PORTB.F3
#include "LCD_config.h"
#include "temp.h"
#include "hardware.h"

void main()
{

//TRISA.F0 = 1;              //ADC input to RA00
ADCON1=0x06;                 //ADC  reference to 5V Vdd


light_dir       = OUTPUT;
lamp_dir        = OUTPUT;
pompa_relay_dir = OUTPUT;
relay1_dir      = OUTPUT;
relay2_dir      = OUTPUT;
relay3_dir      = OUTPUT;
RCT1_dir        = INPUT;
RCT2_dir        = INPUT;
RCT3_dir        = INPUT;
RCT3_dir        = INPUT;
buton1_dir      = INPUT;

light              = ON;
lamp               = OFF;
pompa_relay        = OFF;
relay1             = OFF;
relay2             = OFF;
relay3        	   = OFF;

Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
LCD_Cmd(_LCD_Cursor_OFF);
LCD_Out(1,5, "Temp =");
InitTimer0();

 

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