Mensajes recientes

Páginas: 1 [2] 3 4 5 6 7 8 9 10
11
Foro Técnico / Re:Calibrar el rtc por "smooth calibration"
« Último mensaje por Picuino en Hoy a las 11:15:39 »
Si al final decides medir la frecuencia con tu propio microcontrolador, necesitarás un cristal externo de cuarzo de alta frecuencia (HSE) para que te de la frecuencia principal (MCO).

Puedes utilizar por ejemplo un xtal de 10MHz para multiplicarla con el PLL y trabajar a 80MHz.

Luego tienes que contar pulsos de reloj y pulsos de la señal de 32kHz

Esperas más o menos un segundo y lees los contadores justo cuando la señal de 32kHz tenga un flanco de positivo a negativo (por ejemplo con una interrupción o por pooling). Luego la frecuencia la calculas con facilidad en coma flotante:

   Frecuencia = (Pulsos de la señal de 32kHz * 80000000.0) / (Pulsos de reloj)

El valor lo mandas por UART al PC para ahorrarte el display. printf("%7.3f\n", Frecuencia);

Y ya tienes tu frecuencímetro barato pero con mucha resolución.

Para conseguir precisión, mides también una señal de 1PPS del GPS y corriges el error que midas.

Un saludo.
12
amigo gracias por responder, si te fijas en la primera esta amplificadora la onda seno esta perfecta y en la segunda etapa utiliza la misma salida del pin C. es decir en la misma salida del Pic estoy utilizando una salida para obtener la onda seno, pero veo que No me esta funcionando, así que mi idea es que el pic tenga 2 salidas para amplificar la onda seno a 60 Hz.
.........

Si amigo, pero si te fijas,  en el fragmento de circuito que subiste las etapas amplificadoras no son iguales, además en una tenés 4Vpap y en la otra (la saturada) 7Vpap .   
13
Almacén del Assembler / Re:Duda y aclaración de uso de instrucciones.
« Último mensaje por KILLERJC en Hoy a las 10:36:27 »
Algunos lo usan directamente sin saberlo y otros ni lo usan... Pero al comienzo que suelen poner LIST=P...... Pueden poner tambien RADIX=  DEC, HEX, etc...

Esto le dice al compilador que espera que todos los numeros sean decimales o hexadecimales. Por ejemplo

Usando RADIX = HEX  (que es el que viene por default si no lo escribis) la instruccion MOVLW 10 pondria en W el numero 0x10 o 16 decimal.
Si usas RADIX = DEC la instruccion MOVLW 10 pondria el numero 0xA  o 10 decimal en W.

Si necesitas usar otro sistema usas las denominaciones que ves ahi, si por ejemplo esta en RADIX HEX y queres escribir un decimal, lo podes hacer haciendo .10 o d'10'

¿El porque poner un numero negativo te preguntaras? Por que es mas comodo. Tiene mas sentido. Supongamos el ADDLW -1 el podrias pensar que le esta restando 1, o que le esta sumando 0xFF, como esta limitado a 8 bits, esto queda en el mismo resultado.

Ejemplo : 8d  = 0000 1000
Si le sumo el -1, me quedaria:
0000 1000
1111 1111
------------
0000 0111  = 7d

Citar
Con respecto al resto, según tus indicaciones y en concreto con las lineas expuestas entiendo que si:
Tbase equ $ es la primera dirección de la tabla, en la siguiente instrucción Car0 equ$-Tbase seria la primera dirección de la tabla ya que si se realiza la resta entre la dirección de Car0 y Tbase, al estar contiguas pues el resultado seria 1. Luego para CarO seria la segunda posición de la tabla y así sucesivamente.

Es importante entender que es una etiqueta... el mejor ejemplo lo tenes aca:

Código: ASM
  1. BlkLns   ADDLW   -1

La etiquetas no ocupan lugar en memoria, solo lo hace la instruccion ADDLW, ¿entonces que es la etiqueta? Es simplemente un numero, que es la dirección de memoria donde se encuentra la instruccion ADDLW por eso cuando haces:

Código: ASM
  1. GOTO BlkLns

Luego el compilador lo transforma en algo asi:

Código: ASM
  1. GOTO 0x1234

Entonces... una etiqueta es únicamente un numero.

Ahora vamos con un ejemplo:

Código: ASM
  1. ORG 0x1000
  2. Table   ADDWF   PCL,F
  3. Tbase   equ   $
  4. Car0           equ   $-Tbase
  5. CarO           equ   $-Tbase
  6.            RETLW   B'00001110'   ; 1
  7.            RETLW   B'00001110'   ; 2
  8.            RETLW   B'00001110'   ; 3
  9.            RETLW   B'00001110'   ; 4

Por simplicidad agregue un ORG para que sea mas sencillo de entender.
Tbase es igual a $, es decir el primer RETLW, por lo que el $ vale 0x1001 = Tbase

Los EQU no son instrucciones por lo tanto no poseen memoria, y el $ no avanza, retiro lo que dije antes por que imagine otra cosa. Pero asi como esta el codigo parace que Car0 y CarO es 0. Me equivoque pensando que eran otras etiquetas, Es 0 porque el $ es 0x1001, y Tbase vale lo mismo, asi que la resta de ambos es 0.

A lo que me referia antes es que te permite hacer algo asi:

Código: ASM
  1. ORG 0x1000
  2. Table   ADDWF   PCL,F
  3. Tbase   equ   $
  4. Car0           equ   Tbas - $
  5. CarO           equ   Tcas - $
  6.            RETLW   B'00001110'   ; 1
  7.            RETLW   B'00001110'   ; 2
  8.            RETLW   B'00001110'   ; 3
  9. Tbas    RETLW   B'00001110'   ; 4
  10.            RETLW   B'00001110'   ; 5
  11.            RETLW   B'00001110'   ; 6
  12. Tcas     RETLW   B'00001110'   ; 7
  13.            RETLW   B'00001110'   ; 8

Si el codigo es asi , esto te permite tener los siguientes valores:
Tbase = 0x1001
Car0 = 3  ( de 0x1004 - 0x1001)
CarO = 6  ( de 0x1007 - 0x1001)
14
Foro Técnico / Re:Calibrar el rtc por "smooth calibration"
« Último mensaje por Picuino en Hoy a las 10:22:26 »
Otra forma un poco rústica es medir el RTC durante mucho tiempo (dos días por ejemplo) con un buen cronómetro y haces el ajuste a mano.

Saludos.
15
Foro Técnico / Re:Calibrar el rtc por "smooth calibration"
« Último mensaje por Picuino en Hoy a las 10:19:26 »
Necesitas medir de alguna manera la señal de 32kHz con mucha precisión (1ppm)

Para eso necesitas un frecuencímetro con reciprocal counting, que muestre al menos dos decimales en el display cuando mida la frecuencia de 32kHz.

O te compras un buen frecuencímetro o haces un programa para medir la frecuencia con decimales. En el último caso también necesitarás un patrón de frecuencia bien calibrado, como el que te dan los GPS.

Un saludo.
16


amigo gracias por responder, si te fijas en la primera esta amplificadora la onda seno esta perfecta y en la segunda etapa utiliza la misma salida del pin C. es decir en la misma salida del Pic estoy utilizando una salida para obtener la onda seno, pero veo que No me esta funcionando, así que mi idea es que el pic tenga 2 salidas para amplificar la onda seno a 60 Hz.

y en otro programa similar al primero obtener la onda seno a 50 Hz.


espero y me puedas ayudar

gracias

jose
17
Almacén del Assembler / Re:Duda y aclaración de uso de instrucciones.
« Último mensaje por Fer_TACA en Hoy a las 07:28:59 »
Gracias por la repuesta KILLERJC.

Lo del complemento a 2 del decimal lo entiendo perfectamente. Es la primera vez que lo veo, ¿y no seria mas fácil el haber puesto directamente su valor en decimal, es decir 250?
Pero lo que no termino de entender es por que es distinto donde dices:


......................,  distinto seria 10 y d'10', todo depende de como tenga seteado el radix


Luego el ADDLW   -1, lo que realiza es la suma del acumulador con el literal complemento a 2 de 1.

Con respecto al resto, según tus indicaciones y en concreto con las lineas expuestas entiendo que si:
Tbase equ $ es la primera dirección de la tabla, en la siguiente instrucción Car0 equ$-Tbase seria la primera dirección de la tabla ya que si se realiza la resta entre la dirección de Car0 y Tbase, al estar contiguas pues el resultado seria 1. Luego para CarO seria la segunda posición de la tabla y así sucesivamente.

espero estar en lo cierto, mi ASM ya está bastante oxidado.

F.
18

Ahí el error parece estar en la etapa amplificadora, no en el programa.
19


amigos del foro un cordial saludos y un feliz año nuevo

Tengo un trabajo en la universidad en realizar un inversor de voltaje con onda seno, bueno ya tengo una parte del programa y me funciona correctamente con frecuencia de 60 Hz, y mi profesor me asigno a que el pic 18f2550 tuviera otra salida para otra onda con la misma frecuencia y agregarle una luz indicadora osea un  led para que indique el que programa esta funcionando, y en otro programa similar a este pero  con frecuencia de 50 Hz

este es el codigo en MikroC

const muestras=120;
 unsigned int onda[]={347,366,384,402,420,438,455,473,490,506,522,538,553,567,581,594,607,619,630,640,649,658,666,673,679,684,688,691,693,694,694,694,692,689,686,681,676,669,662,654,645,635,624,613,601,588,574,560,545,530,514,498,481,464,447,429,411,393,375,356,338,320,302,283,265,248,230,213,197,180,164,149,134,120,107,94,82,70,59,50,41,32,25,19,13,9,5,2,1,0,0,1,4,7,11,16,22,29,36,45,54,65,76,88,100,113,127,142,157,172,188,205,222,239,257,274,292,311,329,347};

unsigned int es,toca;






//para variables
char LEEBIT (unsigned int port, char bit1)
{

    if ((port & (1 << bit1))>0) return (1);
    else return (0);
}


void interrpcion() iv 0x0008 ics ICS_AUTO

{

  if (TMR2IF_bit==1)
{
toca++;
if (toca>=muestras-1) toca=0;

es=onda[toca];
   // carga los 9 bit ciclo util
 CCPR1L=es >> 2;// carga parte baja
DC1B1_bit=LEEBIT(es,1);// carga bit 1
DC1B0_bit=LEEBIT(es,0);  // carga bit 0
TMR2IF_bit=0;
}



}

void main()
{



//Todo Digital
adcon1=0b1111;


INTCON=0b01000000;

//configuracon de los pines
TRISA=0;
trisc=0;// salida pwm


CCP1CON=0b00101100;// configura como pwm;

//configuracion frecuencia.
T2CON=0;

//programa frecuencia.
// PREESCALAODR A 4
T2CKPS1_bit=0;  //prescalador time 2
T2CKPS0_bit=1;  //prescalador time 2
PR2=173;            //registro pr2


  toca=0;

 es=onda[toca];
 // aramr el ciclo util deseado a 9 bits
 CCPR1L=es >> 2;

    if ((es & (1 << 1))>0) DC1B1_bit=1;
    else DC1B1_bit=0;

    if ((es & (1 << 0))>0) DC1B0_bit=1;
    else DC1B0_bit=0;

    // habilita int del timer2
TMR2IF_bit=0;
TMR2IE_bit=1;
GIE_bit=1;
TMR2ON_bit=1;//prende pwm

while (1)
{

}

}

adjunto la imagen de la onda seno con falla, bueno amigos espero y me puedan ayudar para mi trabajo en la U, ya casi lo tengo terminado, pero me hace un ayudita si,  :(

gracias

Jose Luis 
20
Almacén del Assembler / Re:Duda y aclaración de uso de instrucciones.
« Último mensaje por KILLERJC en 20 de Enero de 2020, 19:32:43 »
Te respondo...

El D'6' es obviamente el numero 6 decimal, como esa instruccion posee un opcode de 8 bits entonces es: 0000 0110 , un -6 es el complemento a 2 de 6, es decir 1111 1010  (not + 1)

Respecto al operador $ es la direccion donde se ejecuta esa instruccion... Uno de los usos que le das es en los GOTO por ejemplo. Si quiero hacer un salto de instrucciones hacia atras por ejemplo y tengo 2 instrucciones de 1 un lugar cada uno, entonces haria:

GOTO $-2

Es decir la direccion donde esta el GOTO restandole 2, ese es el valor binario que va a tener.


PD:

El poner D'6' o 6 es lo mismo, ya que es lo mismo en el sistema hexadecimal (que esta por default) que en el decimal,  distinto seria 10 y d'10', todo depende de como tenga seteado el radix
Tbase tiene la direccion del primero valor de la tabla. Luego los demas es la diferencia entre las dos direcciones, imagino que para saber cuanto se extiende la tabla, sin necesidad de tener un valor que indique la cantidad.
Páginas: 1 [2] 3 4 5 6 7 8 9 10