Mensajes recientes

Páginas: [1] 2 3 4 5 6 7 8 9 10
1
Dentro de getCAD  guardás la lectura en 'potenciometro' y 'LDR'  pero volvés de la función con total desparpajo sin ningún return xxxx ;

Como detalle, cuando se cambia de canal se debe esperar un tiempo antes iniciar la conversión, en tu caso son unos 20us.

El switch debió ser:
Código: [Seleccionar]
        switch(canal){
        case 0:
            ADCON0 = 0b00000000;
            break ;
       
        // mas case si mas canales

        default:
            ADCON0 = 0b00000100;
    }
    ANSELbits.ADCS =0b001;
    ADCON0bits.ADON = 1;
    __delay_us(20);                 // <<<--- Para estabilizacion
    ADCON0bits.GO = 1;
    while(ADCON0bits.GO == 1) ;
    return (ADRESH<<8) + ADRESL  ;  // <<<--- Hay que devolver esto


En el bucle principal, para activar 'LED'  comparás con 600,  pero eso corresponde a un voltaje casi 0  pues de la manera que estás leyendo el rango es entre 0 (0V) y 65472 (5V)   --> compará con 32000 (~2.5V) por ejemplo.

2
Todo en microcontroladores PIC / Re:timer 0 a un segundo
« Último mensaje por Saulv_123 en 23 de Julio de 2021, 21:06:16 »
gracias poe el aporte al final pude realizar el pograma de manera correcta :-/ :-/
3
Hola buenas tardes a todos, mi problema es que no puedo leer dos entradas analogicas y poder compararlas de alguna manera para realizar una tarea como por ejemplo la variacion del ancho de pulso de un pwm para mantener un cierto nivel de iluminancia, para medir el nivel de iluminancia utilizo un LDR y para elegir o modificar el nivel de iluminancia que quiero tener utilizo un potenciometro (que actua como seteo), luego segun corresponda actuo sobre un pwm por software, este pwm esta conectado mediante potencia a la entrada de una lampara led de 14 W de alterna, modificada para poder controlar el nivel de iluminancia con la salida pwm del pic. A cotinuacion envio un sketch para ver si podia hacer la comparacion entre la entrada del potenciometro y la entrada del LDR, pero solo me muestra un estado alto a la salida que deberia ser del pwm. El programita es el siguiente (utilizo MPLAB X xc8 como entorno de desarrollo):

#include <xc.h>
#include <PIC12F675.h>
#define _XTAL_FREQ 4000000
// CONFIG
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

int potenciometro = 0;
int LDR = 0;
int conversion = 0;
char canal;
short LED;

int getCAD(canal){
    ADFM = 1;
    VCFG = 0;
    switch(canal){
        case 0:
            ADCON0 = 0b00000000;
            ANSELbits.ADCS =0b001;
            ADCON0bits.ADON = 1;
            ADCON0bits.GO = 1;
            while(ADCON0bits.GO == 1){
                ;
            }
            potenciometro = ADRESH << 8;     //Leemos los dos bits altos del conversor
            potenciometro = potenciometro + ADRESL; //concatenamos los bits bajos
            break;
        case 1:
            ADCON0 = 0b00000100;
            ANSELbits.ADCS =0b001;
            ADCON0bits.ADON = 1;
            ADCON0bits.GO = 1;
            while(ADCON0bits.GO == 1){
                ;
            }
            LDR = ADRESH << 8;     //Leemos los dos bits altos del conversor
            LDR = LDR + ADRESL; //concatenamos los bits bajos
            break;
    }
   
    /*ANSELbits.ADCS =0b001;
    ADCON0bits.ADON = 1;
    ADCON0bits.GO = 1;
    while(ADCON0bits.GO == 1){
        ;
    }
    switch(canal){
        case 0:
            potenciometro = ADRESH << 8;     //Leemos los dos bits altos del conversor
            potenciometro = potenciometro + ADRESL; //concatenamos los bits bajos
            break;
   
        case 1:
            LDR = ADRESH << 8;     //Leemos los dos bits altos del conversor
            LDR = LDR + ADRESL; //concatenamos los bits bajos 
            break;
    }*/
}


void main(void) {
    TRISIO = 0b00000011;
    while(1){
        potenciometro = getCAD(0);
        __delay_ms(10);
        LDR = getCAD(1);
        __delay_ms(10);
       
        if(potenciometro > 600){
            LED = 1;
        }
        else{
            LED = 0;
        }
    }
   
   
   
    return;
}
4
Todo en microcontroladores PIC / Re:¿Escasez de microcontroladores?.
« Último mensaje por manwenwe en 23 de Julio de 2021, 14:24:33 »
En China encuentras de todo pero claro... X3 mínimo... Si a alguien le urge yo tengo algún contacto que por ahora no me ha fallado...

