• Martes 7 de Mayo de 2024, 14:27

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - Kain589

Páginas: [1]
1
VB .NET / Errores con el uso del puerto serie, envio y recepcion
« en: Viernes 20 de Febrero de 2009, 00:40 »
Saludos! Pues queria compartir con vosotros una duda, estoy desarrollando un sistema con un microcontrolador y necesito en mi diseño realizar la comunicacion serie del ordenador con el microcontrolador.

La aplicacion de VB almacena en un array 4 valores, y cuando estan todos los manda por el puerto serie. El microcontrolador recibe los 4 bytes, y responde con el de mayor valor. El programa del microcontrolador lo he comprobado usando el hyperterminal y funciona bien, sin hacer nada extraño.

El problema es que por mas que he buscado, no encuentro un codigo para trabajar en Visual Basic Express con datos tipo byte a traves del puerto serie. A partir de algunas rutinas que trabajan con cadenas de caracteres, escribi el siguiente codigo :

Código: Visual Basic
  1. 'Se declara 1 delegado_Tendra como dato de referencia una variable data del tipo Byte
  2.          Delegate Sub delegado(ByVal data As Byte
  3.               ...........
  4.         Private Sub sp_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp.DataReceived
  5.         Dim recepcion As Byte
  6.         recepcion = sp.ReadByte
  7.         Dim escribeport As New delegado(AddressOf Me.mostrar)
  8.         Me.Invoke(escribeport, recepcion)
  9.     End Sub
  10.  
  11.     Sub mostrar(ByVal b As Byte)
  12.         Consola.AppendText("El Puerto Recibe : " & b)
  13.     End Sub
  14.  
  15.  

Para enviar datos a traves del puerto serie utilizo la instruccion:

sp.WriteLine(dato(i))

Y esta instruccion no me manda tampoco datos tipo bytes, supongo que mandara en formato cadena de caracteres, o no se.

Para comprobar la correcta programacion del microcontrolador uso el hyperterminal, y va todo bien sin problemas.Asi que os escribo aqui, por si alguien puede ayudarme a solucionar este problema.

En la recepcion, el microcontrolador solo manda un byte, pero en la aplicacion es como si recibiera mas y ademas sin sentido:

Puerto Recibe : 22
3El Puerto Recibe : 4
56a3
78

2
Microcontroladores / Usando El Pwm En El 16f876
« en: Domingo 15 de Enero de 2006, 13:50 »
Estoy intentando realizar este programa que usa el modulo pwm para encender un led aplicando una potencia creciente, cuando llegue a esta esperar 5 segundos y decremental hasta que la potencia se nula, esperando otros 5 segundos; es mas que todo para familiarizarme con el modulo pwm. El problema es que al ejecutarlo, pues no tiene el efecto deseado simplemente se enciende el led con poca potencia, ¿alguien sabe en que puedo estar fallando? gracias de antemano


Código: Text
  1. LIST P=16F876
  2.   #INCLUDE <P16F876.INC>
  3.  
  4.   PERIODO    EQU  0ffh
  5.   TEMPORAL  EQU  020H
  6.   TEMPORAL1  EQU  021H
  7.   DELAY_CONT  EQU  022H
  8.  
  9.   ORG  00H
  10.   GOTO  INICIO
  11.   ORG  05H
  12. ;USA PWM DESDE NULO A MAXIMO Y DECREMENTA HASTA NULA
  13. DELAY
  14.   MOVLW  4EH;(~.78)
  15.   MOVWF  TMR0
  16. DELAY_1
  17.   BTFSS  INTCON,T0IF
  18.   GOTO  DELAY_1
  19.   BCF    INTCON,T0IF
  20.   DECFSZ  DELAY_CONT,F
  21.   GOTO  DELAY
  22.   RETURN
  23.  
  24. INICIO
  25.   CLRF  PORTA
  26.   CLRF  PORTB
  27.   CLRF  PORTC
  28.   BSF    STATUS,RP0
  29.   BCF    STATUS,RP1;BANCO1
  30.   MOVLW  06H;(00000110)
  31.   MOVWF  ADCON1
  32.   CLRF  TRISA
  33.   CLRF  TRISB
  34.   CLRF  TRISC
  35.   MOVLW  0C7H;(11000111)
  36.   MOVWF  OPTION_REG;TMR0 A 256
  37.   MOVLW  PERIODO-1;CARGA PERIODO
  38.   MOVWF  PR2
  39.   BCF    STATUS,RP0;BANCO 0
  40.   BSF    PORTB,1;PRUEBA
  41. BUCLE
  42.   MOVLW  0CH
  43.   MOVWF  CCP2CON;CONFIGURA CCP2 EN PWM
  44.   MOVLW  0ffh;MAXIMA POTENCIA DESEADA
  45.   MOVWF  TEMPORAL
  46.   MOVWF  TEMPORAL1
  47.   CLRF  CCPR2L
  48.   MOVLW  07H
  49.   MOVWF  T2CON;HABILITA Y PREDIVISOR A 16
  50. AUMENTA
  51.   MOVLW  05H
  52.   MOVLW  DELAY_CONT
  53.   CALL  DELAY
  54.   INCF  CCPR2L,F
  55.   DECFSZ  TEMPORAL,F
  56.   GOTO  AUMENTA
  57.   CALL  ESPERA
  58. DECREMENTA
  59.   MOVLW  05H
  60.   MOVWF  DELAY_CONT
  61.   CALL   DELAY
  62.   DECF  CCPR2L,F
  63.   DECFSZ  TEMPORAL1,F
  64.   GOTO   DECREMENTA
  65.   CALL  ESPERA
  66. DESACTIVAPWM
  67.   CLRF  CCP2CON
  68.   GOTO  BUCLE
  69.  
  70. ESPERA        &#59;RETARDO 5 S
  71.   MOVLW  0fah
  72.   MOVWF  DELAY_CONT
  73.   CALL DELAY
  74.   RETURN
  75.  
  76. END
  77.  

3
Soluciones de Hard y Soft / Emision Y Recepcion Serie Rs232
« en: Jueves 5 de Enero de 2006, 22:53 »
La siguiene rutina recive un dato y lo vuelve a transmitir
Código: Text
  1.  
  2.     list p=16f876  ;micro
  3.     #include <p16f876.inc>;include
  4.     errorlevel -302  ;suprime error no banco 0
  5.  
  6.     __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF
  7.  
  8. ;----------------------------------------------------------------------------
  9. ;Constants
  10. SPBRG_VAL  EQU  .25  ;configuracion 9600 baudios a 4Mhz
  11. ;----------------------------------------------------------------------------
  12. ;Bit Definitions
  13. GotNewData  EQU  0  ;bit indica nuevo dato recibido
  14. ;----------------------------------------------------------------------------
  15. ;Variables
  16.     CBLOCK  0x020
  17.     Flags    ;byte indicador banderas
  18.     ENDC
  19. ;----------------------------------------------------------------------------
  20. ;Macros para seleccion de banco
  21. Bank0    MACRO    ;bank 0
  22.     bcf  STATUS,RP0
  23.     bcf  STATUS,RP1
  24.     ENDM
  25. Bank1    MACRO    ;bank 1
  26.     bsf  STATUS,RP0
  27.     bcf  STATUS,RP1
  28.     ENDM
  29. Bank2    MACRO    ;bank 2
  30.     bcf  STATUS,RP0
  31.     bsf  STATUS,RP1
  32.     ENDM
  33. Bank3    MACRO    ;bank 3
  34.     bsf  STATUS,RP0
  35.     bsf  STATUS,RP1
  36.     ENDM
  37.  
  38. ;----------------------------------------------------------------------------
  39.     ORG     0x0000    
  40. ResetCode:  
  41.     clrf    PCLATH  ;selecciona pagina 0
  42.       goto    Main  ;va a programa
  43.     ORG  0x0004  ;vector interrupcionm
  44. InterruptCode:;codigo isr
  45.     retfie    ;retorno
  46. ;----------------------------------------------------------------------------
  47. Main:  call  SetupSerial;inicializa serial y buffer
  48.     Bank1
  49.     clrf  TRISB;puerto b como salida del dato recibido
  50.     clrf  TRISA;puerto a salida para mostrar si hay error
  51.     bank1
  52. MainLoop:  
  53.     call  ReceiveSerial;recepcion dato
  54.     btfsc  Flags,GotNewData;verifica si se recibe dato
  55.     call  showandtransmit;si ha recibido va a emitir
  56.     bcf  Flags,GotNewData;indica dato no recibido
  57.   ;codigo
  58.  
  59.     goto  MainLoop;bucle
  60. showandtransmit
  61.     clrf  PORTA;limpia a
  62.     movwf  PORTB;muestra dato en b
  63.     call  TransmitSerial;si ha recibido muestra
  64.                                                                               &#59;y emite el dato
  65.  
  66.  
  67. ;----------------------------------------------------------------------------
  68. ;Analiza el dato recibido y lo pasa a W.
  69.  
  70. ReceiveSerial:  Bank0
  71.     btfss  PIR1,RCIF;analiza si se ha rebicido dato
  72.     return    ;vuelve si no se ha recibido
  73.  
  74.     btfsc  RCSTA,OERR;analiza desbordamiento
  75.     goto  ErrSerialOverr;si hay se va a rutina
  76.     btfsc  RCSTA,FERR;analiza error frame
  77.     goto  ErrSerialFrame;si hay se va a rutina
  78.  
  79.     movf  RCREG,W  ;se carga el dato en w
  80.     bsf  Flags,GotNewData;pone a 1 indicador de
  81.                                                                           ;dato nuevo
  82.     return
  83.  
  84. ;error desbordamiento
  85. ErrSerialOverr:  
  86.     bcf  RCSTA,CREN;resetea la recepcion
  87.     clrf PORTA;
  88.     bsf PORTA,0;  indica error desbordamiento
  89.     bsf  RCSTA,CREN;habilita la recepcion
  90.     return
  91.  
  92. ;error FERR
  93.  
  94. ErrSerialFrame:
  95.     clrf PORTA;
  96.     bsf PORTA,1;  ;indica error ferr
  97.     return
  98.  
  99. ;----------------------------------------------------------------------------
  100. ;Transmite el dato en W cuando el transmisor esta listo
  101.  
  102. TransmitSerial:  Bank0    ;select bank 0
  103.     btfss  PIR1,TXIF;verifica si transmision ocupada
  104.     goto  $-1  ;espera a transmisor
  105.                                                                               &#59;no ocupado
  106.     movwf  TXREG  ;transmite el dato
  107.     return
  108.  
  109. ;----------------------------------------------------------------------------
  110. ;Set up serial port.
  111.  
  112. SetupSerial:  Bank1    
  113.     movlw  0xc0  ;configura bits tx y rx
  114.     iorwf  TRISC,F
  115.     movlw  SPBRG_VAL;carga para baudios
  116.     movwf  SPBRG
  117.     movlw  0x24  ;habilita transmision y  
  118.                                                                                 &#59; velocidad alta
  119.     movwf  TXSTA
  120.     Bank0
  121.     movlw  0x90  ;activa puerto serial y la recepcion
  122.     movwf  RCSTA
  123.     clrf  Flags  ;limpia banderas
  124.     return
  125.  
  126. ;----------------------------------------------------------------------------
  127.  
  128.     END
  129.  

Si solo se desea la recepcion del dato y no volver a emitir se elimina la rutina de transmision o se emplea para transmitir en otra parte de programa un dato diferente

4
Soluciones de Hard y Soft / Uso Del Convertidor A/d
« en: Jueves 5 de Enero de 2006, 22:45 »
Pues esta rutina esta preparada para configurar el conversor y sacar el resultado por los puertos B y C del micro, esta diseñada para el 16f876

Código: Text
  1. ;dispositivo
  2.   LIST P=PIC16F876
  3.   INCLUDE <P16f876.INC>
  4. ;declara puerto(opcional)
  5. ;variables necesarias
  6. DATOALTO EQU 20H
  7. DATOBAJO EQU 21H  
  8. ; programa
  9.   Org 05H
  10.  
  11. Inicio
  12.   CLRF CUENTA1  &#59;Ponemos a 0
  13.   CLRF CUENTA2
  14.   BCF STATUS,5  &#59;BANCO 0
  15.   MOVLW 81H  &#59;FOSC/32 SELECCION DE RA0 configuramos adcon 0
  16.   MOVWF ADCON0
  17.   BSF STATUS,5  &#59;CAMBIO DE BANCO 1
  18.   MOVLW 8EH  &#59;configuramos adcon1
  19.   MOVWF ADCON1
  20.   MOVLW 01H  &#59;DEJANDO COMO ENTRADA A AN0
  21.   MOVWF TRISA
  22.   CLRF TRISB  &#59;PUERTO B COMO SALIDA      
  23.   CLRF TRISC  &#59;PUERTO C SALIDA
  24.   CLRF DATOALTO   &#59;Ponemos a 0
  25.   CLRF DATOBAJO
  26. ;MANEJO DE LA CONVERSION
  27. UNO
  28.   CLRF ADRESL
  29.   BCF STATUS,5   &#59;VOLVEMOS AL BANCO 0
  30.   MOVF DATOALTO,W
  31.   MOVWF PORTC
  32.   MOVF DATOBAJO,W
  33.   MOVWF PORTB   &#59;Sacamos variable por puerto B
  34.   CALL DELAY   &#59;retardo
  35.  
  36. ;INICIO DEL PROCESO
  37.   CLRF ADRESH   &#59;limpiamos resultado parte superior
  38.   BSF ADCON0,2   &#59;EMPEZAR LA CONVERSION
  39. CONVIERTE
  40.   BTFSC ADCON0,2   &#59;VERIFICACION DE
  41.                                                                &#59;FINALIZACION  DE CONVERSION
  42.   GOTO CONVIERTE
  43.   MOVF ADRESH,W; (TAMBIEN 00)
  44.   MOVWF DATOALTO;PASAMOS LA PARTE ALTA DE LA CONVERSION
  45.                                            &#59;A DATO ALTO
  46.   BSF STATUS,5&#59;PASAMOS A BANCO 1
  47.   MOVF ADRESL,w;(TAMBIEN 00)
  48.   BCF STATUS,5&#59;BANCO0
  49.   MOVWF DATOBAJO&#59;PASAMOS LA PARTE ALTA DE LA CONVERSION
  50.                                             &#59;A DATO BAJO
  51.   GOTO UNO
  52.  
  53.  
  54. DELAY;escribir aqui rutina de retardo adecuada
  55.    
  56. END
  57.  

La rutina de retardo depende del cristal, se utiliza para que se estabilice el convertidor y para un cristal de 4 Mhz bastara con 20 microsegundos
Alguna modificacion interesante es en lugar de justificar a la derecha,llenando de ceros los bits mas sifnificativos del registro ADRESH justificar a izquierda(llena de ceros los bits menos significativos de ADRESL), asi los 8 bits mas significativos estan en un mismo registro ADRESH, y podemos usar el convertidor como si fuera de 8 bits, mejorando la respuesta ante el ruido(al tener menos sensibilidad) y facilitando el manejo de la conversion, siempre que no sea critica la precision en la conversion

5
Microcontroladores / Uso Del Tmr1 En El 16f876
« en: Jueves 5 de Enero de 2006, 22:23 »
A ver si me pueden ayudar, el problema es que no consigo hacerlo funcional, creo que el fallo puede estar en el bucle infinito de temporizacion que quiero crear, y que variara las salidas por la interrupcion
Código: Text
  1. list p = 16f876;
  2. #include <p16f876.inc>
  3. ;temporiza y parpadea portb,0
  4. CONTADOR  EQU  20H
  5. TRANSICION  EQU 21H
  6.  
  7. ORG 00H
  8.   GOTO INICIO
  9.   ORG  04H
  10.   BCF    PIR1,0;Borro bandera
  11.   DECFSZ  CONTADOR
  12.   GOTO   CONTINUA;Va a retornar de la int,
  13.   BSF    TRANSICION,0
  14.   GOTO  VERSAL
  15. VERSAL
  16.   MOVLW  0C8H;realiza 200 temporizaciones antes de variar salida
  17.   MOVWF  CONTADOR
  18.   BTFSS  PORTB,0;Analiza la salida
  19.   GOTO   ACTIVAR;Va a activar salida
  20.   BCF    PORTB,0;DESACTIVA
  21. CONTINUA  
  22.   RETFIE
  23. ACTIVAR
  24.   BSF    PORTB,0;activa
  25.   RETFIE
  26.  
  27. INICIO
  28.   BCF    STATUS,6
  29.   BSF    STATUS,5;banco 1
  30.   CLRF  TRISB;B  SALIDA
  31.   MOVLW  01H;HABILITA TMR1E
  32.   MOVWF  PIE1
  33.   MOVLW  0C0H;
  34.   MOVWF  INTCON;HABILITA GIE Y PERIFERICOS
  35.   BCF    STATUS,5;BANCO 0
  36.   CLRF  PORTB
  37.   BSF    PORTB,1;COMPROBAR SI FUNCIONA EL MICRO
  38. TIEMPO
  39.   BCF    T1CON,0;desactivo el temp
  40.   MOVLW  0DCH
  41.   MOVWF  TMR1L;CARGA TIMER1BAJO
  42.   MOVLW  0BH
  43.   MOVWF  TMR1H;CARGA TIMER1ALTO
  44.   MOVLW  31H
  45.   MOVWF  T1CON;PRESCALER 8 Y ACTIVA
  46. NADA
  47.   GOTO  NADA
  48.   GOTO  TIEMPO
  49.  
  50.   END
  51.  

Cuando entro en el bucle NADA el PC apuntará a la siguiente instruccion, asi que al retornar de la interrupcion ira a goto tiempo, a lo mejor esto que he dado por supuesto esta mal. No se que pùede estar mal, a ver si me pueden sugerir como hacerlo andar, gracias

6
Microcontroladores / Comunicacion Via Rs232
« en: Domingo 1 de Enero de 2006, 12:12 »
Hola sé que se trata de un tema bastante trillado, estoy empezando con los micros y ya he usado los distintos modulos y hecho problemas, asi que me propuesto empezar con la comunicacion entre dispositivos. he estado buscando por el foro y me encontre con unas rutinas, las he adaptado y cambiado algunas cosas para el 16f876, pero no me van; todo lo hecho creo que es necesario y que se debe a que falta algo, aunque puede que este mal. si alguien puede decirme que esta mal o si falta algo, muchas gracias y felicitarles por este gran foro tambien espero con el tiempo poder ayudar

Citar
PROGRAMA : rx-rs232.asm                       
; Funcion : Escucha puerto serie rs232 y cuando recibe un dato salta la
;     interrupcion y lo muestra en PortB.       
;           Serial port config: 9600 baudios,8 bits,paridad = none             
;
; Programa para : PIC16F876
; CPU Clock : 4 MHz                      Reloj instruccion : 1 MHz = 1 us
;       WDT : Deshabilitado                  Tipo de reloj : XT 
; Code Prot : OFF



  LIST   P = 16F876   ;Se indica el modo de procesador

  INCLUDE   <P16f876.inc>   ;se incluye la definicion de los

;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
  ORG   00H  ;Inicio en el Vector de Reset
 
  goto   INICIO  ;Va a la primera instruccion del
       ;programa

;<<<<<<------------------- VECTOR DE INTERRUPCION -------------------->>>>>>>

  ORG   04H  ;Vector de interrupcion


INTER   btfss   PIR1,RCIF   ;¿Interrupcion por recepcion?
  goto   VOLVER  ;No. Falsa interrupcion
  bcf  PIR1,RCIF  ;Si. Reponer Flag
  movf   RCREG,W  ;Lectura dato recibido
  movwf   PORTB  ;Visualiza dato recibido
 

VOLVER   retfie     ;retorna de la interrupcion.
 
 
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>

INICIO   clrf   PORTB  ;Limpia salidas
  clrf   PORTC

  bsf   RCSTA,SPEN   ;se activa la USART
  bsf   STATUS,RP0   ;Cambio al banco 1 ------------------
  bcf   STATUS,RP1
 
  clrf   TRISB  ;Puerta B como salida
  clrf   TRISB  ;Puerta B como salida
  movlw   80H     ;RC7/Rx entrada,
  movwf   TRISC     ;RC6/Tx   salida y RC5 Salida.

  movlw   04H   ;Configuracion USART
  movwf   TXSTA  ;y activacion de transmision
  movlw   .207  ;9600 baudios
  movwf   SPBRG
  bsf  PIE1,RCIE   ;Habilitacion interrupcion RX
  bcf  STATUS,RP0   ;Cambio al banco 0 -----------------
 
  bsf  RCSTA,SPEN   ;se activa la USART
 
  movlw   90H   ;Configuracion de la usart
  movwf   RCSTA  ;para recepcion continua
 
  movlw   0C0H   ;Habilitacion para las
  movwf   INTCON  ;interrupciones generales
 
 
 
BUCLE   goto   BUCLE  ;espera aqui hasta que salte la int.


  END




Citar
PROGRAMA : tx-rs232.asm
; Funcion : Transmite 2 bytes por el puerto serie del pic en intervalos de
;     1 segundo.   
;           Serial port config: 9600 baudios,8 bits,paridad = none
;   
;  rograma para : PIC16F876
; CPU Clock : 4 MHz                      Reloj instruccion : 1 MHz = 1 us
;       WDT : Deshabilitado                  Tipo de reloj : XT 
; Code Prot : OFF           


  LIST   P=16F876   ;Se indica el modo de procesador

  INCLUDE   <P16f876.inc>   ;se incluye la definicion de los
       ;registros internos
CounterA   EQU   20h
CounterB   EQU   21h
CounterC   EQU   22h

;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
  ORG   00H  ;Inicio en el Vector de Reset
 
  goto   INICIO  ;Va a la primera instruccion del
       ;programa

;<<<<<<------------------- VECTOR DE INTERRUPCION -------------------->>>>>>>

  ORG   04H  ;Vector de interrupcion



;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO   clrf   PORTB  ;Limpia salidas
  clrf   PORTC

  bsf   RCSTA,SPEN   ;se activa la USART
  bsf   STATUS,RP0   ;Cambio al banco 1 -------------
  bcf   STATUS,RP1
 
  clrf   TRISB  ;Puerta B como salida
  movlw   80H   ;RC7/Rx entrada,
  movwf   TRISC     ;RC6/Tx   salida.

  movlw   24H   ;Configuracion USART
  movwf   TXSTA  ;y activacion de transmision
  movlw   .207  ;9600 baudios
  movwf   SPBRG
  bcf   STATUS,RP0   ;Cambio al banco 0 -------------
 
  bsf   RCSTA,SPEN   ;se activa la USART
 

  bsf   STATUS,RP0   ;Cambio al banco 1 -------------
  bcf   STATUS,RP1
  bsf   TXSTA,TXEN   ;Habilita la transmision
  bcf   STATUS,RP0   ;Cambio al banco 0 -------------   
 
bucle   goto   PDelay
  movlw   49H  ;Envia el caracter, valor hex
  movwf   TXREG  ; del codigo ascii
 
  bsf   STATUS,RP0   ;Cambio al banco 1 -------------
  bcf   STATUS,RP1
COMP_TX   btfss   TXSTA,TRMT   ;comprueba si acabo de Tx.
  goto   COMP_TX
  bcf   STATUS,RP0   ;Cambio al banco 0 -------------
  movlw   .50  ;caracter ASCII en decimal
  movwf   TXREG
  goto  bucle

;<<<<<<----------------------- OTRAS RUTINAS ------------------------->>>>>>>
;PIC Time Delay = 1,0000020 s with Osc = 4 MHz
PDelay   movlw   6H
  movwf   CounterC
  movlw   19H
  movwf   CounterB
  movlw   0B2H
  movwf   CounterA
loop  decfsz   CounterA,1
  goto   loop
  decfsz   CounterB,1
  goto   loop
  decfsz   CounterC,1
  goto   loop
  return
   

   
  END

Páginas: [1]