|
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
« 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 : 'Se declara 1 delegado_Tendra como dato de referencia una variable data del tipo Byte Delegate Sub delegado(ByVal data As Byte ........... Private Sub sp_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp.DataReceived Dim recepcion As Byte recepcion = sp.ReadByte Dim escribeport As New delegado(AddressOf Me.mostrar) Me.Invoke(escribeport, recepcion) End Sub Sub mostrar(ByVal b As Byte) Consola.AppendText("El Puerto Recibe : " & b) End Sub
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
« 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 LIST P=16F876 #INCLUDE <P16F876.INC> PERIODO EQU 0ffh TEMPORAL EQU 020H TEMPORAL1 EQU 021H DELAY_CONT EQU 022H ORG 00H GOTO INICIO ORG 05H ;USA PWM DESDE NULO A MAXIMO Y DECREMENTA HASTA NULA DELAY MOVLW 4EH;(~.78) MOVWF TMR0 DELAY_1 BTFSS INTCON,T0IF GOTO DELAY_1 BCF INTCON,T0IF DECFSZ DELAY_CONT,F GOTO DELAY RETURN INICIO CLRF PORTA CLRF PORTB CLRF PORTC BSF STATUS,RP0 BCF STATUS,RP1;BANCO1 MOVLW 06H;(00000110) MOVWF ADCON1 CLRF TRISA CLRF TRISB CLRF TRISC MOVLW 0C7H;(11000111) MOVWF OPTION_REG;TMR0 A 256 MOVLW PERIODO-1;CARGA PERIODO MOVWF PR2 BCF STATUS,RP0;BANCO 0 BSF PORTB,1;PRUEBA BUCLE MOVLW 0CH MOVWF CCP2CON;CONFIGURA CCP2 EN PWM MOVLW 0ffh;MAXIMA POTENCIA DESEADA MOVWF TEMPORAL MOVWF TEMPORAL1 CLRF CCPR2L MOVLW 07H MOVWF T2CON;HABILITA Y PREDIVISOR A 16 AUMENTA MOVLW 05H MOVLW DELAY_CONT CALL DELAY INCF CCPR2L,F DECFSZ TEMPORAL,F GOTO AUMENTA CALL ESPERA DECREMENTA MOVLW 05H MOVWF DELAY_CONT CALL DELAY DECF CCPR2L,F DECFSZ TEMPORAL1,F GOTO DECREMENTA CALL ESPERA DESACTIVAPWM CLRF CCP2CON GOTO BUCLE ESPERA ;RETARDO 5 S MOVLW 0fah MOVWF DELAY_CONT CALL DELAY RETURN END
3
« en: Jueves 5 de Enero de 2006, 22:53 »
La siguiene rutina recive un dato y lo vuelve a transmitir list p=16f876 ;micro #include <p16f876.inc>;include errorlevel -302 ;suprime error no banco 0 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF ;---------------------------------------------------------------------------- ;Constants SPBRG_VAL EQU .25 ;configuracion 9600 baudios a 4Mhz ;---------------------------------------------------------------------------- ;Bit Definitions GotNewData EQU 0 ;bit indica nuevo dato recibido ;---------------------------------------------------------------------------- ;Variables CBLOCK 0x020 Flags ;byte indicador banderas ENDC ;---------------------------------------------------------------------------- ;Macros para seleccion de banco Bank0 MACRO ;bank 0 bcf STATUS,RP0 bcf STATUS,RP1 ENDM Bank1 MACRO ;bank 1 bsf STATUS,RP0 bcf STATUS,RP1 ENDM Bank2 MACRO ;bank 2 bcf STATUS,RP0 bsf STATUS,RP1 ENDM Bank3 MACRO ;bank 3 bsf STATUS,RP0 bsf STATUS,RP1 ENDM ;---------------------------------------------------------------------------- ORG 0x0000 ResetCode: clrf PCLATH ;selecciona pagina 0 goto Main ;va a programa ORG 0x0004 ;vector interrupcionm InterruptCode:;codigo isr retfie ;retorno ;---------------------------------------------------------------------------- Main: call SetupSerial;inicializa serial y buffer Bank1 clrf TRISB;puerto b como salida del dato recibido clrf TRISA;puerto a salida para mostrar si hay error bank1 MainLoop: call ReceiveSerial;recepcion dato btfsc Flags,GotNewData;verifica si se recibe dato call showandtransmit;si ha recibido va a emitir bcf Flags,GotNewData;indica dato no recibido ;codigo goto MainLoop;bucle showandtransmit clrf PORTA;limpia a movwf PORTB;muestra dato en b call TransmitSerial;si ha recibido muestra ;y emite el dato ;---------------------------------------------------------------------------- ;Analiza el dato recibido y lo pasa a W. ReceiveSerial: Bank0 btfss PIR1,RCIF;analiza si se ha rebicido dato return ;vuelve si no se ha recibido btfsc RCSTA,OERR;analiza desbordamiento goto ErrSerialOverr;si hay se va a rutina btfsc RCSTA,FERR;analiza error frame goto ErrSerialFrame;si hay se va a rutina movf RCREG,W ;se carga el dato en w bsf Flags,GotNewData;pone a 1 indicador de ;dato nuevo return ;error desbordamiento ErrSerialOverr: bcf RCSTA,CREN;resetea la recepcion clrf PORTA; bsf PORTA,0; indica error desbordamiento bsf RCSTA,CREN;habilita la recepcion return ;error FERR ErrSerialFrame: clrf PORTA; bsf PORTA,1; ;indica error ferr return ;---------------------------------------------------------------------------- ;Transmite el dato en W cuando el transmisor esta listo TransmitSerial: Bank0 ;select bank 0 btfss PIR1,TXIF;verifica si transmision ocupada goto $-1 ;espera a transmisor ;no ocupado movwf TXREG ;transmite el dato return ;---------------------------------------------------------------------------- ;Set up serial port. SetupSerial: Bank1 movlw 0xc0 ;configura bits tx y rx iorwf TRISC,F movlw SPBRG_VAL;carga para baudios movwf SPBRG movlw 0x24 ;habilita transmision y ; velocidad alta movwf TXSTA Bank0 movlw 0x90 ;activa puerto serial y la recepcion movwf RCSTA clrf Flags ;limpia banderas return ;---------------------------------------------------------------------------- END
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
« 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 ;dispositivo LIST P=PIC16F876 INCLUDE <P16f876.INC> ;declara puerto(opcional) ;variables necesarias DATOALTO EQU 20H DATOBAJO EQU 21H ; programa Org 05H Inicio CLRF CUENTA1 ;Ponemos a 0 CLRF CUENTA2 BCF STATUS,5 ;BANCO 0 MOVLW 81H ;FOSC/32 SELECCION DE RA0 configuramos adcon 0 MOVWF ADCON0 BSF STATUS,5 ;CAMBIO DE BANCO 1 MOVLW 8EH ;configuramos adcon1 MOVWF ADCON1 MOVLW 01H ;DEJANDO COMO ENTRADA A AN0 MOVWF TRISA CLRF TRISB ;PUERTO B COMO SALIDA CLRF TRISC ;PUERTO C SALIDA CLRF DATOALTO ;Ponemos a 0 CLRF DATOBAJO ;MANEJO DE LA CONVERSION UNO CLRF ADRESL BCF STATUS,5 ;VOLVEMOS AL BANCO 0 MOVF DATOALTO,W MOVWF PORTC MOVF DATOBAJO,W MOVWF PORTB ;Sacamos variable por puerto B CALL DELAY ;retardo ;INICIO DEL PROCESO CLRF ADRESH ;limpiamos resultado parte superior BSF ADCON0,2 ;EMPEZAR LA CONVERSION CONVIERTE BTFSC ADCON0,2 ;VERIFICACION DE ;FINALIZACION DE CONVERSION GOTO CONVIERTE MOVF ADRESH,W; (TAMBIEN 00) MOVWF DATOALTO;PASAMOS LA PARTE ALTA DE LA CONVERSION ;A DATO ALTO BSF STATUS,5;PASAMOS A BANCO 1 MOVF ADRESL,w;(TAMBIEN 00) BCF STATUS,5;BANCO0 MOVWF DATOBAJO;PASAMOS LA PARTE ALTA DE LA CONVERSION ;A DATO BAJO GOTO UNO DELAY;escribir aqui rutina de retardo adecuada END
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
« 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 list p = 16f876; #include <p16f876.inc> ;temporiza y parpadea portb,0 CONTADOR EQU 20H TRANSICION EQU 21H ORG 00H GOTO INICIO ORG 04H BCF PIR1,0;Borro bandera DECFSZ CONTADOR GOTO CONTINUA;Va a retornar de la int, BSF TRANSICION,0 GOTO VERSAL VERSAL MOVLW 0C8H;realiza 200 temporizaciones antes de variar salida MOVWF CONTADOR BTFSS PORTB,0;Analiza la salida GOTO ACTIVAR;Va a activar salida BCF PORTB,0;DESACTIVA CONTINUA RETFIE ACTIVAR BSF PORTB,0;activa RETFIE INICIO BCF STATUS,6 BSF STATUS,5;banco 1 CLRF TRISB;B SALIDA MOVLW 01H;HABILITA TMR1E MOVWF PIE1 MOVLW 0C0H; MOVWF INTCON;HABILITA GIE Y PERIFERICOS BCF STATUS,5;BANCO 0 CLRF PORTB BSF PORTB,1;COMPROBAR SI FUNCIONA EL MICRO TIEMPO BCF T1CON,0;desactivo el temp MOVLW 0DCH MOVWF TMR1L;CARGA TIMER1BAJO MOVLW 0BH MOVWF TMR1H;CARGA TIMER1ALTO MOVLW 31H MOVWF T1CON;PRESCALER 8 Y ACTIVA NADA GOTO NADA GOTO TIEMPO END
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
« 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 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 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]
|
|
|