Saludos!
5
Todo en microcontroladores PIC / Re:timer 0 a un segundo
« Último mensaje por Eduardo2 en 23 de Julio de 2021, 12:09:25 »
En ese programa los cálculos están hechos para 1 interrupción cada milisegundo.

El principio todo lo que tenés que hacer es contar 1000 interrupciones

Código: [Seleccionar]
uint16_t Contador,Contador00=1000 ;

void __interrupt() myISR(void){
    if(TMR0IF == 1){
        TMR0L = 125;
        if(--Contador==0){
            Contador = Contador00 ;
            //.................
            LATC0 = ~LATC0;
            //  mas codigo
            //.................
        }
        TMR0IF = 0;
    }
}

Pero como al tiempo se le suma lo que demora en recargar TMR0L en realidad resulta un poco mas de 1ms.
Si esa pequeña diferencia de tiempo no importa no pasa nada, pero si debe ser mas preciso habría que contar el número de ciclos.  A mí me resulta mas cómodo poner un breakpoint en el Proteus, leer el tiempo transcurrido y corregir la constante de conteo.
6
Foro Técnico / Re:Reinicio de PIC al presionar boton
« Último mensaje por Robert76 en 23 de Julio de 2021, 11:49:01 »
Hola, es conveniente conectar un condensador de 100nF entre VDD y VSS del PIC en cuestión.
Además, si el factor consumo no es problema. Yo utilizo resistencias de pull-up de 470ohms, pues al ser tan bajas, atenúa bastante cualquier ruido eléctrico en una entrada. Si el problema persiste, optoacoplador amigo!
7
Foro Técnico / Re:Reinicio de PIC al presionar boton
« Último mensaje por gustavopic en 23 de Julio de 2021, 11:30:50 »
consulto, a ver si me equivoco .
pero si la fala entonces anda por ahi ( "algo" en esas entradas ) , bastaria con una resistencia y un zener de 5 v en ellas.
si el problema desparece es que es eso .

o sea, me aseguro que las entradas problematicas esten entre 0 y 5 v  por hard ., y veo que pasa.

¡ seria algo correcto hacer eso ??
8
Foro Técnico / Re:Reinicio de PIC al presionar boton
« Último mensaje por remi04 en 23 de Julio de 2021, 11:21:22 »
Menuda locura de averia remi04, vaya la que liaste para detectarla  ((:-)) ((:-)) ((:-))

 Anda que es mentira.

  Otro motivo de reset que tuve en una placa que trabajaba con cargas inductivas fue que dejé el cable icsp puesto y sacado por un lado. Para poder ir reprogramando y corrigiendo el programa y el funcionamiento del equipo sin tener que andar abriendo y cerrando la caja donde iba la placa, aparte de que era dificultoso acceder al puerto icsp.

   Pues por dejar ese cable ahí puesto sin tener el pickit conectado en el otro extremo se comía unos reset’s guapos el pic cada vez que encendía una bomba de 1,5 hp (a través de sus contactores claro  :lol:).
9
Todo en microcontroladores PIC / Re:timer 0 a un segundo
« Último mensaje por KILLERJC en 23 de Julio de 2021, 07:23:09 »
Hola, esta lleno de tutoriales que enseñan como calcular el tiempo de un timer, así que no voy a explicarlo, solo voy a decirte lo que tenes que hacer.

- Aprende a como calcular el tiempo que tiene tu interrupción cuando le cargas cierto valor al timer. En este caso 125. Busca "Timer PIC tiempo" en google, y tenes videos y tutoriales escritos.
- Sabiendo el tiempo, si es 100ms por ejemplo, podes contar 10 interrupciones, y recién ahí activar una salida. Si el tiempo era de 10ms la interrupción, entonces vas a contar 100 veces. Por eso es importante saber el tiempo que dura tu interrupción. Luego modificar esta parte:

Código: C
  1.     if(TMR0IF == 1){
  2.       if(contador++ > 50)           ; Aca puse 50, que es la cantidad de veces que se debe repetir la interrupcion
  3.       {
  4.         LATC0 = ~LATC0;
  5.         contador = 0;
  6.        }
  7.        TMR0L = 125;
  8.        TMR0IF = 0;
  9.     }

PD: Es absolutamente necesario saber la frecuencia del cristal para hacerlo.
PD2: No es necesario ningún tutorial, tenes todo en el datasheet del micro explicado, pero hay personas que les cuesta el ingles.

Si tenes una duda mas puntual, no tengo problemas en resolverlo
10
Ares / Re:Ranuras en PCB
« Último mensaje por Nocturno en 23 de Julio de 2021, 06:04:03 »
Es que cuando mandas a fabricar una PCB, tú no eliges la fresa. Eso lo hace el fabricante. Si le trae más cuenta hacer las ranuras con una fresa grande, ten por seguro que lo hará.
Páginas: [1] 2 3 4 5 6 7 8 9 10