Mensajes recientes

Páginas: [1] 2 3 4 5 6 7 8 9 10
1
Almacén del Assembler / Ayuda con Cascada y Scroll - Matriz de LEDs 8x8 MAX7219
« Último mensaje por Alan Valdivia en 23 de Septiembre de 2017, 23:24:11 »
Buenas, como ya mencioné en un post pasado, estoy realizando el control de 4 matrices de LED's 8x8, controlando las letras que se elijen mediante el celular, con un módulo Bluetooth, programando todo en assembler, con el PIC16F88.

Estoy tratando de ponerlas en cascada, y que las letras se vayan desplazando por las matrices. Logré ponerlos en cascada, y almenos en el simulador de proteus y MPLAB, el programa funciona bien, pero cuando lo conecto en la realidad, no funciona, todas las matrices aparecen con todos sus LED's encendidos, y no entiendo por qué, en el simulador funciona perfecto. Revisé varias veces el conexionado, todos los CLK y CS de las matrices están conectados entre ellos, y conecté el DIN al pic, y a los demás DIN les conecté el DOUT del otro. (Adjunto foto del circuito, el de verdad y el simulado en proteus).







El programa a continuación lo hice solo para probar las matrices en cascada, el que tiene configurada la transmisión bluetooth y funciona bien, es otro. Lo único que hace el siguiente programa es escribir mi nombre (Alan), constantemente.

Código: [Seleccionar]
LIST        p=16F88             
#INCLUDE    <P16F88.INC> 
ERRORLEVEL  -302

__CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

CBLOCK 0x20
Timer
Register
Value
Register0
Value0
Register1
Value1
Register2
Value2
Register3
ENDC

CBLOCK 0x30
Value3
SendRegister
SendValue
Matrices
Matrices_temp
Temp
Contador
Letra
Temp1
ENDC

W_TEMP        EQU   0x7D
STATUS_TEMP   EQU   0x7E
PCLATH_TEMP   EQU   0x7F 

DATAEE        ORG  0x2100
    DE        "MCHP" 

RESET     ORG     0x0000           
          PAGESEL START
          GOTO    START     

ISR       ORG     0x0004           

          MOVWF   W_TEMP           
          MOVF    STATUS,W         
          MOVWF   STATUS_TEMP     
          MOVF    PCLATH,W         
          MOVWF   PCLATH_TEMP       

          MOVF    PCLATH_TEMP,W     
          MOVWF   PCLATH           
          MOVF    STATUS_TEMP,W     
          MOVWF   STATUS           
          SWAPF   W_TEMP,F
          SWAPF   W_TEMP,W         
          RETFIE   

START
movlw    b'01100001'
        BANKSEL OSCCON
        movwf    OSCCON
        btfss    OSCCON,IOFS
        goto    $-1
 
banksel PORTA
CLRF PORTA

banksel PORTB
CLRF PORTB

banksel ANSEL  
clrf ANSEL

banksel TRISA
clrf TRISA
clrf TRISB

banksel OPTION_REG
movlw b'10000111'
movwf OPTION_REG

banksel INTCON
clrf INTCON

banksel PIR1
clrf PIR1

banksel PIE1
clrf PIE1

banksel PIR2
clrf PIR2  

banksel PIE2
clrf PIE2

banksel PCON
clrf PCON

banksel ADCON0
clrf ADCON0

banksel ADCON1
movlw b'10000000'
movwf ADCON1

banksel PORTB
Setup
#define DIN PORTB,1
#define LOAD         PORTB,2
#define CLK PORTB,3

movlw .4
movwf Matrices
clrw
call SetDecodeMode
movlw 0x0f
call SetIntensity
movlw 0x07
call SetScanLimit
call Display_ON
clrw
call SetDisplayTest
clrf Matrices

Main
call Cambiar_Matriz
movlw 'A'
call Bucle_letra
call Delay_1s
call Cambiar_Matriz
movlw 'L'
call Bucle_letra
call Delay_1s
call Cambiar_Matriz
movlw 'A'
call Bucle_letra
call Delay_1s
call Cambiar_Matriz
movlw 'N'
call Bucle_letra
call Delay_1s
call Clear_All
call Delay_1s
clrf Matrices
goto Main

