Vistas de página en total

jueves, 25 de agosto de 2011

Proyecto Multímetro inalámbrico


Explicación del proyecto:
El proyecto que tuvimos que realizar es un voltimetro inalambrico. Este proyecto se divide en 2 placas que funcionan de la siguiente manera: una toma el valor de tension en el potenciometro y lo convierte a valores binarios (unos y ceros) para luego trasmitirlos a través de un led infrarrojo( que es el que conmunmente podemos encontrar en un control remoto de un television , dvd , etc). La otra placa debe recibir este codigo binario , transformarlos a valores de tensión (o analñogicos) y mostrarlos en una pantalla de lcd de 16x2.

Protocolo utilizado: Para poder transmitir un valor de tension y poder "traducirlo" del otro lado, es necesario establecer un protocolo , para poner de acuerdo qué va a ser un valor , y qué va a ser otro valor. Un ejemplo sencillo seria el de dos barcos que se ven enfrentados a distancia. El único elemento que poseen es una linterna. Un barco , prende y apaga esa linterna 5 veces , y entre ellos entienden que al prender y apagar esa linterna , significa que un barco va a atacar a otro. En cambio , si prende y apaga la linterna 10 veces , los dos barcos saben que uno se va a retirar. Eso es establecer un protocolo , comunicarse a partir de algo que dos objetos ya tienen definido de antemano.
En nuestro caso , un 1 , en codigo binario , equivaldría a 15 pulsos de una señal cuadrada , para la cual el tiempo de estado en alto es de 13 microsegundos , y el de estado en bajo es de otros 13 microsegundos , lo que genera una frecuencia de aproximadamente 38Mhz , que es a la que el receptor trabaja y reconoce las señales mandadas correctamente. Estos unos y ceros son los conseguidos en la conversión de tensión de potenciómetro , los cuales son mandados de a uno por vez, por ejemplo si medimos 5V y al convertirlo se transforma en 10100101, el transmisor primero mandara un 1 , despues un 0 , despues un 1 , y asi sucesivamente. .



Restricciones a tener en cuenta:
1)La unidad Tx transmite el valor analógico al Rx ; y éste lo muestra en el LCD

2)La transmisión se realiza cuando se pulsa Tx

3)El alcance no debe ser menor a 2 metros(en línea recta)

4)Al conectar el Rx se debe leer : "Sistema Tx Rx por IR" durante 5 segundos , y luego mostrar el úmtimo valor enviado por el Tx

5)Se debe mostrar la tensión medida en la entrada del PIC12F683(Va)

Otras utilidades:
Quizás al no tener muchos conocimientos sobre la electrónica , hablar de tensión en un potenciometro , y poder verlo en una pantalla no posee mucho interés. Pero podríamos en lugar de medir tensión , colocarle un sensor de temperatura. Esto nos serviría por ejemplo para poder colocar este sensor fuera de la casa, en un balcón por ejemplo , y poder medir a través de un vidrio la temperatura que hay fuera de nuestra casa.
Cabe aclarar que el funcionamiento de los controles remotos se basa en este tipo de comunicación por inflarrojo , asique de alguna manera podríamos diseñar un control para poder controlar las velocidades de un ventilador , su pendido o su apagado; o apagar una luz a la distancia
Circuito esquemático de la parte de Transmisión:
Plaqueta de la parte de Transmisión:



Imagen de la cerigrafía espejada

Imagen de las pistas de la placa

Circuito esquemático de la parte de Recepción y LCD 

PCB la parte de Recepción y LCD

Diagrama de pistas


Imágenes para imprimir sobre la plaqueta 







Programa de transmision:


; Configuro Registros

bank0
clrf GPIO ;Borro el puerto y configuro las
movlw 0x07 ;entradas anulando los comparadores
movwf CMCON0
bank1
clrf ANSEL ; I/O digitales
movlw B'00001000' ; GP5=GP4=GP2=GP1=GP0/Salidas
movwf TRISIO ; GP3=Entradas
movlw 0x70 ; Clock Interno a 8 MHz
movwf   OSCCON
clrf OPTION_REG ; Pullup habilitado GPPU (general)
movlw 0x36
movwf WPU ; Pullups individuales habilitados
bank0              ; Hay que pullupear GP3 externamente
bcf     LED_IR_OUT ; Apago el led IR



