desktop

Ayuda con el oscilador interno del PIC16F887

Como hacer para que mi oscilador interno trabaje, con cierta frecuencia alguien me podria dar el codigo de alguna, mi pic es el 16f887. en la hoja de dato viene esto, pero mi duda seria como ponerlo en lenguaje asm.

bit 6-4 IRCF<2:0>: Internal Oscillator Frequency Select bits
111 = 8 MHz
110 = 4 MHz (default)
101 = 2 MHz
100 = 1 MHz
011 = 500 kHz
010 = 250 kHz
001 = 125 kHz
000 = 31 kHz (LFINTOSC)
 
Primero la cabecera con la configuración de fuses.
Código:
    list p = 16f887
    include    p16f887.inc
    __config    _CONFIG1, _INTRC_OSC_NOCLKOUT & _LVP_OFF & _IESO_OFF & _PWRTE_ON & _WDTE_OFF
    __config    _CONFIG2, _WRT_OFF & _BOR21V
Después la configuración del registro OSCCON.
Aquí por ejemplo, oscilador interno a 8 MHz.
Código:
inicio
    bsf        STATUS,RP0        ; Seleccionar el Banco 1
    ; Configuración del oscilador interno @ 8MHz.
    movlw    b'01110000'
    movwf    OSCCON
no_estable
    btfss    OSCCON,HTS        ; Comprobar si el oscilador interno ya se encuentra estable.
    goto    no_estable
¿Sencillo, no?
 
Primero tienes que tener en cuenta todos los bists "8" luego preparas en cualquier tipo que creas conveniente, "BIN, HEX o DEC"
Cualquiera que sea los los pesos, pero los Bits 4, 5 y6 son los que suman
111 = 64+32+16=> 8 MHz "01110000"
110 = 64+32+0=>4 MHz
101 = 64+0+16=>2 MHz
100 = 64+0+0=>1 MHz
011 = 0+32+16=>500 kHz
010 = 0+32+0=>250 kHz
001 = 0+0+16=>125 kHz
000 = 0+0+0=>31 kHz

Luego preparas como literal de trabajo para luego mover a osccon

movlw 0x62 ; 4MHZ = 1100010
movwf 8fh ; MOVIENDO HASTA EL OSCCON

Saludos
 
Buenos días. Mi duda es: ¿Por qué programo mi PIC16F887 con el reloj interno y lo simulo y funciona todo perfecto, pero cuando llevo el programa al PIC de manera física y lo conecto este no hace nada?
Quiero hacer parpadear dos leds y mostrar una oración en un LCD 20X4.

Aquí dejo el código:
C:
#INCLUDE <16F887.h>

#fuses HS, INTRC_IO, NOWDT, NOPROTECT, BROWNOUT, NOPUT, NOLVP,NOFCMEN

#USE DELAY (clock=8MHZ)

#include <lcd420.C>

#BYTE PORTB=6

#BYTE PORTA=5



   MAIN()

{

   setup_oscillator(OSC_8MHZ|OSC_INTRC);

   set_tris_B(0);

   set_tris_A(0B00000000);

   LCD_INIT();       //Inicializa el LCD

   delay_ms(20);

   LCD_PUTC("\f");   //Borrar el contenido del LCD

   WHILE(TRUE)

   {

      output_high(PIN_A0);

      output_low(PIN_A1);

      delay_ms(1000);

      output_low(PIN_A0);

      output_high(PIN_A1);

      delay_ms(1000);

      LCD_GOTOXY(1,1);        //Se ubica En la columna 1 fila 1

      printf(LCD_PUTC, "Control");    //Muestre el mensaje “Control”

      LCD_GOTOXY(1,2);        //Ubicarse en la columna 1 fila 2

      LCD_PUTC("Automatico"); // Sacar el mensaje “Automatico”

      DELAY_MS(20);

   } //Cierra while true

   }
 
Buenos días. Mi duda es porque programo mi PIC 16F887 con el clock interno y lo simulo y funciona todo perfecto, pero cuando llevo el programa al pic de manera física y lo conecto este no hace nada. Quiero hacer parpadear dos leds y mostrar una oración en un LCD 20X4.