Values
movlw .4
xorwf Matrices,0
btfss STATUS,Z
goto $+4
movf Value, 0
movwf Value3
return
movlw .3
xorwf Matrices,0
btfss STATUS,Z
goto $+4
movf Value,0
movwf Value2
return
movlw .2
xorwf Matrices,0
btfss STATUS,Z
goto $+4
movf Value,0
movwf Value1
return
movf Value, 0
movwf Value0
return

Registers
movlw .4
xorwf Matrices,0
btfss STATUS,Z
goto $+4
movf Register, 0
movwf Register3
return
movlw .3
xorwf Matrices,0
btfss STATUS,Z
goto $+4
movf Register,0
movwf Register2
return
movlw .2
xorwf Matrices,0
btfss STATUS,Z
goto $+4
movf Register,0
movwf Register1
return
movf Register, 0
movwf Register0
return

Cambiar_Matriz
movlw .4
xorwf Matrices,0
btfsc STATUS,Z
goto Main
incf Matrices,1
return

;------------------------------------------------------------------------------------------------
; Retardos
;------------------------------------------------------------------------------------------------
Delay_1s
movlw .20
movwf Timer
call Delay_50ms
decfsz Timer,1
goto $-2
return

Delay_50ms
movlw .61
movwf TMR0
clrw
subwf TMR0,W
btfss STATUS,Z
goto $-3
return
;------------------------------------------------------------------------------------------------
; Enviar datos
;------------------------------------------------------------------------------------------------
Send

movf Matrices,0
movwf Matrices_temp
S1 call CS
            movlw .16
bcf LOAD
Send_Loop
bcf DIN
btfsc SendRegister, 7
bsf DIN
rlf SendValue, 1
rlf SendRegister, 1
bsf CLK
nop
bcf CLK
addlw 0xff
btfss STATUS, Z
goto Send_Loop
decfsz Matrices_temp,1
goto S1
bsf LOAD
return

CS
movlw .4
xorwf Matrices_temp,0
btfss STATUS,Z
goto $+6
movf Register3, 0
movwf SendRegister
movf Value3,0
movwf SendValue
return
movlw .3
xorwf Matrices_temp,0
btfss STATUS,Z
goto $+6
movf Register2, 0
movwf SendRegister
movf Value2,0
movwf SendValue
return
movlw .2
xorwf Matrices_temp,0
btfss STATUS,Z
goto $+6
movf Register1, 0
movwf SendRegister
movf Value1,0
movwf SendValue
return
movf Register0, 0
movwf SendRegister
movf Value0, 0
movwf SendValue
return
;------------------------------------------------------------------------------------------------
; Configurar decode mode
;------------------------------------------------------------------------------------------------
SetDecodeMode
movwf Value0
movwf Value1
movwf Value2
movwf Value3
movlw 0x09
movwf Register0
movwf Register1
movwf Register2
movwf Register3
goto Send
;------------------------------------------------------------------------------------------------
; Configurar intensidad
;------------------------------------------------------------------------------------------------
SetIntensity
movwf Value0
movwf Value1
movwf Value2
movwf Value3
movlw 0x0a
movwf Register0
movwf Register1
movwf Register2
movwf Register3
goto Send
;------------------------------------------------------------------------------------------------
; Configurar columnas
;------------------------------------------------------------------------------------------------
SetScanLimit
movwf Value0
movwf Value1
movwf Value2
movwf Value3
movlw 0x0b
movwf Register0
movwf Register1
movwf Register2
movwf Register3
goto Send
;------------------------------------------------------------------------------------------------
; Configurar Shutdown
;------------------------------------------------------------------------------------------------
Display_ON
movlw 0x01
goto SetShutdown

Display_OFF
movlw 0x00

SetShutdown
movwf Value0
movwf Value1
movwf Value2
movwf Value3
movlw 0x0c
movwf Register0
movwf Register1
movwf Register2
movwf Register3
goto Send
;------------------------------------------------------------------------------------------------
; Configurar Test
;------------------------------------------------------------------------------------------------
SetDisplayTest
movwf Value0
movwf Value1
movwf Value2
movwf Value3
movlw 0x0f
movwf Register0
movwf Register1
movwf Register2
movwf Register3
goto Send
;------------------------------------------------------------------------------------------------
; Clarear
;------------------------------------------------------------------------------------------------
Clear_All
movlw .4
movwf Contador
movlw .1
movwf Matrices
r1 call Clear
decfsz Contador,1
goto $+2
return
incf Matrices,1
goto r1

