Hola! estoy tratando de migrar un programa en ASM ( no importa lcómo esté hecho) a CCS, y cuando lo consiga lo trataré de hacer en C18.
* Tengo un programa en VisualC++ que manda por puerto serie, al COM1, información ( una letra, para ser exactos).
* Mediante un programa en ASM, y con el simulador ISIS, el pic reconoce la información mandada y efectua la operación ( encender un led en puerto B).
- Puedo comprobar que desde mi aplicación VisualC++, el dato es transferido correctamente por el puerto serie, gracias a Hyperterminal.
- Al ejecutar el programa ASM ( no hecho por mi) y ver resultado por ISIS, también veo lo mismo por el "Hyperterminal" virtual que trae consigo.
* Al querer migrar ese programa en ASM, a una aplicación hecha en C asumo, de momento, que el programa encenderá un led ( el mismo) sea cual sea la letra que hayamos pulsado.
PROBLEMAS:
1) Antes de ver si enciend o no el led, tengo un problema ( y de aqui supongo que parte todo) con el "Hyperterminal" Virtual del ISIS. Si pongo esta línea:
#use rs232(baud=9600,stream=COM2,BITS=8,PARITY=N)
el "Hyperterminal" Virtual del ISIS reconoce lo mismo que el Hyperterminal de Windows, aunque no hace caso del dato mandado ( no le pongo que pines son Tx y Rx...)
2) Si lo hago como desde el principio lo hacia, o sea, así :
#use rs232(baud=9600, xmit=PIN_A3,rcv=PIN_A4,stream=COM2,BITS=8,PARITY=N,FORCE_SW)
El "Hyperterminal" Virtual del ISIS, nisiquiera lee lo que hay realmente en el COM2.
cabe decir que la aplicación VisualC++ transmite dato desde COM1, y el COM del ISIS, es COM2.
Y aqui os pongo el programa:
#include <16F84A.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=4000000)
#include <stdio.h>
#use rs232(baud=9600, xmit=PIN_A3,rcv=PIN_A4,stream=COM2,BITS=8,PARITY=N,FORCE_SW)
//#use rs232(baud=9600,stream=COM2,BITS=8,PARITY=N)
#use fast_io(A)
#use fast_io(B)
#byte porta=0x05
#byte trisa=0x85
#byte portb=0x06
#byte trisb=0x86
#byte OptionRegister=0x81
#bit RBPU=0x81.7
#bit TOCS=0x81.5
/*#define LCD_ENABLE_PIN PIN_A2
#define LCD_RS_PIN PIN_A0
#define LCD_TYPE 2*/
void main()
{
char letra;
output_low(pin_B0);
output_low(pin_B1);
output_low(pin_B2);
output_low(pin_B3);
while(1){
RBPU=1;
TOCS=0 ;//no usa el pin A4 como clk
trisb=0x00;
//trisa=0b00010000;
while(kbhit()){
//output_high(pin_B3);
}
switch(letra){
case 'a': output_high(pin_B0);delay_ms(500);
case 'b': output_high(pin_B0);delay_ms(500);
case 'l': output_high(pin_B0);delay_ms(500);
case 't': output_high(pin_B0);delay_ms(500);
}
}//while(1)
}//main
Problemas que he creido ver:
1) El PortA tiene en PIN_A4 que es Input/output o clock externo para input del Timer0. Como no quiero usar timer0, sólo quiero que sea un simple I/O, y quieria deshabilitar los pullups en el puerto B, he hecho esto :
#byte OptionRegister=0x81
#bit RBPU=0x81.7
#bit TOCS=0x81.5
donde dentro del main pongo los valores:
, que significan ( leyendo datasheet) :
bit 7 RBPU: PORTB Pull-up Enable bit
1 = PORTB pull-ups are disabled
0 = PORTB pull-ups are enabled by individual port latch values
bit 5 T0CS: TMR0 Clock Source Select bit
1 = Transition on RA4/T0CKI pin
0 = Internal instruction cycle
clock (CLKOUT
)
Después de efectuar estos cambios, sigo sin ver resultado con mi programa en CCS... ¿ Alguien reconoce el error ?
Gracias!