; Programa principal

Conversion
banksel TRISIO
bsf TRISIO,0
banksel ANSEL
movlw b'01110001'
iorwf ANSEL
banksel ADCON0
movlw b'10000001'
movwf ADCON0
call Retardo_1ms
bsf ADCON0,GO
btfsc ADCON0,GO
goto $-1
banksel ADRESH
movf ADRESH,W
movwf RESULTHI
banksel ADRESL
movf ADRESL,W
movwf valor_ADC





movlw .8
movwf contador                    ;le doy el valor 8 a contador

Aca

bcf STATUS,C                   ;pongo el Carry en cero
movf constante
movwf valor_ADC
rlf valor_ADC,F                  ;roto a la izquierda el resultado de la conversion
btfss STATUS,C                  ;pregunto si el Carry esta en 1 , si lo esta , vaya a TX_uno , sino a TX_cero
goto TX_cero
goto TX_uno
ABC
decfsz contador,F                 ;decremento la variable contador en 1
goto Aca
goto Conversion
TX_uno
movlw .30
movwf constante2 ;le doy el valor 30 a constante 2
M
bsf     LED_IR_OUT            ;pongo en 1 la  GP2
goto $+1
goto $+1                              ;genero retardo
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
bcf LED_IR_OUT         ;pongo en 0 GP2
goto $+1
goto $+1
goto $+1
goto $+1 ;genero retardo
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
decfsz constante2                                ;decremento constante2 en uno, si esta en 1 repito lo de abajo de M
goto M
call Retardo_10ms
goto ABC                                           ;vuelvo a repetir todo

TX_cero
movlw .15
movwf constante1 ;le doy el valor 15 a constante1
A
bsf     LED_IR_OUT         ;pongo en 1 GP2
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1                                              ;genero retardo
 goto $+1
goto $+1
 goto $+1
 goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
bcf LED_IR_OUT         ;pongo en 0 GP2
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1                                             ;genero retardo
 goto $+1
goto $+1
 goto $+1
 goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
decfsz constante1 ;decremento constante1 y si no esta en 0 ,repito lo de abajo de A
goto A
call Retardo_10ms                              ;retardo      
goto ABC ;vuelvo a ABC para hacer el procedimiento de vuelta


        #include <RETARDOS.INC>

END

Hojas de Datos:
Pic 16f84a   http://ww1.microchip.com/downloads/en/devicedoc/35007b.pdf
Pic 12f683  http://ww1.microchip.com/downloads/en/devicedoc/41211d_.pdf
IRM 8501  http://www.alldatasheet.com/datasheet-pdf/pdf/109788/ETC/IRM8602.html


INDEXADO_02

En lenguaje ASSEMBLER

;====================================================================
; Programa principal
;====================================================================
ABC 
movf  PORTA,W 
andlw b'00000111' 
addwf PCL,F 
goto  VACIO 
goto  LLENANDOSE 
goto  ALARMA_A 
goto  LLENO 
goto  ALARMA_B 
goto  ALARMA_C 
goto  ALARMA_D 
goto  REBOSE 


VACIO 
movlw b'1100001' 
goto  XYZ  


LLENANDOSE 
movlw b'1100010' 
goto  XYZ 


ALARMA_A 
movlw b'10000' 
goto  XYZ 


LLENO 
movlw b'100100' 
goto  XYZ 


ALARMA_B 
movlw b'10000' 
goto  XYZ 


ALARMA_C 
movlw b'10000' 
goto  XYZ 


ALARMA_D 
movlw b'10000' 
goto  XYZ 


REBOSE 
movlw b'1000' 


XYZ 
movwf PORTB 
goto  ABC



DE OTRA MANERA:
; Definiciones y Equivalencias
;====================================================================
#DEFINE SV PORTA,0 ;SV es RA0 
#DEFINE SLL PORTA,1 ;SLL es RA1
#DEFINE SR PORTA,2 ;SR es RA2
#DEFINE VACIO PORTB,0 ;VACIO es la pata RB0
#DEFINE LLENANDOSE PORTB,1 ;LLENANDOSE es RB1
#DEFINE REBOSE PORTB,2 ;REBOSE es RB2
#DEFINE LLENO PORTB,3 ;LLENO es RB3
#DEFINE ALARMA PORTB,4 ;ALARMA es RB4
#DEFINE BOMBA1 PORTB,5 ;BOMBA1 es RB5
#DEFINE BOMBA2 PORTB,6 ;BOMBA2 es RB6


