martes, 8 de enero de 2008

Direccion Web

Visita tambien la siguiente direccion:

http://pic16f877.dmchihuahua.com/


Recibo sus comentarios a iess2600(a)gmail .com

Gracias

viernes, 2 de noviembre de 2007

Programa Comunicacion SPI - Dos Microcontroladores 16F877A

Comunicaciòn Serial SPI con dos PIC 16F877A.

Este programa muestra el uso de comunicacion SPI entre dos microcontroladores 16F877A, como ya se vio la comunicacion usa basicamente tres lineas de comunicacion, la SDO (Salida de datos), SDI, Entrada de datos, SCK (Señal de reloj) y una opcional de SS o CS, Slave Select o Chip Select.


video

(Musica del video por Erick Johnson, espero no sea retirado de la Web)

Como se puede ver en el video, el Microcontrolador Master esta enviando datos por SPI al segundo uC el cual lo esta mostrando por medio de leds en le PortB. Mas interesante seria cuando monitoreamos un proceso usando SPI y podemos tomar decisiones desde el Slave o Master de acuerdo a la info que llega lo dejaremos para mas adelante, talvez para trabajar con variables fisicas como temperatura de manera que podamos tomar decisiones cuando alcance un valor predeterminado etc.

En el video podemos ver que cuando reseteamos al Master, el dato a ser enviado reinicia en ceros; pero cuando reseteamos al Slave, esta cuenta no se pierde pues el Master es quien la esta llevando. Si desconectamos el Chip Select SS', el Slave no es habilitado y se pierde la comunicacion SPI.

MASTER SPI.

Despues de configurar los TRIS de manera correcta, hacemos CKE=1, habilitamos el SPI, asignamos el estado idle del clock (1) y seleccionamos una frecuencia de trabajo.

El ChipSelect sera llevado a cabo mediante PortA, 2=0. y cada vez que haya transmision de un dato, incrementa el registro y llama al retardo para poder visualizarlo.

Del ASM:

; SPI_MASTER.asm
; PROGRAMA QUE ENVIA DATOS DE UN CONTADOR BINARIO A OTRO MICROCONTROLADOR USANDO COMUNICACION SPI
; EL MASTER SELECCIONA EL SLAVE USANDO EL PIN PORTA, 2. LA TRANSMISION INICIA CUANDO ESCRIBIMOS EL VALOR EN
; EL REGISTRO SSPBUF, LUEGO ESPERAMOS A QUE TERMINE TRANSMISION CHECANDO AL BIT BF DEL SSPSTAT
; CUANDO EL DATO ES ENVIADO, ESPERAMOS (RETARDO) PARA ENVIAR EL SIGUIENTE DATO.
; Fosc=4MHz


SLAVE SPI.

Configuramos PortA como salidas digitales, excepto PortA, 5 que sera entrada de SS'.

Despues de haber configurado los registros, el programa continuamente esta verificando si el bit BF ha sido puesto (transmision completa), cuando asi sea, mostrara el valor recibido por el puerto B

En ambos casos de transmision y recepcion, el sampleo se hara a la mitad del tiempo asignado y los datos seran transmitidos en la caida de la señal de Reloj.

Del ASM:

; SPI_SLAVE.asm
; PROGRAMA QUE RECIBE DATOS USANDO TRANSMISION SPI, CON CHIP SELECT Y MUESTRA EL DATO POR EL PORTB (LEDS)
; EL PROGRAMA CONTINUAMENTE BUSCA SI ES QUE HAY TRANSMISION (BF=1), CUANDO LA HAY, MUESTRA EL DATO EN EL
; PORTB MEDIANTE LEDS, ES AHI CUANDO PUEDE EFECTUAR OTRAS OPERACIONES.
; Fosc= 4MHz, VIDEO DISPONIBLE ONLINE, picmicrocontroller877.blogspot.com


Para la conexion usamos el sig diagrama:


Los archivos Hex son los siguientes:


HEX MASTER:

:020000040000FA
:1000000002201528A0018316031300308500073055
:100010009F00831603131030870040309400831232
:1000200003133230940005150800051120089300D1
:1000300083160313141C1A288312031313080515BF
:10004000A00A23201528FF30A100A200A10B26281A
:06005000A20B26280800A7
:00000001FF

HEX SLAVE:

:020000040000FA
:1000000002201228831603132030850007309F003A
:100010008601183087004030940083120313343077
:1000200094000800831603139430141C12288312C2
:0C00300003131308831203138600122828
:00000001FF

Saludos desde Chihuahua Mexico, links de Chihuahua: Turismo Chihuahua y Mapa Chihuahua


Espero sus comentarios.

.




lunes, 29 de octubre de 2007

Comunicacion SPI - PIC 16F877

El modo de comunicacion serial SPI, permite el envio y recepcion simultanea de 8 bit. Existen cuatro modos de configuracion que dependen de la polaridad y fase del reloj (CKP y CKE), los cuatro modos son soportados por el PIC 16F877.

Para la comunicacion se requieren basicamente de tres pines:

  • SDO (Serial Data Out) - RC5
  • SDI (Serial Data In) - RC4
  • SCK (Serial Clock) - RC3
Adicionalmente para la operacion en modo de Esclavo, se usa la terminal, Slave Select (SS') - RA5.

Registros.

Los registros a usar son:

  • SSPCON1 - Control Register
  • SSPSTAT - Status Register
  • SSPBUF - Buffer Register
  • SSPSR - Shift Register (no implementado fisicamente, pero se puede direccionar)
SSPSTAT. Muestra el Status de la transmision , el bit BF nos indica cuando la transmision del dato esta completa, los bit que no estan indicados en la figura no se usan en modo SPI.


SSPCON1. Este es el registro de controla para la comunicacion SPI, nos idica si hay una colision de informacion, Overflow, habilita el SSPI, polaridad del reloj, y otras configuraciones como Master o Slave, y velocidad de transmision.


Inicio de operacion.

Para inciar la operacion SPI, varias opciones deben ser seleccionadas, tales son:

  • Master Mode - SCK es salida
  • Slave Mode - SCK es entrada
  • Clock Polarity - Polaridad del Clock
  • Sample Phase Data Input - Al inicio o final del tiempo de salida
  • Clock Edge - Salida de info al subir o bajar SCK
  • Clock Rate - Solo para Master Mode
  • Slave Select Mode - Solo para Slave Mode
La informacion a transmitir es escrita en el registro SSPBUF, y pasa al SSPSR. El SSPSR transmite el byte mandando primero al bit MSb. Si mientras esta enviando se trata de escribir otro byte a SSPBUF, se pone en uno el bit WCOL indicando una colision de informacion (limpiar por software)

En la recepcion conforme el SSPSR recibe los 8 bits, los va pasando uno a uno al SSPBUF, cuando temina de enviar el byte, se pone en uno el bit BF (Buffer Full) y la bandera de interrupcion SSPIF.

Todos los registros asociados con la transmision SPI:


Conexion tipica SPI:

En la siguiente entrada veremos un programa de ejemplo para comunicar dos PIC 16F877 por medio de SPI.

.

Modulo MSSP del PIC 16F877A

Como ya se habia comentado muy al inicio del Blog, el microcontrolador PIC 16F877A tiene un modulo llamado MSSP (Master Synchronous Serial Port) que puede ser configurado para trabajar en dos modos de comunicacion: SPI (Serial Peripheral Interfase) e I2C (Inter-Integrated Circuit).


Ambos modos pueden usarse para comunicarce con otros dispocitivos compatibles con estos protocolos de comunicacion, como pueden ser EEPROMs, Shift registers, Convertidores A/D, otros microcontroladores, etc.

El modulo MSSP tiene asociados tres registros: Status Register (SSPSTAT), y dos registros de control (SSPCON1 y SSPCON2), el uso de cada registro y su configuracion individual depende del modo de comunicacion que se este empleando (SPI o I2C).


Diagrama a Bloques del modulo MSSP.



Como se puede ver en la imagen, el MSSP toma com base de tiempo el Timer 2, las terminales SDI y SDO van directamente sobre el Shift Register SSPSR, lo que permite la comunicacion serial. Cada parte del diagrama sera comentada en ambos modos de comunicacion al momento de ser vistos y explicados.


Saludos.

.

miércoles, 24 de octubre de 2007

PWM de Ancho Variable con PIC 16F877A

Variando el ancho del pulso PWM

Si variamos el valor del registro CCPR1L, estaremos variando el ciclo de trabajo del PWM. En este programa variamos ese registro usando un convertidor AD en la entrada AN0; el modulo PWM al igual que el programa anterior esta configurado a 250Hz y el ADC trabaja a 8 bit usando justificacion a la izquierda (ya visto antes).


video


En el Video se observa la variacion en la intencidad de luz conforme variamos el potenciometro del AD, de la misma manera se puede controlar la velocidad de un motor DC pues se esta controlando la energia que se le aplica por unidad de tiempo, lo que hace a esta tecnica muy eficiente pues no se disipa calor como en otras tecnicas de control.

09/Nov/07 Nota:Como se ve en el video, el LED esta un poco iluminnado debido a que los ultimos bit del Byte de configuracion (CCPCON1<5:4>) estan en 1, puedes cambiarlos a 00 sinproblema alguno en el ciclo de trabajo debido a que son los LSB, no cambia de manera significativa el ciclo, quedando practicamente a 50%.



video



En el Segundo video se observa como el Led actua sobre el sensor de la camara digital A95, lo que hace ver de una manera diferente la forma de onda de un PWM variando.



Baja el programa ASM, el esquematico de la entrada y salida para este programa es el siguiente:



Entrada y salida del programa PWM_MODULE_250Hz.asm

Programa Hex:

:020000040000FA
:1000000002201F2883160313F93092008312031372
:100010007C3095003C30970083160313071188014C
:1000200083120313073092008312031341309F00A1
:10003000831603130E309F008312031308008312EC
:1000400003131F151F1D22281E08950088001F2856
:00000001FF


Formas de Onda:


Forma de onda PWM a aprox. 50%





Forma de onda PWM a aprox. 90%


Saludos.


.

Programa del Modulo PWM

Este programa esta calculado para trabajar a una sola frecuencia y a un solo ciclo de trabajo, programa sin interrupciones.

El objetivo es tener una señal PWM de 250 Hz al 50% no modificable para lo cual se siguieron lo pasos:

  1. Dar valor a PR2 para el Periodo del PWM
  2. Para poner el ciclo de trabajo damos valor a CCPR1L y CCP1CON<5:4> (10 bits)
  3. Configurar la salida en RC2, haciendo BCF TRISC, 2
  4. Dar valor al prescaler del Timer 2 usando T2CON
  5. Configurar em modulo CCP1 para uso de PWM
Calculo de los valores para PWM.

Seleccionamos los valores que deseamos en la Frecuencia de PWM y Ciclo de trabajo. En este caso son 250 Hz y 50% respectivamente.

Usando las formulas dadas anteriormente despejamos la variable que nos interesa de la siguiente manera:
Calculo de PR2:

PR2 = (Periodo PWM/4*Tosc*Prescaler) - 1

Periodo PWM = 1/Fpwm = 4*10exp-3

Asi PR2 = 249D = F9h = 11111001b



Calculo de CCPR1L:CCP1CON<5:4>:

Tiempo de ciclo = % Ciclo de trabajo*Periodo PWM

CCPR1L:CCP1CON<5:4> = (% Ciclo/ Fpwm)/(Tosc*Prescaler)

CCPR1L:CCP1CON<5:4> = (50%/250)/(25*10exp-8*16) = 500

CCPR1L:CCP1CON<5:4> = 1F4h = 0111110100;

Asi cargamos

CCPR1L = 01111101 = 7Dd
CCP1CON<5:4> = 00

Usando la liga dada anteriormente se obtiene:

CCPR1L = 01111101 = 7Ch
CCP1CON<5:4> = 11b

Que son los valores cargados al programa

La forma de onda en el pin RC1 es similar a la siguiente (distorcion por falta de BW al osciloscopio):


Forma de onda del PWM 250 Hz al 50%

Se observa el ciclo de trabajo del 50%.

Baja el programa ASM, el HEX es el siguiente:


:020000040000FA
:100000000220172883160313F9309200831203137A
:100010007C3095003C30970083160313071188014C
:1000200083120313073092008312031308000000A9
:0200300018288E
:00000001FF


Saludos.

.

Modulo PWM del PIC 16F877A

El Modulo PWM del PIC 16F877 tiene una resolucion maxima de 10 bit y su salida se toma del pin RC2, por lo cual debe estar configurado como salida en el registro Tris C.


Periodo PWM

El Periodo del Modulo PWM es configurado dando un valor al registro PR2. Este periodo puede ser calculado usando la siguiete formula:

PWM Period = [(PR2) + 1] • 4 • TOSC • Prescale del Timer 2

Como ya es sabido la frecuencia esta determinada por 1/Periodo PWM

Cuando el valor del Timer 2 alcanza el valor de PR2, los siguientes eventos ocurren en el siguiente ciclo de tiempo:

- TMR2 es limpiado
- El pin CCP1 es puesto a 1
- El Periodo de trabajo del PWM es cambiado de CCPR1H a CCPR1L


Ciclo de trabajo del PWM

El ciclo de trabajo del PWM es determinado escribiendo al registro CCPR1L y CCP1CON<5:4> (10 bits de resolucion).

El ciclo de trabajo se obtiene usando la siguiente formula:

Tiempo de Trabajo PWM = (CCPR1L:CCP1CON<5:4>) •TOSC • (TMR2 Prescale Value)

Para modificar el ciclo de trabajo, en cualquier momento se puede escribir a CCPR1L y CCP1CON<5:4>, pero estos valores no seran tomados en consideracion hasta que el Timer alcance al PR2 y reinicie su operacion tomando en cuenta los nuevos valores.

Tiempo de trabajo = % Ciclo de trabajo / Fpwm

Para calcular la maxima resolucion del PWM a determinada frecuencia usamos la siguiente formula:



Formula para resolucion del modulo PWM



CONFIGURACION DEL PWM:

Pasos para la configuracion del Modulo PWM del PIC 16F877A

1. Configurar el Periodo dando un valor al registro PR2
2. Configurar el Ciclo de Trabajo escribiendo en: CCPR1L:CCP1CON<5:4>
3. Limpiar el Tris C, 2 para asignar la salida del modulo (CCP1)
4. Asignar el valor del Prescale del Timer 2 (T2CON)
5. Configurar el modulo CCP1 para operacion PWM.


Ejemplo de frecuencias y su resolucion


Para mas calculos del modulo PWM visita esta pagina:

http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html


.

Modulo PWM - Que es PWM

Què es PWM?


PWM = Pulse Width Modulation, Modulacion del Ancho de Pulso

La tecnica PWM tiene muchas aplicaciones como pueden ser un Dimmer de luz, Control de velocidad de un Motor, y Convertidores DA y AD.

Breve explicacion del PWM.

Hay muchos circuitos analogicos para el uso de PWM, por ej. los basados en el famoso LM555, que por medio de voltage hacemos que el pulso cambie su ancho.

La forma de onda de un PWM se puede ver enseguida:




Como se observa, se tiene la misma frecuencia con un diferente ancho de pulso (o cliclo de trabajo) de esta manera podemos regular la cantidad de energia que es aplicada a una planta como un motor DC o una lampara, controlando de esta manera su velocidad o intencidad de luz.

El uso de un microcontrolador con modulo de PWM tiene varias ventajas sobre un circuito analogico, como lo son la precision y un mejor control de las variables involucradas ademas de espacio y ahorro de energia. Como el micro trabaja a 5V, puede usarse como disparador de Driver como un transistor de potencia o SCR para controlar cargas mayores.

.

Programa del Timer 2

El programa del Timer 2 inicialmente esta configurado con un Prescaler de 1:4 y un Postscaler 1:16, tiene interrupciones de Timer 2 y Externa habilitadas.

Cuando la interrupcion del Timer sucede, hace que se incremente una cuenta por el Puerto D.

Cuando la interrupcion Externa ocurre, cambia los valores del Postscale y Prescale a 1:1 haciendo en conteo mas rapido como se observa en el video.


video

El Archivo ASM lo encuentras aqui, el esquematico es el mismo que el del Timer 1 y el HEX es el siguiente:

:020000040000FA
:04000000202036285E
:08000800831203138B1C09286D
:100010003828831203138C1C09003D288312031314
:060020008B108C1009009A
:1000400083120313D0308B00793092008316031390
:1000500002308C00F230920040308100860188012D
:100060008312031386018801121508000000372847
:1000700083120313043092000E2883120313880A9C
:020080000E2848
:00000001FF

.

lunes, 22 de octubre de 2007

Timer 2 del PIC 16F877A

El Timer 2 del PIC 16F877 es de 8 bit, tiene un Prescaler y un Postscaler, puede ser usado como base de tiempo del modulo PWM. El registro de conteo TMR2 es leible y escribible, y es limpiado por cualquier Reset.

El Timer 2 tiene un registro de Periodo PR2 que a diferencia de los anteriores que terminaban en FFh o FFFFh utiliza este registro el cual le indica al Timer 2 cuando reiniciarce utilizando un comparador interno. PR2 tiene un FFh al Reset.

Es importante ver y entender el diagrama de bloques del Timer 2 que se muestra enseguida:



Diagrama a bloques del Timer 2

En el se puede ver que al estar contando los ciclos de reloj Fosc/4, despues del prescaler seleccionable, se va incrementando el registro TMR2, el resultado entra al comparador que continuamente hace su trabajo comparando con PR2 (FFh al inicio). El resultado del compardor pasa por el Postscaler seleccionable el cual se encarga de poner la bandera en un momento determinado.

.
Google