Aquí dejo el codigo:
#INCLUDE <16F887.h>
#fuses HS, INTRC_IO, NOWDT, NOPROTECT, BROWNOUT, NOPUT, NOLVP,NOFCMEN
#USE DELAY (clock=8MHZ)
#include <lcd420.C>
#BYTE PORTB=6
#BYTE PORTA=5


MAIN()
{
setup_oscillator(OSC_8MHZ|OSC_INTRC);
set_tris_B(0);
set_tris_A(0B00000000);
LCD_INIT(); //Inicializa el LCD
delay_ms(20);
LCD_PUTC("\f"); //Borrar el contenido del LCD
WHILE(TRUE)
{
output_high(PIN_A0);
output_low(PIN_A1);
delay_ms(1000);
output_low(PIN_A0);
output_high(PIN_A1);
delay_ms(1000);
LCD_GOTOXY(1,1); //Se ubica En la columna 1 fila 1
printf(LCD_PUTC, "Control"); //Muestre el mensaje “Control”
LCD_GOTOXY(1,2); //Ubicarse en la columna 1 fila 2
LCD_PUTC("Automatico"); // Sacar el mensaje “Automatico”
DELAY_MS(20);
} //Cierra while true
}
Lo que veo es que declaras en los fuses el HS que es high speed de cristal y por otro lado declaras INTRC_IO que es el oscilador interno. Creo que te debe estar tomando como oscilador el de cristal y por eso no te funciona.
 
Buenos días. Mi duda es porque programo mi PIC 16F887 con el clock interno y lo simulo y funciona todo perfecto, pero cuando llevo el programa al pic de manera física y lo conecto este no hace nada. Quiero hacer parpadear dos leds y mostrar una oración en un LCD 20X4.

Aquí dejo el codigo:
#INCLUDE <16F887.h>
#fuses HS, INTRC_IO, NOWDT, NOPROTECT, BROWNOUT, NOPUT, NOLVP,NOFCMEN
#USE DELAY (clock=8MHZ)
#include <lcd420.C>
#BYTE PORTB=6
#BYTE PORTA=5


MAIN()
{
setup_oscillator(OSC_8MHZ|OSC_INTRC);
set_tris_B(0);
set_tris_A(0B00000000);
LCD_INIT(); //Inicializa el LCD
delay_ms(20);
LCD_PUTC("\f"); //Borrar el contenido del LCD
WHILE(TRUE)
{
output_high(PIN_A0);
output_low(PIN_A1);
delay_ms(1000);
output_low(PIN_A0);
output_high(PIN_A1);
delay_ms(1000);
LCD_GOTOXY(1,1); //Se ubica En la columna 1 fila 1
printf(LCD_PUTC, "Control"); //Muestre el mensaje “Control”
LCD_GOTOXY(1,2); //Ubicarse en la columna 1 fila 2
LCD_PUTC("Automatico"); // Sacar el mensaje “Automatico”
DELAY_MS(20);
} //Cierra while true
}
Hola, no veo declarado el NOMCLR.
Gracias por responder, ya agregue el NOMCLR y saque el HS como dijo @juanma2468 y sigue sin funcionar, me prende los dos leds directamente, no parpadean y la pantalla se muestra en azul sin texto sin importar la variacion de contraste.
 
Aunque el código es un caos debería funcionar aún sin las correcciones recientes.
Ya que se tomaría como fuse válido al segundo, o sea INTRC_IO
El uso de NOMCLR únicamente dependería de si se va a usar el reset o ese pin para entrada digital.
Y en dado caso, llevando el pin MCLR a un estado lógico alto se soluciona.
Tampoco tiene caso establecer nuevamente la configuración del oscilador, porque eso ya se hizo en la palabra de configuración.
Escribir constantemente lo mismo en la pantalla no tiene sentido aunque sea prueba, bastaría con escribir al inicio.
Ya agregué el NOMCLR y saque el HS como dijo @juanma2468 y sigue sin funcionar, me prende los dos leds directamente, no parpadean y la pantalla se muestra en azul sin texto, sin importar la variación de contraste.
Yo pienso que algo está mal conectando y que deberías subir fotos de las conexiones.
 
Atrás
Arriba