Clear
movlw 0x00
movwf Temp
movlw 0x08
movwf Register
Bucle
call Registers
movf Temp, w
movwf Value
call Values
call Send
decfsz Register, 1
goto Bucle
return
;------------------------------------------------------------------------------------------------
; Letras
;------------------------------------------------------------------------------------------------
Bucle_letra
movwf Letra
movlw 0x01
movwf Register
r2 call Registers
call Elegir_letra
movwf Value
call Values
call Send
incf Contador,1
incf Register,1
movlw 0x09
xorwf Register,0
btfss STATUS,Z
goto r2
clrf Contador
return

Elegir_letra
movlw .4
movwf PCLATH
movlw 'A'
xorwf Letra,0
btfss STATUS,Z
goto $+3
call A_
return
movlw 'L'
xorwf Letra,0
btfss STATUS,Z
goto $+3
call L_
return
call N_
return

;------------------------------------------------------------------------------------------------
; Letras
;------------------------------------------------------------------------------------------------
ORG 0x400
A_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'01111111'
retlw b'10001000'
retlw b'10001000'
retlw b'10001000'
retlw b'10001000'
retlw b'01111111'
retlw b'00000000'

L_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'11111111'
retlw b'00000001'
retlw b'00000001'
retlw b'00000001'
retlw b'00000001'
retlw b'00000000'
retlw b'00000000'

N_
movf Contador,0
addwf PCL,f
retlw b'00000000'
retlw b'11111111'
retlw b'01110000'
retlw b'00111000'
retlw b'00011100'
retlw b'00001110'
retlw b'11111111'
retlw b'00000000'


END

En fin, si alguno tuvo un problema similar, o sabe la solución, por favor explíqueme que estoy haciendo mal.

Esto es lo que se ve al conectarlo...


PD: Les dejo adjunto el .hex y el .dsn de proteus por si quieren testearlo.
2
CNC - Control Numérico Computarizado / Re:Eje Z muy largo para CNC
« Último mensaje por miltonmc en 23 de Septiembre de 2017, 23:05:46 »
saludos este va a ser una mejor opción para el eje Z
3
PLC - Control Lógico Programable / Respaldar programa de PLC FATEK y de HMI OP320-A
« Último mensaje por WICA en 23 de Septiembre de 2017, 16:19:43 »
Necesito saber como poder respaldar los programas de ambos dispositivos, sobre todo como reprogramarlos. Estos dos equipos sirven para el corte de bolsas de plástico, gracias por su pronta respuesta.
4
CNC - Control Numérico Computarizado / Control de ejes Mach3
« Último mensaje por santamariasebas en 23 de Septiembre de 2017, 13:49:58 »
Hola!! soy nuevo en el foro y tengo un inconveniente con mach3, he aplicado mach3 a una maquina de impresion y necesito hacer andar dos de los ejes x e y en forma independiente y que pueda variar la velocidad de los mismo pero controlado por entrads analogicas y variar la velocidad de cada uno, las entradas analogicas estan funcionando y el arranque de cada uno tambien, pero no puedo variar la velocidad del eje x sin que me varie la del eje y, alguien que me pueda ayudar seria genial?? un saludo grande!!!
5
Lenguaje C para microcontroladores PIC / Re:PIC24FJ64GA002 + ENC28J60 ... Como inicio?
« Último mensaje por KILLERJC en 23 de Septiembre de 2017, 12:03:51 »
Sinceramente no se en que parte estas, yo personalmente nunca toque el stack de Microchip, pero voy a intentar explicar lo que hizo jfmateos.

Lo que hizo jfmateos por lo que entiendo es que, crea una nueva definicion para una placa que no sea de las que da soporte directamente Microchip.

Entonces en el archivo hardwareprofile.h que contiene todos los FUSES de la placa que se va a usar, siempre hablando de placas ya prearmadas que ofrece microchip, agrega una nueva "placa" y lo hace con:

Código: C
  1. #if defined(CFG_INCLUDE_HACKERMESH)
  2.         #include "Configs/HWP HACKERMESH.h"

imagino que le hace falta un #endif.

Ahora el tema esta que para que se incluya ese archivo debe estar definido CFG_INCLUDE_HACKERMESH (nombre que eligio el)
Lo podes poner antes o en tu proyecto podes decirle al compilador que defina para todos los archivos ese nombre. Al estar definido va a incluir ese .h que le decimos, ubicado en la carpeta Configs y de nombre HWP HACKERMESH.h

