Microcontroladores - Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550

 
Vista:
Imágen de perfil de Adolfo Leon

Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550

Publicado por Adolfo Leon (1 intervención) el 05/09/2016 20:33:47
Mucho gusto, quedo muy agradecido por su atención.

En el momento estoy necesitando asesoría en PIC 18F4550 Microchip.

Estoy enviando por puerto serial los números del 0 al 9 al PIC indicado y se
ejecuta el requerimiento, como se observa en código.


Cuando envió el numero 10, el programa primero me captura el 1 y después el cero, por que son dos Byte diferentes. Donde puedo ubicar un código que me capture en Buffer el numero 10.

Para tal caso, en otro foro me indican realizar los siguientes pasos y asi aun no meda.

KILLERJC

Colaborador
DsPIC33
*****
Mensajes: 4589
Ver Perfil Mensaje Privado (Desconectado)

Re:Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550
« Respuesta #1 en: 29 de Agosto de 2016, 08:56:00 »

Citar

El case solo funciona con numeros.

el '1' en si es un 0x31, cuando vos pones '10' ya es imposible, primero por como funcionan los string en C y segundo eso ya no es mas un caracter.

En todo caso seria una "10" en ves de '10', ahora una string estaria formada por '1','0',0x00

------------

La solucion a tu problema es tener un numero fijo de letras en tu trama o un delimitador, me explico, es imposible distinguir si solo envias '1' que "10", por que si envias el 1 primero no sabes cual de los 2 es. Distinto es algo asi:

"1n", "10n"

por que luego de recibir el 1, si llega una 'n' se que ahi termina, entonces paso ese '1' a un un numero ( le resto 0x30 ) y me queda 1.
Si llega un '1', luego un '0' y luego la 'n' entonces procedo a restarle 0x30 al '1' y al '0', multiplico el primer valor por 10 y le sumo las unidades, como salida tendria 10

Es decir estoy convirtiendo ese conjunto de caracteres que estaban en ASCII en decimales, una ves que llego la n y terminaste todo lo de la conversion, activas una variable de 1 bit asi con un if en el loop principal entras al switch, antes de salir del if procedes a ponerlo en 0, asi que solo se va a actualizar cuando le pongas un 1 desde la interrupcion.

El codigo que tengo es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "C:\Documents and Settings\Adminest\Escritorio\Prueba Serie PIC PC\p_led\main.h"
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <string.h>
#include <stdlib.h>
#define usart.h
 
#BYTE PORTA = 0XF80
#BYTE PORTB = 0XF81
#BYTE PORTC = 0XF82
#BYTE PORTD = 0XF83
#BYTE PORTE = 0XF84
#BYTE TRISA = 0XF92
#BYTE TRISB = 0XF93
#BYTE TRISC = 0XF94
#BYTE TRISD = 0XF95
#BYTE TRISE = 0XF96
 
char cdna=null;
int cont=0;
char texto[5];
int8 num=0;
 
#int_rda
void rda_isr(void)
{
 cdna=getch();
 
}
 
void main()
{
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  PORTB=0X00;
  TRISB=0B00000000;
  PORTD=0X00;
  TRISD=0B00000000;
  enable_interrupts(int_rda);
  enable_interrupts(global);
 
  while(TRUE)
  {
      if ( cdna != "" )
      {
       texto[cont]=cdna;
       ++cont;
       num=atoi(texto);
       PORTD=0B00000011;
      }
      if ( cdna == 'n' )
      {
      cont=0;
      num=atoi(texto);
      switch (num)
      {
      case 0:PORTB=0B00000000; BREAK;
      case 1:PORTB=0B00000001; BREAK;
      case 2:PORTB=0B00000010; BREAK;
      case 3:PORTB=0B00000011; BREAK;
      case 4:PORTB=0B00000100; BREAK;
      case 5:PORTB=0B00000101; BREAK;
      case 6:PORTB=0B00000110; BREAK;
      case 7:PORTB=0B00000111; BREAK;
      case 8:PORTB=0B00001000; BREAK;
      case 9:PORTB=0B00001001; BREAK;
      case 10:PORTB=0B00001010; BREAK;
      case 11:PORTB=0B11111111; BREAK;
      case 12:PORTB=0B01010101; BREAK;
      case 13:PORTB=0B10101010; BREAK;
      case 14:PORTB=0B11110000; BREAK;
      case 15:PORTB=0B00001111; BREAK;
      case 16:PORTB=0B10101111; BREAK;
      }
      }
      //if ( num < 17 )
      //{ ++num; delay_ms(600);
      //} else { num = 0;}
  }
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder