Grabar con un bootloader a través el puerto serie o el USB
2 participantes
Página 1 de 1.
Grabar con un bootloader a través el puerto serie o el USB
Grabar con un bootloader a través el puerto serie o el USB
1) El monitor de Jack http://www.wsu.edu/~jackdoll/jmon/
Hice unas versiones para SDCC o PIC-GCC http://per.launay.free.fr/pik_digor/moniteur/
Se puede grabar los programas usarios con gtkterm o minicom
2) El monitor de Juan http://www.iearobotics.com/wiki/index.php?title=PIC_Bootloader
Se puede cargar el programa usario a través del puerto serie o usb
http://www.iearobotics.com/wiki/index.php?title=Pydownloader-wx
La video : Cargando programas en la Skypic con el Pydownloader
https://www.youtube.com/watch?v=-t48-Nccp-c
Per
1) El monitor de Jack http://www.wsu.edu/~jackdoll/jmon/
Hice unas versiones para SDCC o PIC-GCC http://per.launay.free.fr/pik_digor/moniteur/
Se puede grabar los programas usarios con gtkterm o minicom
2) El monitor de Juan http://www.iearobotics.com/wiki/index.php?title=PIC_Bootloader
Se puede cargar el programa usario a través del puerto serie o usb
http://www.iearobotics.com/wiki/index.php?title=Pydownloader-wx
La video : Cargando programas en la Skypic con el Pydownloader
https://www.youtube.com/watch?v=-t48-Nccp-c
Per
Re: Grabar con un bootloader a través el puerto serie o el USB
Gracias por los links... muy interesantes.
Parece una forma sencilla de cargar programas y probarlos sin las complicaciones del icsp, ocupando solo 2 pines del pic.
Por lo que me ha parecido en el "monitor de Jack" se puede interactuar con el pic en tiempo real... no?, este me ha gustado por su sencillez. Por lo que he entendido se maneja solo con una terminal serie... no necesita otro software en el PC para comunicarse con el pic?... osea una vez grabado el firmware en el pic solo conectarlo al puerto serie y abrir una terminal serie en el PC y ya está?
El tema es que reduce la memoria disponible del pic... no?
Parece una forma sencilla de cargar programas y probarlos sin las complicaciones del icsp, ocupando solo 2 pines del pic.
Por lo que me ha parecido en el "monitor de Jack" se puede interactuar con el pic en tiempo real... no?, este me ha gustado por su sencillez. Por lo que he entendido se maneja solo con una terminal serie... no necesita otro software en el PC para comunicarse con el pic?... osea una vez grabado el firmware en el pic solo conectarlo al puerto serie y abrir una terminal serie en el PC y ya está?
El tema es que reduce la memoria disponible del pic... no?
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Grabar con un bootloader a través el puerto serie o el USB
La gente que lee el francés : http://per.launay.free.fr/pik_digor/html/moniteur.html
Hice un diagrama de flujo del monitor pero en francés
Con el monitor de Jack se puede comunicar con gtkterm , no necesita otra software.
Cuidado se debe arrancar en una terminal : gtkterm -r '*'
Asi gtkterm espera '*' (una estrella) antes de enviar una nueva linea del fichero hex
Con gtkterm trabajo tambien con el puerto usb con un ft232rl, hay una carta con kicad en mis paginas
Durante 4 segundas, si no pulsa una tecla, el programa usario arranca
si pulsa una tecla el monitor arranca
Si pulsa la tecla "0" se puede leer o modificar la memoria flash
idem "1" la memoria eeprom
"2" la memoria RAM
"3" se carga un programa usario
"4" Arrancar el programa usario
"5" Ver los 256 palabras de la EEPROM
"6" bistable validacion de los interrupciones GIE
"7" Programa de prueba
Como el programa es GPL se puede modificar
Para probar una biblioteca es muy agradable
La version de Jack toma 768 palabras de 14 bits, tengo 2 versiones una igual y una de 1 kilo palabras (añadi un programa de Juan para duplicar PIC)
Los PIC16F877 tienen 8K palabras de 14 bits
Saludos
Per
Hice un diagrama de flujo del monitor pero en francés
Con el monitor de Jack se puede comunicar con gtkterm , no necesita otra software.
Cuidado se debe arrancar en una terminal : gtkterm -r '*'
Asi gtkterm espera '*' (una estrella) antes de enviar una nueva linea del fichero hex
Con gtkterm trabajo tambien con el puerto usb con un ft232rl, hay una carta con kicad en mis paginas
Durante 4 segundas, si no pulsa una tecla, el programa usario arranca
si pulsa una tecla el monitor arranca
Si pulsa la tecla "0" se puede leer o modificar la memoria flash
idem "1" la memoria eeprom
"2" la memoria RAM
"3" se carga un programa usario
"4" Arrancar el programa usario
"5" Ver los 256 palabras de la EEPROM
"6" bistable validacion de los interrupciones GIE
"7" Programa de prueba
Como el programa es GPL se puede modificar
Para probar una biblioteca es muy agradable
La version de Jack toma 768 palabras de 14 bits, tengo 2 versiones una igual y una de 1 kilo palabras (añadi un programa de Juan para duplicar PIC)
Los PIC16F877 tienen 8K palabras de 14 bits
Saludos
Per
Re: Grabar con un bootloader a través el puerto serie o el USB
Me gustaría probar esto, pero creo que tengo el puerto serie roto... así que quizás lo podría hacer por usb... no? :
Quieres decir que tienes algún esquema del circuito en tu página?
EDITO:
creo que ya lo encontré... te refieres a: http://per.launay.free.fr/kicad/realisation/usb/ ??
veo en un esquema (carta): PUERTO USB -> FT232R -> MAX232 -> DB9 ; pero eso es un adaptador USB/serie... no?
Para hacer el monitor se puede conectar directamente FT232 con el pic... no?
Una pregunta: con FT232 se podría hacer un programador directo por USB?
Con gtkterm trabajo tambien con el puerto usb con un ft232rl, hay una carta con kicad en mis paginas
Quieres decir que tienes algún esquema del circuito en tu página?
EDITO:
creo que ya lo encontré... te refieres a: http://per.launay.free.fr/kicad/realisation/usb/ ??
veo en un esquema (carta): PUERTO USB -> FT232R -> MAX232 -> DB9 ; pero eso es un adaptador USB/serie... no?
Para hacer el monitor se puede conectar directamente FT232 con el pic... no?
Una pregunta: con FT232 se podría hacer un programador directo por USB?
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Grabar con un bootloader a través el puerto serie o el USB
Si trabajo con un ft232rl y un pic 16f88 o pic16f876 con la carta usb , tu puedes ver el circuito aqui
http://per.launay.free.fr/kicad/realisation/usb/usb.png hay las fuentes para kicad en http://per.launay.free.fr/kicad/realisation/usb/
El ft232rl sale en 0-5v y se puede enviar directamente las RX, TX al PIC no se necesita el MAX 232 ,cuidado si quieres trabajar con 38400 baudios los hilos deben ser cortos entre el ft232rl y el PIC, el cable USB puede ser de 1m entre el ft232 y el PC
Per
http://per.launay.free.fr/kicad/realisation/usb/usb.png hay las fuentes para kicad en http://per.launay.free.fr/kicad/realisation/usb/
El ft232rl sale en 0-5v y se puede enviar directamente las RX, TX al PIC no se necesita el MAX 232 ,cuidado si quieres trabajar con 38400 baudios los hilos deben ser cortos entre el ft232rl y el PIC, el cable USB puede ser de 1m entre el ft232 y el PC
Per
Re: Grabar con un bootloader a través el puerto serie o el USB
Pues parece un circuito muy sencillo...
No encuentro el ft232 para compralo donde yo vivo... tendré que pedirlo por internet.
Una pregunta: veo que el ft232 tiene RTS, CTS, DTR,... etc. estos pines se pueden contrplar por USB?
La idea es conectar un programador serie por el puerto USB, alguien preguntaba algo parcecido pero USB-paralelo:
https://pic-linux.forosactivos.net/piklab-f3/como-compilar-piklab-pikloops-y-pk2cmd-para-programar-con-pickit-2-t66.htm#105
No encuentro el ft232 para compralo donde yo vivo... tendré que pedirlo por internet.
Una pregunta: veo que el ft232 tiene RTS, CTS, DTR,... etc. estos pines se pueden contrplar por USB?
La idea es conectar un programador serie por el puerto USB, alguien preguntaba algo parcecido pero USB-paralelo:
https://pic-linux.forosactivos.net/piklab-f3/como-compilar-piklab-pikloops-y-pk2cmd-para-programar-con-pickit-2-t66.htm#105
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Grabar con un bootloader a través el puerto serie o el USB
El ft232rl se compra en Farnel por ejemplo. Se debe poner dos modulos usbserial y ftdi_sio con modprobe para probar y despues ponerlos en /etc/modules. Cuidado para soldar el componente y suerte ( trabajo en un instituto (lycée) y tenemos un horno para los SMD)
Puedes usar todo el puerto serie. Es decir que cuando usas /dev/ttyUSB0 se usa los dos modulos para transformar el comando serie en usb y el ft232rl hace al revés.
Si no usas el estandar del puerto serie no se si funciona bien.
Per
Puedes usar todo el puerto serie. Es decir que cuando usas /dev/ttyUSB0 se usa los dos modulos para transformar el comando serie en usb y el ft232rl hace al revés.
Si no usas el estandar del puerto serie no se si funciona bien.
Per
Re: Grabar con un bootloader a través el puerto serie o el USB
Hola...
Quiero probar el Bootloader en otro ordenador con max232 por puerto serie.
He montado el circuito en protoboard, he descargado jmonitor1.0, lo he grabado a un pic16f876... supongo que se puede con 876 también... no?
Que configuración hay que poner en Gtkterm?...
Que reloj pongo en el pic?
En las pruebas que he hecho no pasa nada al encender el pic...
A ver si consigo probar esto, me sería muy util.
Saludos.
Quiero probar el Bootloader en otro ordenador con max232 por puerto serie.
He montado el circuito en protoboard, he descargado jmonitor1.0, lo he grabado a un pic16f876... supongo que se puede con 876 también... no?
Que configuración hay que poner en Gtkterm?...
Que reloj pongo en el pic?
En las pruebas que he hecho no pasa nada al encender el pic...
A ver si consigo probar esto, me sería muy util.
Saludos.
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Grabar con un bootloader a través el puerto serie o el USB
El reloj del monitor de Jack es 20 MHZ,yo trabajo con un cuarzo de 4 MHZ
en el fichero f877_jmon.inc hay en las lineas 85 -87
;baud rate constant with 20MHz clock...
baud_rate equ 040h ;19200 d'64'(subroutine serialsetup)
;baud_9600 equ 081h ;d'129'
Abajo de GtkTerm \dev\ttyS0 : 19200,8,N,1
Puedes modificar en la ventana configuracion puerto
hay tambien "Contrôle de flux" none
Si haces un reset : si hay una resistencia de polarización en MCLR, pon hilo a masa para hacer el reset
Se debe ver :
Jack's Monitor V1.0
(si apoya la tecla "0")
>Flash @>
cuidado con el monitor de Jack debes empezar tu programa en 0x0020
si trabajas en ensamblador, no hay problemas con org pero en C es mas dificil
Trabajo con este monitor, un pocillo modificado desde 2 años
Si puedo ayudarte, ¡ pregunta !
Per
en el fichero f877_jmon.inc hay en las lineas 85 -87
;baud rate constant with 20MHz clock...
baud_rate equ 040h ;19200 d'64'(subroutine serialsetup)
;baud_9600 equ 081h ;d'129'
Abajo de GtkTerm \dev\ttyS0 : 19200,8,N,1
Puedes modificar en la ventana configuracion puerto
hay tambien "Contrôle de flux" none
Si haces un reset : si hay una resistencia de polarización en MCLR, pon hilo a masa para hacer el reset
Se debe ver :
Jack's Monitor V1.0
(si apoya la tecla "0")
>Flash @>
cuidado con el monitor de Jack debes empezar tu programa en 0x0020
si trabajas en ensamblador, no hay problemas con org pero en C es mas dificil
Trabajo con este monitor, un pocillo modificado desde 2 años
Si puedo ayudarte, ¡ pregunta !
Per
Re: Grabar con un bootloader a través el puerto serie o el USB
Bien... pues ya conseguí que funcione, al final lo hice con tu versión (monitor.hex) con un cristal a 4 MHz y a 9600 baud.
Lo estoy probando en un pic16f876, ... vale también para pic16f876a?... creo que había una versión diferente para la serie "a"... no?
Ya te iré preguntando dudas mientras lo esté usando... no entiendo bién como hacer debugging mientras el programa usuario está funcionando.
Una cosa: las rutinas Usart y escritura eeprom y flash del monitor están disponibles para programas de usuario.. no?
Es decir puedo hacer un programa en que se llame a estas rutinas sin tener que escribirlas de nuevo?
EDITO:
Se podría hacer otra versión solo para debugging, sin la capacidad para cargar programas, pero que permita ver como está funcionando el programa??
Esto lo digo para pics que no soportan auto-programación, pero sí tienen usart, si se hace un "monitor" y se añade al código del programa y se graba normalmente con cualquier grabador. Se podrían hacer diagnósticos de funcionamiento... no?... sería posible esto?
Lo estoy probando en un pic16f876, ... vale también para pic16f876a?... creo que había una versión diferente para la serie "a"... no?
Ya te iré preguntando dudas mientras lo esté usando... no entiendo bién como hacer debugging mientras el programa usuario está funcionando.
Una cosa: las rutinas Usart y escritura eeprom y flash del monitor están disponibles para programas de usuario.. no?
Es decir puedo hacer un programa en que se llame a estas rutinas sin tener que escribirlas de nuevo?
EDITO:
Se podría hacer otra versión solo para debugging, sin la capacidad para cargar programas, pero que permita ver como está funcionando el programa??
Esto lo digo para pics que no soportan auto-programación, pero sí tienen usart, si se hace un "monitor" y se añade al código del programa y se graba normalmente con cualquier grabador. Se podrían hacer diagnósticos de funcionamiento... no?... sería posible esto?
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Grabar con un bootloader a través el puerto serie o el USB
¡ Buen año nuevo !
La grabación de los PIC16F87x y PIC16F87xA es diferente , puedes encontrar mi monitor por los 16F87xA aqui http://per.launay.free.fr/pik_digor/moniteur/monitorA/ se debe ejecutar el programa monitorA.py
para usar en un terminal ./monitorA.py , no olvidas antes el chmod u+x monitor.py
Despues hay 2 ficheros symbol-tablesA.inc y symol-tableA.inc, puedes usar si trabajas en ensamblador en C me parece mas dificil
El "debugging" (como se dice en español en francés tenemos el verbo "deverminer")
Trabajo con alumnos que empiezan el lenguaje C (sdcc) y los microcontroladores PIC16F877 y PIC16F88,
entonces uso mucho el printf.
Cuando usan una bucle (for,while...)
despues deben poner
printf("salida de bucle");
Y dentro de un programa, "mensaje 1",... "mensaje n"
Se hace una emulación ...
Con el monitor y el puerto serie es muy facil modificar, compilar, grabar y ¡ ver lo que funciona o no !
Pero si trabajas en tiempo real con interrupciones puedes usar variables de control y fijar estas variables de manera ciclica.
Saludos
Per
La grabación de los PIC16F87x y PIC16F87xA es diferente , puedes encontrar mi monitor por los 16F87xA aqui http://per.launay.free.fr/pik_digor/moniteur/monitorA/ se debe ejecutar el programa monitorA.py
para usar en un terminal ./monitorA.py , no olvidas antes el chmod u+x monitor.py
Despues hay 2 ficheros symbol-tablesA.inc y symol-tableA.inc, puedes usar si trabajas en ensamblador en C me parece mas dificil
El "debugging" (como se dice en español en francés tenemos el verbo "deverminer")
Trabajo con alumnos que empiezan el lenguaje C (sdcc) y los microcontroladores PIC16F877 y PIC16F88,
entonces uso mucho el printf.
Cuando usan una bucle (for,while...)
despues deben poner
printf("salida de bucle");
Y dentro de un programa, "mensaje 1",... "mensaje n"
Se hace una emulación ...
Con el monitor y el puerto serie es muy facil modificar, compilar, grabar y ¡ ver lo que funciona o no !
Pero si trabajas en tiempo real con interrupciones puedes usar variables de control y fijar estas variables de manera ciclica.
Saludos
Per
Re: Grabar con un bootloader a través el puerto serie o el USB
No he podido hacer casi nada con el monitor estos días, además estoy haciendo las pruevas con un PC viejo que es muy lento para todo y además se le estropeó una tarjeta de memoria, y ahora solo con 128 MB es lentiiiisimo... voy a conseguir un cable usb-serie para usar mi PC y entonces podré hacer algo.
Ya entiendo como hacerlo con printf... se van mandando mensajes por uart al PC, así sabes por donde va pasando y eso... además se podrían mandar datos, por ejemplo para probar adc, se podrían visualizar los valores leidos y cosas así.. no?.
Lo de las interrupciones no lo tengo muy claro, te refieres a probocar una interrupcion en determinados puntos del programa y en ese momento poder leer o escribir la memoria desde el PC para probar cosas distintas?
Eso de fijar las variables de forma cíclica no lo he entendido...
De todas formas primero tengo que conseguir un puerto serie en mi PC para empezar a conocer bien el funcionamiento
Se podría probocar una interrupción cada ciclo de instrucciones y volcar los registros que se quiera vigilar al PC... bueno estoy imaginando mucho por ahora; vamos a empezar por el principio...
Gracias por las informaciones.
Ya entiendo como hacerlo con printf... se van mandando mensajes por uart al PC, así sabes por donde va pasando y eso... además se podrían mandar datos, por ejemplo para probar adc, se podrían visualizar los valores leidos y cosas así.. no?.
Lo de las interrupciones no lo tengo muy claro, te refieres a probocar una interrupcion en determinados puntos del programa y en ese momento poder leer o escribir la memoria desde el PC para probar cosas distintas?
Eso de fijar las variables de forma cíclica no lo he entendido...
De todas formas primero tengo que conseguir un puerto serie en mi PC para empezar a conocer bien el funcionamiento
Se podría probocar una interrupción cada ciclo de instrucciones y volcar los registros que se quiera vigilar al PC... bueno estoy imaginando mucho por ahora; vamos a empezar por el principio...
Gracias por las informaciones.
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Grabar con un bootloader a través el puerto serie o el USB
Se emplea para probar los programas y tambien para probar adc y temporizador por ejemplo el modo "captura" con un ventilador (3 hilos).
Con las interrupciones, no trabajo con los alumnos y no se puede usar el puerto serie dentro de una interrupción toma demasiado tiempo pero se puede usar variables y enviarlas en el programa principal.
Si te gusta el puerto serie hay tambien un "laboratorio de bolsillo" http://www.liberlab.net/, hice una version para el pic16f877
http://per.launay.free.fr/pik_digor/liberlab_pic/
Con ejemplos en http://per.launay.free.fr/pik_digor/demo_fete_science/
Saludos
Per
Con las interrupciones, no trabajo con los alumnos y no se puede usar el puerto serie dentro de una interrupción toma demasiado tiempo pero se puede usar variables y enviarlas en el programa principal.
Si te gusta el puerto serie hay tambien un "laboratorio de bolsillo" http://www.liberlab.net/, hice una version para el pic16f877
http://per.launay.free.fr/pik_digor/liberlab_pic/
Con ejemplos en http://per.launay.free.fr/pik_digor/demo_fete_science/
Saludos
Per
Re: Grabar con un bootloader a través el puerto serie o el USB
Pues ya tengo puerto serie...
He estado haciendo algunos intentos con el monitor y gtkterm, para cargar programas muy bien.. funciona perfecto.
Ahora intento hacer algo más interactivo, por lo pronto quiero usar las subrutinas del monitor, pero no tengo claro como hacerlo. He encontrado esto:
He intentado llamar a alguna de las subrutinas pero no me funciona... no sé como hay que hacerlo.
Podrías poner algún pequeño ejemplo de cómo usar estas subrutinas en un programa?
Gracias...
He estado haciendo algunos intentos con el monitor y gtkterm, para cargar programas muy bien.. funciona perfecto.
Ahora intento hacer algo más interactivo, por lo pronto quiero usar las subrutinas del monitor, pero no tengo claro como hacerlo. He encontrado esto:
- Código:
;==========================================================================
;monitor subroutines can be called from user code
;these can be cut and pasted to define the subroutines in user code
;monitor subroutines.......(n)=returned RAM bank
;
startuser equ 01cffh ; run user code
monitor equ 01d08h ;()jump into monitor, hard reset
runmon equ 01d2ah ;()jump into monitor
eeread equ 01f70h ;(2)eeread returns byte addressed in eeadr
eewrite equ 01f62h ;(3)eewrite writes the byte to eeprom memory
; at the current eeadr
flashread equ 01f84h;(3)read a location in flash program memory
;,or in eeprom data
;address is in eeadrh and eeadr
;data returns in eedath and eedata
flashwrite equ 01f77h;(3)write to a location in the flash program
;memory -address in eeadrh and eeadr
;data in eedath and eedata
getdigit equ 01fb6h ;(0)get usart byte and convert to hex digit
; in low nibble of w
gethexbyte equ 01fabh ;(3)two ascii digits from the usart-
;convert to a byte in w
gethexword equ 01fa6h ;(3)two hex bytes returned in addrfh,addrfl
getkey equ 01fbeh ;(0)getkey checks input for esc,goes to runmon
;,or returns ascii key
getbin equ 01fd0h ;(3)fast getbyte from usart for loader,
; -no echo adds to checksum
sendbyte equ 01fc6h ;(0) byte in w as two hex char to usart
sendcrlf equ 01eebh ;(0)send a cr/lf sequence
serialsetup equ 01f8fh ;(0)initialize the usart for tx,rx
; at default baud rate
serrx equ 01f9ah ;(0)read a byte from usart, return in w
sertx equ 01fa0h ;(0)transmit byte from w register
sendstring equ 01febh ;(2)unpacks one ascii line to the usart
;strings are format: da "string\0" (nul term)
;must enter with eeadr,eeadrh pointing to a string
;macro mssg calls this routine
He intentado llamar a alguna de las subrutinas pero no me funciona... no sé como hay que hacerlo.
Podrías poner algún pequeño ejemplo de cómo usar estas subrutinas en un programa?
Gracias...
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Grabar con un bootloader a través el puerto serie o el USB
Cual pic usas ?
Trabajo con un pic16f877
Trabajo con picgcc y por ejemplo se puede usar flashread con
// ./compila.sh ej_lectura_flash 16f877a .
#include <pic/p16f877a.h>
#define FOSC_HZ 4000000
#include <uart.h>
#include <uart2.h>
#define flashread 0x1f7a
int main (void)
{
int a,b;
uart_open(SET_9600_8N1);
uart_putc('\n');
uart_puts("*Lecture(a) Flash");
uart_putc('\n');
while(1)
{
uart_puts("direccion adresse ");
a = getint(uart_getc);
putint(uart_putc,a);
EEADRH=a>>8;
EEADR=a&0xff;
__asm__ __volatile__ ("movlw 0x1f");
__asm__ __volatile__ ("movwf PCLATH");
__asm__ __volatile__ ("call 0x1f7a");
__asm__ __volatile__ ("clrf PCLATH");
b=(EEDATH<<|EEDATA;
uart_puts(" contenu(ido) ");
putint(uart_putc,b);
uart_putc('\n');
}
return 0;
}
Cadena : Un poco de francés y español ')" target="_blank" rel="nofollow">
Si trabajas en ensemblador, no olvidas que las variables estan en el banco 3
Despues de la rutina, hay un numero entre paréntesis por ejemplo eeread ; (2) es decir que al salir de la rutina estas en el banco 2
Si tienes un ejemplo, puedes escribirlo aqui o aca o enviarme en mi dirección
Trabajo con un pic16f877
Trabajo con picgcc y por ejemplo se puede usar flashread con
// ./compila.sh ej_lectura_flash 16f877a .
#include <pic/p16f877a.h>
#define FOSC_HZ 4000000
#include <uart.h>
#include <uart2.h>
#define flashread 0x1f7a
int main (void)
{
int a,b;
uart_open(SET_9600_8N1);
uart_putc('\n');
uart_puts("*Lecture(a) Flash");
uart_putc('\n');
while(1)
{
uart_puts("direccion adresse ");
a = getint(uart_getc);
putint(uart_putc,a);
EEADRH=a>>8;
EEADR=a&0xff;
__asm__ __volatile__ ("movlw 0x1f");
__asm__ __volatile__ ("movwf PCLATH");
__asm__ __volatile__ ("call 0x1f7a");
__asm__ __volatile__ ("clrf PCLATH");
b=(EEDATH<<|EEDATA;
uart_puts(" contenu(ido) ");
putint(uart_putc,b);
uart_putc('\n');
}
return 0;
}
Cadena : Un poco de francés y español ')" target="_blank" rel="nofollow">
Si trabajas en ensemblador, no olvidas que las variables estan en el banco 3
Despues de la rutina, hay un numero entre paréntesis por ejemplo eeread ; (2) es decir que al salir de la rutina estas en el banco 2
Si tienes un ejemplo, puedes escribirlo aqui o aca o enviarme en mi dirección
Re: Grabar con un bootloader a través el puerto serie o el USB
Pero en ese ejemplo que has dado no usas las rutinas del monitor...
Por ejemplo consigo mandar un bit por uart, sin hacer nada, solo esto:
TXREG = mi_byte;
TXEN=1;
Porque el monitor ya inició usart, y tiene todas las funciones,...
Lo que yo quiero es en asm usar algo como esto:
pagesel ..?
call sendbyte
y no tener que iniciar usart desde mi programa.
Gracias.
Por ejemplo consigo mandar un bit por uart, sin hacer nada, solo esto:
TXREG = mi_byte;
TXEN=1;
Porque el monitor ya inició usart, y tiene todas las funciones,...
Lo que yo quiero es en asm usar algo como esto:
pagesel ..?
call sendbyte
y no tener que iniciar usart desde mi programa.
Gracias.
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Grabar con un bootloader a través el puerto serie o el USB
He abierto el chat arcachofo !
Si quieres usar la rutina sendbyte hay que poner antes
movlw 0x1f
movwf PCLATH
call sendbyte
clrf PCLATH
Debes hacer eso porque debes cambiar de pagina
b=(EEDATH << 8 ) | EEDATA ; aqui no me gustan las emoticones
Saludos
Per
Si quieres usar la rutina sendbyte hay que poner antes
movlw 0x1f
movwf PCLATH
call sendbyte
clrf PCLATH
Debes hacer eso porque debes cambiar de pagina
b=(EEDATH << 8 ) | EEDATA ; aqui no me gustan las emoticones
Saludos
Per
Re: Grabar con un bootloader a través el puerto serie o el USB
Gracias....
Esa era la información que necesitaba.... el bootloader vá muy bien, es muy rápido de modificar un programa, cargarlo al pic y ver como funciona, solo me falta utilizar el monitor para ver algunas cosas que pasan... por ejemplo mandar variables o registros que quiera al PC y así ver como está funcionando.
Además si establezco "puntos de parada" puedo cambiar cosas desde el PC y ver como funciona...
Para esto puedo usar?:
movlw 0x1d
movwf PCLATH
call runmon
clrf PCLATH
EDITO:
no había visto esto:
__asm__ __volatile__ ("movlw 0x1f");
__asm__ __volatile__ ("movwf PCLATH");
__asm__ __volatile__ ("call 0x1f7a");
__asm__ __volatile__ ("clrf PCLATH");
Porqué usas usart de PICGCC, no se puede usar "sendstring" del monitor???
Esa era la información que necesitaba.... el bootloader vá muy bien, es muy rápido de modificar un programa, cargarlo al pic y ver como funciona, solo me falta utilizar el monitor para ver algunas cosas que pasan... por ejemplo mandar variables o registros que quiera al PC y así ver como está funcionando.
Además si establezco "puntos de parada" puedo cambiar cosas desde el PC y ver como funciona...
Para esto puedo usar?:
movlw 0x1d
movwf PCLATH
call runmon
clrf PCLATH
EDITO:
no había visto esto:
__asm__ __volatile__ ("movlw 0x1f");
__asm__ __volatile__ ("movwf PCLATH");
__asm__ __volatile__ ("call 0x1f7a");
__asm__ __volatile__ ("clrf PCLATH");
Porqué usas usart de PICGCC, no se puede usar "sendstring" del monitor???
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Grabar con un bootloader a través el puerto serie o el USB
¡ Hola !
Si trabajas con PICGCC, se puede usar un puntero a función
Pedro José Ramírez Gutiérrez me da la solución :
#define flashread ((void (*)(void))0x1f7a)
un ejemplo con el monitor de Jack, monitor del pic16f877
si usas el pic16f877a hay que cambiar la dirección 0x1f7a
// ./compila.sh ej_lectura_flash3 16f877a .
#include <pic/p16f877a.h>
#define FOSC_HZ 4000000
#include <uart.h>
#include <uart2.h>
// se usa la dirección de la rutina flashread definida en el monitor
// dirección en symbol-table.inc
#define flashread ((void (*)(void))0x1f7a)
int main (void)
{
int a,b;
uart_open(SET_9600_8N1);
uart_putc('\n');
uart_puts("*Lecture(a) Flash");
uart_putc('\n');
while(1)
{
uart_puts("direccion adresse ");
a = getint(uart_getc);
putint(uart_putc,a);
EEADRH=a>>8;
EEADR=a&0xff;
flashread();
b=(EEDATH<<|EEDATA;
uart_puts(" contenu(ido) ");
putint(uart_putc,b);
uart_putc('\n');
}
return 0;
}
No se debe cambiar de pagina PIC-GCC lo hace !
Gracias Pedro
saludos
Per
Si trabajas con PICGCC, se puede usar un puntero a función
Pedro José Ramírez Gutiérrez me da la solución :
#define flashread ((void (*)(void))0x1f7a)
un ejemplo con el monitor de Jack, monitor del pic16f877
si usas el pic16f877a hay que cambiar la dirección 0x1f7a
// ./compila.sh ej_lectura_flash3 16f877a .
#include <pic/p16f877a.h>
#define FOSC_HZ 4000000
#include <uart.h>
#include <uart2.h>
// se usa la dirección de la rutina flashread definida en el monitor
// dirección en symbol-table.inc
#define flashread ((void (*)(void))0x1f7a)
int main (void)
{
int a,b;
uart_open(SET_9600_8N1);
uart_putc('\n');
uart_puts("*Lecture(a) Flash");
uart_putc('\n');
while(1)
{
uart_puts("direccion adresse ");
a = getint(uart_getc);
putint(uart_putc,a);
EEADRH=a>>8;
EEADR=a&0xff;
flashread();
b=(EEDATH<<|EEDATA;
uart_puts(" contenu(ido) ");
putint(uart_putc,b);
uart_putc('\n');
}
return 0;
}
No se debe cambiar de pagina PIC-GCC lo hace !
Gracias Pedro
saludos
Per
Re: Grabar con un bootloader a través el puerto serie o el USB
Gracias Per, eso es lo que necesitaba.
Hace un tiempo que no experimento nada con el monitor, lo estoy usando solamente como Bootloader.
Las últimas pruebas que hice con los cambios de página no me funcionaron y lo dejé ahí, a ver si ahora retomo el tema y consigo mejores resultados.
Ya informaré si consigo hacer algo interesante.
Hace un tiempo que no experimento nada con el monitor, lo estoy usando solamente como Bootloader.
Las últimas pruebas que hice con los cambios de página no me funcionaron y lo dejé ahí, a ver si ahora retomo el tema y consigo mejores resultados.
Ya informaré si consigo hacer algo interesante.
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Grabar con un bootloader a través el puerto serie o el USB
Después de un tiempo estoy otra vez experimentando con los bootloaders estos...
Entonces me encontré con una pequeña pega:
El monitor modificado por Per ma parce más util, porque no tiene el problema de tener que comenzar el programa en 0x020, entonces se puede usar facilmente con programas escritos y compilados en cualquier lenguaje.
Pero el monitor de Per está configurado para 4 Mhz y 9600 baud. y yo quiero usarlo para 20 Mhz y 19200 baud, entonces hay que mocificar unas lineas en el archivo: f877_jmon2.inc , en las lineas 85 en adelante, ahí se ajustan los valores para el prescaler del timer0 y para el BRG (baudrate generator). Estos son los valores que yo tengo, para cambiar solo hay que dejar descomentadas las lineas que nos interesen, se pueden deducir otros valores a partir de estos:
Una vez modificado el archivo f877_jmon2.inc , se compila monitor.asm y se graba al PIC.
Yo lo he probado con un PIC16F876.
Saludos a todos.
Entonces me encontré con una pequeña pega:
El monitor modificado por Per ma parce más util, porque no tiene el problema de tener que comenzar el programa en 0x020, entonces se puede usar facilmente con programas escritos y compilados en cualquier lenguaje.
Pero el monitor de Per está configurado para 4 Mhz y 9600 baud. y yo quiero usarlo para 20 Mhz y 19200 baud, entonces hay que mocificar unas lineas en el archivo: f877_jmon2.inc , en las lineas 85 en adelante, ahí se ajustan los valores para el prescaler del timer0 y para el BRG (baudrate generator). Estos son los valores que yo tengo, para cambiar solo hay que dejar descomentadas las lineas que nos interesen, se pueden deducir otros valores a partir de estos:
- Código:
;==========================================================================
; read readme.txt for more information
;baud rate constant with 4MHz clock...
;baud_rate equ 019h ;d'25' para 9600 baudios (4 MHz)
; Timer0 prescaler with 4MHz clock...
;scale_tmr0 equ b'00000101' ;tmr0 prescaler, 1:64
;baud rate constant with 20MHz clock...
baud_rate equ 040h ;d'64' para 19200 baudios (20 MHz)
;baud_rate equ 081h ;d'129' para 9600 baudios (20 MHz)
; Timer0 prescaler with 20MHz clock...
scale_tmr0 equ b'00000111' ;tmr0 prescaler, 1:256
;==============================================================================
Una vez modificado el archivo f877_jmon2.inc , se compila monitor.asm y se graba al PIC.
Yo lo he probado con un PIC16F876.
Saludos a todos.
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Temas similares
» manejo del puerto serie con Python
» no consigo conectar con el puerto serie de mi PC
» Otro de GAMBAS con el puerto serie
» QextSerialPort: Controlando el puerto Serie con Qt
» GAMBAS Almenos es basic- Puerto Serie - PIC16F628A
» no consigo conectar con el puerto serie de mi PC
» Otro de GAMBAS con el puerto serie
» QextSerialPort: Controlando el puerto Serie con Qt
» GAMBAS Almenos es basic- Puerto Serie - PIC16F628A
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.