Agregar esa directiva de preprocesador, lo haces  haciendo click derecho sobre el nombre del proyecto y seleccionando Propiedades, se abre una ventana nueva, elegis XC8 Compiler y vas a tener una opcion que dice "Define Macros" haces click en los puntos suspensivos ... , y agregas el string CFG_INCLUDE_HACKERMESH. Y listo.

Ahora ya tenes que tu hardwareprofile va a buscar el archivo Configs/HWP HACKERMESH.h
El cual vas a tener que crear la carpeta (con ese nombre ) y crear el archivo .h, dentro de ese archivo definis los FUSES como lo hizo el en su ejemplo.

De esa forma el no debe estar modificando el archivo hardwareprofile.h cada ves que cambie de micro, sabe que ese archivo va a exigir del archivo Configs/HWP HACKERMESH.h el cual vas a poner el micro que vos tengas, y que en caso de utilizar una placa de las placas para las que vienen los ejemplos, no deberias hacer ningun cambio, solo quitar el define en las propiedades del proyecto.
6
Lenguaje C para microcontroladores PIC / Re:PIC24FJ64GA002 + ENC28J60 ... Como inicio?
« Último mensaje por Chazz_666 en 23 de Septiembre de 2017, 11:39:34 »
Ayuda! No he podido avanzar :(
me estoy guiando con este hilo http://www.todopic.com.ar/foros/index.php?topic=39929
pero me confunde una parte donde jfmateos explica:

;===================================================================================
La macro CFG_INCLUDE_HACKERMESH, o como quieras llamarla, la defines en Project>Build options>Project>MPLAB Cxxx>Preprocessor macros.

Luego te creas el archivo HW HACKERMESH.h, o como quieras llamarlo, duplicando el que más se parezca de los que vienen con el stack, y en el que tienes que definir los pragmas de tu placa y la frecuencia de trabajo (código 1) y los pines (código 2) (yo también he cambiado al mssp2):
====================================================================================
7
Lenguaje C para microcontroladores PIC / Programacion GSM
« Último mensaje por jozze en 23 de Septiembre de 2017, 10:28:30 »
un saludo colegas, tengo unas dudas que quiero compartir, estoy haciendo un proyecto que es una alarma de carros con comunicación con GSM con el modulo TC35 sim900  y un PIc 16F877A ok, mi inquietud es que hice la programación del envió y recepción del mensaje y super, pero ahora el prof. quiere que desde mi celular cambie el numero que esta en la programación y no doy como hacerlo por que ella dice si le roban el celular al cliente como maneja la alarma si es por el telefono.. pero pienso yo como va a cambiar el numero si le robaron el celular tambien y tengo que agragar la programacion del cambio de celular no entiendo mu bien esa parte..! 

Programación:
#include <16F877A.h>
#device adc=8
#FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT, RESERVED
#use delay(clock=20000000)
#ORG 0x1f00,0x1fff{}
#build (reset=0x4)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#define LCD_TYPE 2
#include <lcd.c>
#include <tones.c>

int freq,sensores;
char modulo,enviar;
char tlf[]="+584262757966";
void activado(){
printf(lcd_putc,"\falarma activada\nrobaron");
delay_ms(200);
generate_tone(262,500);
output_high(pin_c0);
delay_ms(50);
generate_tone(262,500);
output_low(pin_c0);
delay_ms(50);
}
void apagado(){
output_low(pin_c0);
}
void main()
{
set_tris_a(3);
set_tris_b(255);
set_tris_d(0);
printf("at+cmgf=1\r");
printf("at+ipr=9600\r");
delay_ms(200);
enviar=26;
   lcd_init();
   // TODO: USER CODE!!
freq=C_NOTE[2];
while(true){
printf(lcd_putc,"\falarma");
delay_ms(200);
while(kbhit()){
modulo=getc();
if(modulo=='p'){
printf(lcd_putc,"\falarma activada");
delay_ms(200);

while(!modulo=='a'){
delay_ms(200);
sensores=input_b();
switch (sensores){
   case 1:printf("at+gcms=\%s",tlf);
          delay_ms(200);
          printf("puerta 1 fue abierta");
          delay_ms(200);
          printf("\%c",enviar);
          delay_ms(200);
          activado();
         break;
   case 2:printf("at+gcms=\%s",tlf);
          delay_ms(200);
          printf("puerta 2 fue abierta");
          delay_ms(200);
          printf("\%c",enviar);
          delay_ms(200);
          activado();
         break;
   case 4:printf("at+gcms=\%s",tlf);
          delay_ms(200);
          printf("maletero fue abierta");
          delay_ms(200);
          printf("\%c",enviar);
          delay_ms(200);
         activado();
         break;
   case 8:printf("at+gcms=\%s",tlf);
          delay_ms(200);
          printf("capó fue abierta");
          delay_ms(200);
          printf("\%c",enviar);
          delay_ms(200);
         activado();
         break;
   case 16:printf("at+gcms=\%s",tlf);
          delay_ms(200);
          printf("bateria fue robada");
          delay_ms(200);
          printf("\%c",enviar);
          delay_ms(200);
         activado();
         break;
   case 32:printf("at+gcms=\%s",tlf);
          delay_ms(200);
          printf("sensor de choque activado");
          delay_ms(200);
          printf("\%c",enviar);
          delay_ms(200);
         activado();
         break;
   case 64:printf("at+gcms=\%s",tlf);
          delay_ms(200);
          printf("rotura de vidrio");
          delay_ms(200);
          printf("\%c",enviar);
          delay_ms(200);
         activado();
         break;
   default:apagado();
}
}
}
if(modulo=='a'){
apagado();
printf(lcd_putc,"\falarma apagada");
delay_ms(200);
}
}
}
}
8
Electrónica de potencia / Re:Lectura de Señal 24V con PIC
« Último mensaje por KILLERJC en 23 de Septiembre de 2017, 08:46:28 »
La pregunta es... El GND se comparte?

Si se comparte... entonces podrias usar:

1 - Una resistencia + zener

2 - Una resistencia + diodo, en forma de clamping, esta tendria un poquito mas de tension que con el zener.

Sin D2 y el diodo puede ser cualquiera (un 1n40007/M7 por ejemplo), no solo un schotty, ya que depdniendo de la corriente que circule es la caida de tension.
Otro tema es que usualmente los micros poseen ya esta proteccion, asi que podrias llegar a reducir esto con una sola resistencia y dejarle el trabajo a esas protecciones.

3 - Un divisor resistivo
Si, no se tomo en cuenta .... Es simple y barato

Si no queres que comparta GND

4 - Usa un opto acoplador, de un lado solo una resistencia, y del otro un pull-up para el transistor. Un 0 logico seria que esta activo el limit switch


Tu transistor, deberia tener la union BE en directa la cual esta, y la BC en inversa para un funcionamiento normal, Al tener una tension mucho mayor de base, la estarias polarizando en directa.
9
Off Topic / PCIe conector
« Último mensaje por JuanjoPic en 23 de Septiembre de 2017, 01:42:37 »
Hola compañeros
Tengo que hacer una tarjeta con un puerto PCIe y tengo unas dudas acerca de los pines y el protocolo.

Investigue acerca del puerto y note que tiene pines axiliares (JTAG,SMbus,etc), las cuales no son necesarias para el funcionamiento del protocolo.
Si no las voy a utilizar, ¿Que debiera hacer con ellas en la PCB? (Que me recomendarían para que no estas no produzcan ruido y cosas así).

Mi otra pregunta es acerca del los pines diferenciales de clock" que tiene. Investigue y note que el protocolo tiene "embebido" el clock en la trama y que no debiera utilizarse. Pero buscando en internet algunos opinan que se deben utilizar y otros no xc
¿Alguien lo ha usado es pin?

Cualquier ayuda sera util
PD: Cualquier info extra aparte de lo que he preguntado me sera útil.

Saludos
10
Electrónica de potencia / Lectura de Señal 24V con PIC
« Último mensaje por Pinolillo16 en 23 de Septiembre de 2017, 00:36:48 »
Que tal colegas me surgio una duda. Resulta que necesito leer con un microcontrolador una señal (limit switch) a 24V. Yo solo deseo saber si se abre o se cierra.
- Tienes que ingresar para ver archivos adjuntos -

Asi lo pense conectar. Es correcto? O me estoy pasando algun concepto basico para realizarlo?

Saludos
Páginas: [1] 2 3 4 5 6 7 8 9 10