;====================================================================
; Programa principal
;====================================================================
ABC 


VACIADO
btfsc SR ;Verifica el estado de SR para ver si esta en 0
goto REBOSE1
btfsc SLL ;Verifica si SLL esta en 0
goto LLENO1
btfsc SV ;Verifica el estado de SV para ver si esta en 0
goto LLENADO
bsf VACIO ;deja en 1 a VACIO
bsf BOMBA1 ;activa la bomba 1
bsf BOMBA2 ;activa la bomba 2


LLENADO
    clrf    PORTB ;Deja todo el PUERTOB en 0
btfsc SV ;Verifica si SV esta en 0
goto    LLENO1
bcf VACIO ;Deja a VACIO en 0
bsf BOMBA1 ;Activa la bomba 1
bsf BOMBA2 ;Activa la bomba 2
bsf LLENANDOSE ;Activa LLENANDOSE


LLENO1
btfsc SLL ;Verifica si SLL esta en 0
goto REBOSE1
bcf LLENANDOSE ;Apaga LLENANDOSE
bsf BOMBA1 ;Prende bomba 1
bcf BOMBA2 ;Apaga bomba 2
bsf LLENO

REBOSE1
btfsc SR ;Verifica si ST esta en 0
goto ALARMA1
bcf BOMBA1 ;Apaga bomba 1
bcf LLENO ;apaga LLENO
bsf REBOSE ;Prende REBOSE
goto ABC


ALARMA1
bsf ALARMA ;Enciende ALARMA
bcf BOMBA1 ;Apaga bomba 1
bcf BOMBA2 ;Apaga bomba 2


;====================================================================
END ;Directiva que indica la finalización del pgm





En lenguaje C




#include "C:\Problema\problema.h"




void main()
{
while(1){


switch (input_a()){
   case 0:
    output_b(0b01100001);
    break
   case 1:
    output_b(0b01100010);
    break
   case 2:
    output_b(0b00010000);
    break
   case 3:
    output_b(0b00100100);
    break
   case 4:
    output_b(0b00010000);
   case 5:
    output_b(0b00010000);
    break
   case 6:
     output_b(0b00010000);
    break
   case 7:
    output_b(0b00001000);
    break


}

lunes, 15 de agosto de 2011

Ejercicios Capitulo 8

Ejercicios ASM



Elemental_01.asm: Por el puerto B se obtiene el dato de las cinco líneas del Puerto A , al que se está conectado un array de interruptores , sumándole el valor de una constante , por ejemplo 74 decimal. Es decir (PORTB)= (PORTA)+Constante
1)
;====================================================================
 Main
;====================================================================
; El código que sigue es un ejemplo de configuración de puertos
; Configuro los puertos I/O
                BANK1
                movlw     b'11111'
                movwf    TRISA       ;todo el PORTA como entrada
                movlw     b'00000000' ;todo el PORTB como salida
                movwf    TRISB
                BANK0
;====================================================================
; Programa principal
;====================================================================
 ABC       
    movf   PORTA,W
                addlw      K
                movf       PORTB  
    goto    ABC

;====================================================================



Elemental_02.asm: Por el Puerto B se obtiene el dato del Puerto A multiplicando por 2. Es decir : (PORTB) = 2(PORTA) =(PORTA)+(PORTA)
2)
;====================================================================
Main
;====================================================================
; A partir de aqui se escribe el pgm principal
; A partir de aquí incluí tu código

; El código que sigue es un ejemplo de configuración de puertos
; Configuro los puertos I/O
                BANK1
                movlw     b'11111'
                movwf    TRISA       ;todo el PORTA como entrada
                movlw     b'00000'
                movwf    TRISB
                BANK0
;====================================================================
; Programa principal
;====================================================================
                movf       PORTA,W              
                addwf     PORTA,PORTB
;====================================================================





Elemental_03.asm: Por el Puerto B se obtiene el dato introducido por el Puerto A , pero los bits pares de salida se fijan siempre a “1”. El orden de los bits será “b7 b6 b5 b4 b3 b2 b1 b0” , siendo los pares el b6 , b4, b2 , y b0. Por ejemplo , si el Puerto A se introduce el dato ‘---01100’, por el Puerto B se visualiza ‘ ---11101’. Observa que:
-Los bits pares están a “1”, efectivamente (Puerto B)= ‘---1x1x1’
-Los impares permanecen con el datos con el dato del puerto de entrada , efectivamente: (Puerto A) = ‘---x1x0x’ y (Puerto B) = ‘---x1x0x’
3)
Main
;====================================================================
; A partir de aqui se escribe el pgm principal
; A partir de aquí incluí tu código
; El código que sigue es un ejemplo de configuración de puertos
; Configuro los puertos I/O
                BANK1
                movlw     b'11111'
                movwf    TRISA       ;todo el PORTA como entrada
                movlw   b'00000000'
    movwf   TRISB       
                BANK0
;====================================================================
; Programa principal
;====================================================================
  ABC
   movf     PORTA,W
   movwf    PORTB
   bsf      PORTB,8
   bsf      PORTB,6
   bsf      PORTB,4
   bsf      PORTB,2
   goto     ABC
;====================================================================




Elemental_04.asm: Por el Puerto B se obtiene el contenido del Puerto A , pero los bits impares de salida se fijan a “0”. El orden de los bits será “b7 b6 b5 b4 b3 b2 b1 b0”, siendo los impares el b7, b5 , b3 , b1. Por ejemplo , si por el puerto B se introduce el dato b’---01100’ , por el Puerto B se visualiza ‘00000100’. Observar que:
-          Los bits impares están en “ 0 “ , efectivamente (Puerto B) = ‘0x0x0x0x’
-          -Los pares permanecen con el dato del puerto de entrada , efectivamente : (Puerto A) = ‘---0x1x0’ y (Puerto B) = ‘ –0x1x0’
4)
Main
;====================================================================
; A partir de aqui se escribe el pgm principal
; A partir de aquí incluí tu código
; El código que sigue es un ejemplo de configuración de puertos
; Configuro los puertos I/O
                BANK1
                movlw     b'11111'
                movwf    TRISA       ;todo el PORTA como entrada
                movlw     b'00000000'          
    movwf   TRISB       ;todo el PORTB como salida
                BANK0
;====================================================================
; Programa principal
;====================================================================
 Loop 
   movf   PORTA,W
   movlw  PORTB
   bcf    PORTB,7
   bcf    PORTB,5
   bcf    PORTB,3
   bcf    PORTB,1
   goto   Loop
;====================================================================


Elemental_05.asm:  Por el Puerto B se obtiene el dato del Puerto A invertidos los unos y los ceros. Por ejemplo , si por el Puerto A se introduce ‘---11001’, por el Puerto B aparecerá ‘xxx00110’. (No importa el estado de los tres bits superiores del Puerto B)
5)
Main
;====================================================================
; A partir de aqui se escribe el pgm principal
; A partir de aquí incluí tu código
; El código que sigue es un ejemplo de configuración de puertos
; Configuro los puertos I/O
                BANK1
                movlw     b'11111'
                movwf    TRISA       ;todo el PORTA como entrada
                movlw   b'00000000'
    movwf   TRISB       
                BANK0
;====================================================================
; Programa principal
;====================================================================
 ABC  
    movf    PORTA,W
    xorlw   11111
    movwf   PORTB
    goto    ABC
;====================================================================




Elemental_06.asm: Por el Puerto B se obtiene el dato del Puerto A intercambiado los nibbles alto y bajo. Por ejemplo , si por el Puerto A se introduce ‘---1001’, por el Puerto B apare ‘1001xxx1’.
6)
Main
;====================================================================
; A partir de aqui se escribe el pgm principal
; A partir de aquí incluí tu código
; El código que sigue es un ejemplo de configuración de puertos
; Configuro los puertos I/O
                BANK1
                movlw     b'11111'
                movwf    TRISA       ;todo el PORTA como entrada
                movlw     b'00000000'          
    movwf   TRISB       ;todo el PORTB como salida
                BANK0
;====================================================================
; Programa principal
;====================================================================
 Loop 
   movf   PORTA,W
   swapf  W,PORTB
   goto   Loop
;====================================================================



Elemental_07.asm: Por el Puerto B se obtiene el dato del Puerto A despazando un bit hacia la izquierda , por la derecha entrará un “1”. Por ejemplo , si por el Puerto A se introduce “---11001”, por el Puerto B aparecerá “xx110011”
7)
Main
;====================================================================
; A partir de aqui se escribe el pgm principal
; A partir de aquí incluí tu código
; El código que sigue es un ejemplo de configuración de puertos
; Configuro los puertos I/O
                BANK1
                movlw     b'11111'
                movwf    TRISA       ;todo el PORTA como entrada
                movlw   b'00000000'
    movwf   TRISB       
                BANK0
;====================================================================
; Programa principal
;====================================================================
 ABC 
   rlf     PORTA,W
   addlw   .1
   movwf   PORTB
   goto    ABC  
;====================================================================


Elemental_08.asm: Por el Puerto B se obtiene el dato del Puerto A despazando un bit hacia la derecha , por la izquierda entrará un “1”. Por ejemplo , si por el Puerto A se introduce “---11001”, por el Puerto B aparecerá “0xxx1100’
8)
Main
;====================================================================
; A partir de aqui se escribe el pgm principal
; A partir de aquí incluí tu código
; El código que sigue es un ejemplo de configuración de puertos
; Configuro los puertos I/O
                BANK1
                movlw     b'11111'
                movwf    TRISA       ;todo el PORTA como entrada
                movlw   b'00000000'
    movwf   TRISB       
                BANK0
;====================================================================
; Programa principal
;====================================================================
 ABC
   rrf     PORTA,W
   bcf     W,7
   movwf   PORTB  
   goto    ABC  
;====================================================================



Elemental_09.asm: Por el Puerto  B se saca el dato del Puerto A invirtiendo los bits pares . Los impares se dejan como entrada.
9)
Main
;====================================================================
; A partir de aqui se escribe el pgm principal
; A partir de aquí incluí tu código
; El código que sigue es un ejemplo de configuración de puertos
; Configuro los puertos I/O
                BANK1
                movlw     b'11111'
                movwf    TRISA       ;todo el PORTA como entrada
                movlw   b'00000000'
    movwf   TRISB       
                BANK0
;====================================================================
; Programa principal
;====================================================================
 ABC  
    movf    PORTA,W
    xorlw   b'01010101'
    movwf   PORTB
    goto    ABC
;====================================================================


Elemental_10.asm: Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A al que esta conectado un array de interruptores. Esta operación se realizará una única vez . Despues del programa entrara en modo Standby o de bajo consumo el cual no podrá salir 
10)
Main
;====================================================================
; A partir de aqui se escribe el pgm principal
; A partir de aquí incluí tu código
; El código que sigue es un ejemplo de configuración de puertos
; Configuro los puertos I/O
                BANK1
                movlw     b'11111'
                movwf    TRISA       ;todo el PORTA como entrada
                movlw     b'00000000'          
    movwf   TRISB       ;todo el PORTB como salida
                BANK0
;====================================================================
; Programa principal
;====================================================================
   movf   PORTA,W
   movwf  PORTB
   sleep
;====================================================================

En C:

1)
void main()
{
while(1){
output_b(input_a()+55);
}
}
2)

void main()
{
while(1){
output_b(input_a()*2);
}
}
3)

void main()
{
while(1){
output_b(input_a()|0b10101);  
}
}


4)


void main()

{
while(1){
output_b(input_a()&0b10101);
}
}


5)



void main()
{
while(1){
output_b(input_a()^01010101);
}
}


6)

void main()
{
while(1){
swap(input_a());
output_b(input_a());
}
 }


7)



void main()
{
while(1){
rotate_left(input_a(), 1);
bit_set(input_a(),0);
output_b(input_a());
}   
}


8)

void main()
{
while(1){
rotate_right(input_a(), 1);
output_low(input_a(),7);
output_b(input_a());
}   
}



9)



void main()
{
while(1){
output_b(input_a()^11111);
}
}


10)



void main()
{
output_b(input_a());
sleep();
}