Autor Tema: Tutorial C18  (Leído 57563 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #60 en: 08 de Septiembre de 2010, 20:28:13 »
Hola que tal Suky;

Ya se que esta pasando pero no se como solucionarlo.

He estado checando el programa por Hyperterminal y los datos me llegan perfectamente bien y pues en proteus la simulación ni se diga. Lo que pasa que el display que estoy usando de es comunicación serial pero ocupo que trabaje en modo invertido, con esto te quiero decir que no ocupo MAX232 para que me realice los cambios de estados, el problema es que no se como hacerlo por software.

Saludos

Uff! En ese caso hay que cambiar el código fuente, o a cada dato que se envie hacerle un ~  para invertir la lógica de sus bits.

O sea:

x=0x5A;
WriteUART(~x);

Envía un 0xA5.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #61 en: 09 de Septiembre de 2010, 14:48:26 »
Alguien sabe como usar la configuracion invertida de TTL para el puerto UART?

Saludos
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #62 en: 09 de Septiembre de 2010, 16:13:04 »
Si lo invierto me marca error....


Código:
#include <p18f4610.h>

#include <delays.h>      //Libreria para los retardos
#include <stdlib.h>      //Libreria para conversiones a string
#include <stdio.h>
#include <sw_uart.h>
#include <string.h>

#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

void DelayTXBitUART(void);
void DelayRXBitUART(void);
void DelayRXHalfBitUART(void);
void init(void);
void inicia_LCD(void);

char x[20];

void main(void)
{
   x[0]='H';x[1]='O';x[2]='L';x[3]='A';x[4]=' ';x[5]='M';x[6]='U';x[7]='N';x[8]='D';x[9]='O';x[10]=' ';
   Delay1KTCYx(3000);
    OpenUART();
   putsUART(~x);
   //WriteUART(~x);
   while(1){}
}

void DelayTXBitUART(void)
{
   //Delay10TCYx(52);
   Delay10TCYx(52);
}
 
void DelayRXHalfBitUART(void)
{
     //Delay10TCYx(26);
   Delay10TCYx(26);
}

void DelayRXBitUART(void)
{
    //Delay10TCYx(52);
   Delay10TCYx(52);
}
 

Error:

Make: The target "C:\Micro_c\Objects\Minsa.o" is out of date.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F4610  /i"C:\MCC18\h" "Minsa.c" -fo="C:\Micro_c\Objects\Minsa.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
C:\Micro_c\MINSA\Minsa.c:30:Error [1140] integer type required for bitwise NOT operator
Halting build on first failure as requested.
BUILD FAILED: Thu Sep 09 13:11:49 2010
Lo que no me destruye, me fortalece

Desconectado meledu

  • PIC12
  • **
  • Mensajes: 83
Re: Tutorial C18
« Respuesta #63 en: 09 de Septiembre de 2010, 17:57:22 »
Haola amigos nuevamente yo, me pueden decir que es exactamente isr, esque estoy en la parte de las interrupciones y he encontrado esto   ext_isr(){      dice que es una funcion de interrupcion externa, pero porque pone ISR.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #64 en: 09 de Septiembre de 2010, 18:02:44 »
Si lo invierto me marca error....

La inversión es a una variable, no a un string, como intentas hacer en este caso. Lo correcto sería x[0]=~x[0];



Haola amigos nuevamente yo, me pueden decir que es exactamente isr, esque estoy en la parte de las interrupciones y he encontrado esto   ext_isr(){      dice que es una funcion de interrupcion externa, pero porque pone ISR.
Rutina de Servicio de Interrupcion.  ;-)

Saludos!
« Última modificación: 09 de Septiembre de 2010, 18:05:54 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #65 en: 09 de Septiembre de 2010, 21:53:26 »
Esta comunicación serial del puerto UART con TTL invertido me esta dando un dolor de cabeza......

Aun no logro hacerla funcionar...
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #66 en: 10 de Septiembre de 2010, 13:45:23 »
Como invertir la señal TTL por medio de software? :-/......
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #67 en: 10 de Septiembre de 2010, 13:52:41 »
Como invertir la señal TTL por medio de software? :-/......

Para invertir la lógica es con ~
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #68 en: 10 de Septiembre de 2010, 16:42:49 »

Creo que no me estoy dando a entender con lo que quiero hacer jejeje..... y disculpen las molestias que les he ocasionado; pero ahora voy tratar de decirlo con mas calma; ya que me siento bien frustraado de no hacer jalar mi display en C cuando en Basic si lo logro hacer; pero el problema es que me pidieron cambiar de lenguaje y pos lo tengo que hacer en C jejeje.

Ahi les va mas o menos lo que quiero hacer.

Lo que pasa que con el puerto Uart configurado por software si logro realizar la comunicación serial en Proteus, de hecho lo visualizo en una Terminal Virtual. A esa terminal la configuro en modo normal y me despliega bien el mensaje. Hasta ahi no hay ningun problema. El problema es que el display me trabaja de diferente manera.

Lo que yo busco hacer es que cuando configure la Terminal Virtual en modo Inverted me despliegue perfectamente el mensaje que le estoy enviando, ya que con esto aseguro el correcto funcionamiento del display.

En Basic si hago lo siguiente:


S9600 CON 84  (Configuracion a 9600 baudios en modo normal del terminal virtual)

SEROUT2 DIS_SER,S9600,["Hola Mundo"]  (Despliega el Hola Mundo en modo normal del terminal virtual)



y con esto:

N9600 CON 16468  (Configuracion a 9600 baudios en modo inverted del terminal virtual)

SEROUT2 DIS_SER,N9600,["Hola Mundo"]  (Despliega el Hola Mundo en modo inverted del terminal virtual)



Ahora si creo que plasme bien la idea jeejeje

Suky lo he intentado con ~ y no me funciona... habra alguna manera para hacer lo que cito en este mensaje en C18 ejejejje me siento frustrado... un display me esta ganando jeje
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #69 en: 11 de Septiembre de 2010, 12:29:09 »
Hola que tal aqui les dejo en imagenes lo que busco realizar:

La primer imagen es lo que se realiza en C18 con el puerto UART y la segunda es lo que prentendo hacer.

Saludos
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #70 en: 11 de Septiembre de 2010, 14:57:46 »
Como es algo especial, te toca modificar el código fuente de la librería por software de Usart. Donde se coloca un 1, poner un 0 y viceversa.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #71 en: 13 de Septiembre de 2010, 16:12:54 »
Hola Suky;

No tendras un programa de ejemplo de comunicacion de bit a bit en C18?

Saludos
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #72 en: 13 de Septiembre de 2010, 18:53:16 »
La lógica sería totalmente invertida? Si es así, puedes realizar una copia de seguridad de OpenUART.asm, writeUART.asm y readUART.asm, y reemplazarlo por:

Código: ASM
  1. include <P18CXXX.INC>
  2.  
  3. SWTXD           equ     PORTB           ; Transmit pin port and pin
  4. SWTXDpin        equ     4
  5. TRIS_SWTXD      equ     TRISB           ; Transmit pin tris and pin
  6. SWRXD           equ     PORTB           ; Receive pin port and pin
  7. SWRXDpin        equ     5
  8. TRIS_SWRXD      equ     TRISB           ; Receive pin tris and pin
  9.  
  10.         EXTERN  DelayRXHalfBitUART
  11.         EXTERN  DelayRXBitUART
  12.         EXTERN  DelayTXBitUART
  13.         EXTERN  uartdata
  14.         EXTERN  BitCount
  15.  
  16. UARTCODE        CODE
  17. ;********************************************************************
  18. ;*      Function Name:  OpenUART                                    *
  19. ;*      Return Value:   void                                        *
  20. ;*      Parameters:     void                                        *
  21. ;*      Description:    This routine configures the I/O pins for    *
  22. ;*                      software UART.                              *
  23. ;********************************************************************
  24. OpenUART
  25.  
  26.         banksel SWTXD
  27.         bcf             TRIS_SWTXD,SWTXDpin     ; Make TXD an output
  28.         bcf             SWTXD,SWTXDpin          ; Make TXD high
  29.         banksel SWRXD
  30.         bsf             TRIS_SWRXD,SWRXDpin     ; Make RXD an input
  31.         bcf             SWRXD,SWRXDpin          ; Make RXD high
  32.         return
  33.  
  34.         GLOBAL  OpenUART
  35.        
  36.         END


Código: ASM
  1. include <P18CXXX.INC>
  2.  
  3. SWTXD           equ     PORTB           ; Transmit pin port and pin
  4. SWTXDpin        equ     4
  5. TRIS_SWTXD      equ     TRISB           ; Transmit pin tris and pin
  6. SWRXD           equ     PORTB           ; Receive pin port and pin
  7. SWRXDpin        equ     5
  8. TRIS_SWRXD      equ     TRISB           ; Receive pin tris and pin
  9.  
  10.         EXTERN  DelayRXHalfBitUART
  11.         EXTERN  DelayRXBitUART
  12.         EXTERN  DelayTXBitUART
  13.         EXTERN  uartdata
  14.         EXTERN  BitCount
  15.  
  16. UARTCODE        CODE
  17. ;************************************************************************
  18. ;*      Function Name:  WriteUART                                       *
  19. ;*      Return Value:   void                                            *
  20. ;*      Parameters:     data: byte to send out the UART                 *
  21. ;*      Description:    This routine sends a byte out the TXD pin.      *
  22. ;*      Special Note:   The user must provide a routine:                *
  23. ;*                      DelayTXBit():                                   *
  24. ;*                        DelayTXBit should have:                       *
  25. ;*                              8 Tcy for overhead                      *
  26. ;*                              2 Tcy call to DelayTXBit                *
  27. ;*                              ? Tcy                                   *
  28. ;*                              2 Tcy for return from DelayTXBit        *
  29. ;*                      = (((2*OSC_FREQ)/(4*BAUDRATE))+1)/2  Tcy        *
  30. ;************************************************************************
  31. WriteUART
  32.         banksel uartdata
  33.         ; Retrieve character from stack.
  34.         movlw   0xFF
  35.         movff   PLUSW1,uartdata
  36.  
  37.         movlw   0x09                    ; Set bit counter for 9 bits
  38.         movwf   BitCount
  39.         bcf     STATUS,C        ; Send start bit (carry = 0)
  40.         banksel SWTXD
  41.         goto    SendStart
  42. SendBit
  43.         banksel uartdata
  44.         rrcf    uartdata,F              ; Rotate next bit into carry
  45. SendStart
  46.         banksel SWTXD
  47.         btfss   STATUS,C                ; Set or clear TXD pin according
  48.         bsf     SWTXD,SWTXDpin  ; to what is in the carry
  49.         btfsc   STATUS,C
  50.         bcf     SWTXD,SWTXDpin
  51.         call    DelayTXBitUART          ; Delay for 1 bit time
  52.         banksel BitCount
  53.         decfsz  BitCount,F              ; Count only 9 bits
  54.         goto    SendBit
  55.         banksel SWTXD
  56.         bcf     SWTXD,SWTXDpin  ; Stop bit is high
  57.         call    DelayTXBitUART          ; Delay for stop bit
  58.         return
  59.  
  60.         GLOBAL  WriteUART
  61.  
  62.         END


Código: ASM
  1. include <P18CXXX.INC>
  2.  
  3. SWTXD           equ     PORTB           ; Transmit pin port and pin
  4. SWTXDpin        equ     4
  5. TRIS_SWTXD      equ     TRISB           ; Transmit pin tris and pin
  6. SWRXD           equ     PORTB           ; Receive pin port and pin
  7. SWRXDpin        equ     5
  8. TRIS_SWRXD      equ     TRISB           ; Receive pin tris and pin
  9.  
  10.         EXTERN  DelayRXHalfBitUART
  11.         EXTERN  DelayRXBitUART
  12.         EXTERN  DelayTXBitUART
  13.         EXTERN  uartdata
  14.         EXTERN  BitCount
  15.  
  16. UARTCODE        CODE
  17. ;************************************************************************
  18. ;*      Function Name:  ReadUART                                        *
  19. ;*      Return Value:   char: received data                             *
  20. ;*      Parameters:     void                                            *
  21. ;*      Description:    This routine waits for a start bit, and then    *
  22. ;*                      reads all 8-bits.                               *
  23. ;*      Special Note:   The user must provide two routines:             *
  24. ;*                      DelayRXHalfBit():                               *
  25. ;*                        DelayRXHalfBit should have:                   *
  26. ;*                              5 Tcy for overhead                      *
  27. ;*                              2 Tcy call to DelayRXHalfBit            *
  28. ;*                              ? Tcy                                   *
  29. ;*                              2 Tcy for return from DelayRXHalfBit    *
  30. ;*                              = (((2*OSC_FREQ)/(8*BAUDRATE))+1)/2 Tcy *
  31. ;*                      DelayRXBit():                                   *
  32. ;*                        DelayRXBit should have:                       *
  33. ;*                              10 Tcy for overhead                     *
  34. ;*                              2 Tcy call to DelayRXBit                *
  35. ;*                              ? Tcy                                   *
  36. ;*                              2 Tcy for return from DelayRXBit        *
  37. ;*                              = (((2*OSC_FREQ)/(4*BAUDRATE))+1)/2 Tcy *
  38. ;************************************************************************
  39. ReadUART
  40.  
  41.         banksel BitCount
  42.         movlw   0x08                    ; Count 8-bits
  43.         movwf   BitCount
  44.         banksel SWRXD
  45. WaitChar
  46.         btfss   SWRXD,SWRXDpin          ; Detect a start bit (low)
  47.         goto    WaitChar
  48.         call    DelayRXHalfBitUART      ; Delay until middle of start bit
  49.         banksel SWRXD
  50.         btfss   SWRXD,SWRXDpin          ; If not still low, then go back
  51.         goto    WaitChar                ; and wait for start bit
  52. GetChar                                 ; Loop to get all 8-bits
  53.         call    DelayRXBitUART          ; Delay a full bit for middle of
  54.         banksel SWRXD
  55.         btfsc   SWRXD,SWRXDpin          ; Set or clear the carry bit
  56.         bcf             STATUS,C        ; according to the state of the
  57.         btfss   SWRXD,SWRXDpin          ; RXD I/O pin
  58.         bsf             STATUS,C
  59.         banksel uartdata
  60.         rrcf    uartdata,F              ; Rotate the carry into data
  61.         decfsz  BitCount,F              ; Loop for 8-bits
  62.         goto    GetChar
  63.         call    DelayRXBitUART          ; Delay a full bit time, middle of start bit
  64.         call    DelayRXHalfBitUART      ; Delay half bit for end of start bit
  65.         nop
  66.         banksel uartdata
  67.         movf   uartdata,W,BANKED
  68.         return                          ; Return received character
  69.  
  70.         GLOBAL  ReadUART
  71.  
  72.         END


Saludos!



No contesto mensajes privados, las consultas en el foro

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Tutorial C18
« Respuesta #73 en: 17 de Septiembre de 2010, 12:38:56 »
Hola compañeros, estoy empezando con C18 y leyendo el tutorial de Suky me encuentro con cosas que no entiendo exactamente para que se usan:
 
k=0xA5;
a=0xF0 & k;  // a=0xA0; k=0xA5

k=0x03;
a=0x40 | k;  // a=0x43; k=0x43

¿No podemos declarar a con el valor deseado desde un principio?

Perdon por la torpeza, pero si empiezo a dejar misterios al principio mal andamos.

Gracias
            Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #74 en: 17 de Septiembre de 2010, 13:27:52 »
Es un ejemplo, cuando quieres cargar un una variable en 2 puertos, por ejemplo: Cargar la variable Data, haciendo que el nible bajo se cargue en b0-b3 y el nible alto en c4-c7.

Como lo harías? Una forma es usando mascaras como las propuestas:

Código: C
  1. LATB=PORTB|(Data&0x0F);
  2. LATC=PORTC|(Data&0xF0);

Entre otras muchas utilidades.


Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything