t-edson / picpas Goto Github PK
View Code? Open in Web Editor NEWCompilador en Pascal para microcontroladores PIC / Pascal compiler for PIC microcontrollers
License: GNU General Public License v2.0
Compilador en Pascal para microcontroladores PIC / Pascal compiler for PIC microcontrollers
License: GNU General Public License v2.0
Hola, he intentado acceder desde ensamblador a las partes LOW y HIGH de una variable numérica tipo word.
No he encontrado un modo ya implementado de acceder a ellas, y realizando pruebas he intentado definir esto:
var
resultado : word absolute $20;
resultadoLOW : byte absolute $20;
resultadoHIGH : byte absolute $21;
Sin embardo, el resultado no ha sido el esperado ya que el compilador asigna la misma dirección a la parte alta y baja de la variable tipor word si se define como absoluta:
resultado@0 EQU 0x020
resultado@1 EQU 0x020
resultadoLOW EQU 0x020
resultadoHIGH EQU 0x021
Supongo que en principio (sin optimizaciones) resultado@1 debería haber ocupado la dirección 0x021.
¿Se complicado implementar las función High(word) y Low(word) de conversión para acceder a las partes LOW y HIGH de variables word?
Gracias. Un saludo.
as the project grows and you have more devices and examples I believe that there are many files in the unit folder that are difficult to find ...
suggestion:
create folder devices for device files and keep the functions in the folder unit or another with another name ...
Altered the Hello World blink program for a pic16f886. When loaded with the pickit3, there is a warning that there are no configuration words in the hex file. Also program does not work.
Program.txt
This is a copy of the program. I probably missed something easy. I used to use Turbo Pascal for work around 25 yrs ago and
trying to come up to speed on microprocessors.
Am I correct in assuming it is ok to use a PicKit3?
Last few lines of example LCD_Test.pas
until Counter = 0;
LcdCommand(LCD_CLEAR_DISPLAY);
end;
end.
///*************************************************************//174
not working this from source-github....
LcdCommand(LCD_CLEAR_DISPLAY);
end;
end; <======= ***** this inserted, compilation succesfull ....
end.
///*************************************************************//174
only the END; inserted and compilation successfull -- any idea why?
Hi,
Cuistax, you did a lot of work on PIC declaration files !
I have checked the PIC16F1825.pas in 'devices17' and it seems to miss the SET_STATE_RAM declaration for the core registers in each bank. Only the INDF register is declared. The SET_MAPPED_RAM section semms to be well defined.
define
on = 1
off = 0
high=1
low=0
true=1
false=0
bitisSet
bitisClear
setbit
clearbit
delay_us();
some below that I found on the net
;LIBRERIA DE MACROS PARA PIC GAMA MEDIA ENHANCED 16F1XXX
_HIGH EQU 0x1
_LOW EQU 0x0
;CONFIGURACION DE PINES DEL MICRO********
;-------------PIN MODE OUTPUT---------------------
;Configura cualquiera de los pines como SALIDA
;-------------------------------------------------
_pin_m_out macro TRISX,PORTX,LATX,ANSELX,RXX
banksel PORTX
bcf PORTX,RXX
banksel ANSELX
bcf ANSELX,RXX
banksel TRISX
bcf TRISX,RXX
endm
;-------------PIN MODE INPUT---------------------
;Configura cualquiera de los pines como ENTRADA
;------------------------------------------------
_pin_m_in macro TRISX,PORTX,LATX,ANSELX,RXX
banksel PORTX
bcf PORTX,RXX
banksel ANSELX
bcf ANSELX,RXX
banksel TRISX
bsf TRISX,RXX
endm
;-------------PIN HIGH---------------------------
;Coloca un estado ALTO en el PIN seleccionado
;------------------------------------------------
_pin_hi macro TRISX,PORTX,LATX,ANSELX,RXX
banksel LATX
bsf LATX,RXX
endm
;-------------PIN LOW---------------------------
;Coloca un estado BAJO en el PIN seleccionado
;-----------------------------------------------
_pin_lo macro TRISX,PORTX,LATX,ANSELX,RXX
banksel LATX
bcf LATX,RXX
endm
;-------------PORT MODE OUTPUT---------------------
;Configura un PUERTO completo como SALIDA
;-------------------------------------------------
_port_m_out macro PORTX
banksel PORTX
clrf PORTX
banksel ANSELX
clrf ANSELX
banksel TRISX
clrf TRISX
endm
;-------------PORT MODE INPUT---------------------
;Configura un PUERTO completo como ENTRADA
;-------------------------------------------------
_port_m_in macro PORTX
banksel PORTX
clrf PORTX
banksel ANSELX
clrf ANSELX
banksel TRISX
movlw B'11111111'
movwf TRISX
endm
;******************************************************
;MANEJO DE REGISTROS DEL MICRO*********
;-------------FILE REGISTER BIT HIGH-----------------------
;Coloca un estado ALTO en el BIT del REGISTRO seleccionado
;----------------------------------------------------------
_fb_hi macro file,bit
banksel file
bsf file,bit
endm
;-------------FILE REGISTER BIT LOW------------------------
;Coloca un estado BAJO en el BIT del REGISTRO seleccionado
;----------------------------------------------------------
_fb_lo macro file,bit
banksel file
bcf file,bit
endm
;-------------FILE REGISTER LITERAL------------------------
;Carga un valor LITERAL en el REGISTRO seleccionado
;----------------------------------------------------------
_fb_li macro file,value
banksel file
movlw value
movwf file
endm
;**********************************************************
;-------------IF PIN HIGH GOTO LABEL------------------------
;SI el PIN se encuentra en ALTO GOTO label
;-----------------------------------------------------------
_if_pin_hi_go macro TRISX,PORTX,LATX,ANSELX,RXX,label
pagesel label
banksel PORTX
btfsc PORTX,RXX
goto label
endm
;-------------IF PIN LOW GOTO LABEL-------------------------
;Si el PIN se encuentra en BAJO GOTO label
;-----------------------------------------------------------
_if_pin_lo_go macro TRISX,PORTX,LATX,ANSELX,RXX,label
pagesel label
banksel PORTX
btfss PORTX,RXX
goto label
endm
;-------------IF FILE REGISTER BIT HIGH GOTO LABEL----------
;Si el BIT del FILE REGISTER se encuentra en ALTO GOTO label
;-----------------------------------------------------------
_if_fb_hi_go macro file,bit,label
pagesel label
banksel file
btfsc file,bit
goto label
endm
;-------------IF FILE REGISTER BIT LOW GOTO LABEL----------
;Si el BIT del FILE REGISTER se encuentra en BAJO GOTO label
;-----------------------------------------------------------
_if_fb_lo_go macro file,bit,label
pagesel label
banksel file
btfss file,bit
goto label
endm
Hola t-edson, acabo de codificar con éxito interrupciones usando un procedimiento al inicio del código Pascal y utilizando la instrucción org $0004 en ASM posición a la que como sabrás salta del contador de programa del PIC cuando se produce cualquier interrupción. El siguiente código funciona perfectamente: https://www.facebook.com/groups/electronicaymicrocontroladores/permalink/1679098122118937/
https://pastebin.com/PZqznLZB
pero si en algún lugar del programa utilizo la función del sistema delay_ms() su código sobrescribe cualquier otro código que usando la instrucción org se haya escrito al inicio del programa. Además, si por cualquier motivo usando la instrucción org deseamos que el programa se ejecute a partir de la dirección $0500, por ejemplo, porque se trate de un subprograma al que llamará algún tipo de firmware que nada tiene que ver con PicPas, si se usa delay_ms() el código siempre se incrusta a partir de la dirección $0002 por lo que no se puede utilizar en la práctica.
La solución creo que es muy sencilla, solo habría que colocar el código de delay_ms() o de cualquier otra función del sistema al final del código generado y no al principio y en una posición fija.
Por otro lado, a la vista del lo bien que parece funcionar la prueba que he realizado con las interrupciones y por lo fácil que me parece que resultaría implementarla simplemente usando un nombre de procedimiento reservado llamado por ejemplo _ISR_
, creo que se podría incluir en la siguiente versión de PicPas. Simplemente hay que reservar ese u otro nombre para la interrupciones, el compilador añadir el código ASM al principio y a la salida del procedimiento, y compilarlo siempre ya que no existirá ninguna llamada en el programa. Yo he utilizado un truco para que la compilara, pero no creo que hiciera falta :)
//***********************************************************************
// PROCEDIMIENTO: _ISR_
// I.S.R. : Interrupt Service Routine (Rutina de Servicio a la Interrupcion)
// Cualquier interrupcion producida en el uC 16F84A salta a la
// direccion $0004, a partir de la que código de programa debe decidir
// que hacer.
//***********************************************************************
procedure _ISR_; //
var
Reg_W, Reg_STATUS : byte; // Para guardar valores previos a interrupcion y restablecerlos antes de salir.
begin
ASM
;------------------------------------------------------------------------------------
; Posiciona la primera instruccion de interrupcion en la direccion $0004.
;------------------------------------------------------------------------------------
org $0004
;------------------------------------------------------------------------------------
; Inicio de instrucciones que se ejecutan cuando se produce una interrupcion.
;------------------------------------------------------------------------------------
MOVWF Reg_W ; Guarda en registro W en Reg_W.
SWAPF STATUS,w ; Invierte los nibbles del registro de estado (STATUS) y lo guarda en W.
; Se usa SWAPF en lugar de MOVF porque no afecta al flag Z del registro STATUS.
; Es la tecnica recomendada por Microchip para salvaguardar los valores previos
; a la interrupcion.
MOVWF Reg_STATUS ; Guarda el contenido de W en Reg_STATUS.
;------------------------------------------------------------------------------------
END
// INTERRUPCION TIMER TMR0 --------------------------------------------------------
if (INTCON_T0IF = 1) then // Comprueba si la interrupcion la ha producido el desbordamiento del TMR0.
TMR0 := IniTMR0; // Valor inicial de TMR0 para nueva cuenta.
INTCON_T0IF := 0; // Restablece el valor del flag de deteccion de interrupcion TMR0.
Inc(ContadorInTMR0); // Incrementa contador de interrupciones
if (ContadorInTMR0 = 4) then // 4*(256-12)/(1e6/4/256) = 0,999424 segundos.
LED_1 := NOT LED_1; // LED_1 invierte su valor.
LED_2 := NOT LED_2; // LED_2 invierte su valor.
ContadorInTMR0 := 0; // Se inicializa el contador de interrupciones.
end;
end;
// --------------------------------------------------------------------------------
ASM
;------------------------------------------------------------------------------------
; Fin de interrupcion y reposicion de los valores previos de W y STATUS.
;------------------------------------------------------------------------------------
SWAPF Reg_STATUS,w ; Invertimos los nibbles para dejar en su posicion correcta el registro STATUS.
MOVWF STATUS ; Restauramos el valor de STATUS previo a la interrupcion.
SWAPF Reg_W,f ; Invertimos los nibbles de Reg_W y lo guardamos en la misma posicion de memoria.
SWAPF Reg_W,w ; Volvemos a invertor los nibbles de Reg_W y lo guardamos en el registro W, con
; lo que queda con el valor que tenia antes de la interrupcion.
; Se usa SWAPF en lugar de MOVF porque no afecta al flag Z del registro STATUS.
; Es la tecnica recomendada por Microchip para salvaguardar los valores previos
; a la interrupcion.
RETFIE ; Retorna de la interrupcion.
;------------------------------------------------------------------------------------
END
end;
El código de aplicación completo : https://pastebin.com/PZqznLZB
Un video de la simulación en Proteus: https://www.facebook.com/groups/electronicaymicrocontroladores/permalink/1679098122118937/
Nuevas librerías:
PIC16F84A.pas : https://pastebin.com/i3PMcNGs
PIC16F877A.pas : https://pastebin.com/4eRdCPzA
En esta prueba realizado con la versión 0.6.8 he conseguido escribir la EEPROM interna del microcontrolador PIC16F84A. En el siguiente código podemos ver los procedimientos empleados, ambos son equivalentes, pero uno está escrito en código ensamblador y el otro en Pascal.
// Prueba de esctritura en la EEPROM interna del PIC16F84A
{$FREQUENCY 8 MHZ }
{$PROCESSOR PIC16F84A}
program EEPROMInterna;
uses
PIC16F84A;
var
EECON1 :byte absolute $08; // FALLA ENSAMBLADOR SI SE DEJA $88.
EECON2 :byte absolute $09; // FALLA ENSAMBLADOR SI SE DEJA $89.
Contador :byte;
procedure WriteEEPROMASM(direccion , valor: byte);
begin
ASM
ESCRITURA: ; Establecer EEADR y EEDATA
MOVF direccion,w ; Direccion de esctritura
MOVWF EEADR ; Escribe la dirección en EEADR
MOVF valor,w ; Dato a escribir en EEPROM
MOVWF EEDATA ; Se escribe el dato en EEDATA
BSF STATUS,STATUS_RP0 ; (RP0) Selecciona el banco 1
BSF EECON1,EECON1_WREN ; (WREN) Permiso de escritura activado
;Comienzo de la secuencia de escritura
MOVLW $55
MOVWF EECON2 ; Se escribe el dato 55 h en EECON2
MOVLW $AA
MOVWF EECON2 ; Se escribe AA h en EECON2
BSF EECON1,EECON1_WR ; (WR)Comienza la escritura
BCF EECON1,EECON1_WREN ; (WREN) Permiso de escritura desactivado
ESPERA:
BTFSC EECON1,EECON1_WR ; (WR) Espera a que termine la escritura
GOTO ESPERA
BCF STATUS,STATUS_RP0 ; (RP0) Selecciona el banco 0
END
end;
procedure WriteEEPROM(direccion , valor: byte);
//var
// WREN : bit absolute EECON1.EECON1_WREN; // FALLA. No reconoce constantes.
// WR : bit absolute EECON1.EECON1_WR; // FALLA. No reconoce constantes.
begin
EEADR := direccion;
EEDATA := valor;
ASM
BSF STATUS,5
END
EECON1.2 := 1; // EECON1,EECON1_WREN := 1 // FALLA. No reconoce constantes.
EECON2 := $55;
EECON2 := $AA;
EECON1.1 := 1; // EECON1.EECON1_WR :=1 // FALLA. No reconoce constantes.
EECON1.2 := 0;
repeat until (EECON1.1 = 0);
ASM
BCF STATUS,5
END
end;
begin
repeat
for contador:=$00 to $10 do
WriteEEPROMASM(contador,$00);
end;
for contador:=$00 to $10 do
WriteEEPROM(contador,$FF);
end;
until false;
end.
Aunque ambos procedimiento graban la EEPROM perfectamente, ha sido necesario hacer ciertas correcciones para que funcione que no deberían haber sido necesarias. Estas correcciones evitar fallos del compilador y permiten generar un código que funciona correctamente.
Los fallos detectados son:
once choose the set-theme-template, like "Azulado" (2nd list-item) and choose apply, than ok it will change the theme - fine.
open once again settings-dialog, you see set-theme-template-combobox-item as "None", instead previous choosed "Azulado"
okay, not major-critical-bug, ...only nice cosmetica for the eyes ... :)
first few of your ide seems to be your very good job
question: why no CASE-construct in your language? it could help to avoid irritating if-then-if-then-if....
Hello,
I am encountering compiler issues with numeric constants, for instance:
const BASE_DELAY = 100; // => compiles ok [byte]
const BASE_DELAY = 300; // => compiles ok [word]
const BASE_DELAY = 100;
const EXTENDED_DELAY = BASE_DELAY * 3; // => compiles ok
const BASE_DELAY = 300;
const EXTENDED_DELAY = BASE_DELAY * 3;
// => COMPILER ERROR: Undefined operator: * for type: word
const BASE_DELAY = 300;
const EXTENDED_DELAY = 3 * BASE_DELAY;
// => COMPILER ERROR: Illegal Operation: (byte) * (word)
So it seems there is an issue with the handling of mixed byte and words sizes.
var
contador:dword=0;
error
Parece de la directiva DEFINE tiene problemas cuando se relaciona con uses:
No compila:
// AQUI SE DEFINE LA FUNCION USADA PARA IMPRIMIR LOS NUMEROS EN UN DISPOSITIVO DE SALIDA.
{$DEFINE SALIDA_LCD}
{$DEFINE FUNCION_PRINT_DIGITO=LCD_WriteChar} // Libreria LCDLib_4bits
{$DEFINE LIBRERIA_PRINT_DIGITO=LCDLib_4bits}
//{$DEFINE SALIDA_UARTSOFT}
//{$DEFINE FUNCION_PRINT_DIGITO=UARTSoft_SendChar} // Libreria UARTSoftLib_8MHz_1200bps
//{$DEFINE LIBRERIA_PRINT_DIGITO=UARTSoftLib_8MHz_1200bps}
uses PIC16F877A, Math, {$LIBRERIA_PRINT_DIGITO};
Da error en línea de 2º uses.
Esto tampoco compila:
// AQUI SE DEFINE LA FUNCION USADA PARA IMPRIMIR LOS NUMEROS EN UN DISPOSITIVO DE SALIDA.
{$DEFINE SALIDA_LCD}
{$DEFINE FUNCION_PRINT_DIGITO=LCD_WriteChar} // Libreria LCDLib_4bits
//{$DEFINE SALIDA_UARTSOFT}
//{$DEFINE FUNCION_PRINT_DIGITO=UARTSoft_SendChar} // Libreria UARTSoftLib_8MHz_1200bps
{$IFDEF SALIDA_LCD}
uses PIC16F877A, Math, LCDLib_4bits;
{$ENDIF}
{$DEFINE SALIDA_UARTSOFT}
uses PIC16F877A, Math, UARTSoftLib_8MHz_1200bps;
{$ENDIF}
En linea uses, mensaje: Error Indentificador esparado.
I do not know if it is some error of mine, but in pic 12f675 it shows 128B of maximum ram, that value is that of ram eprom is 64 and in 16f877A it shows 416 in datasheet 368
may not be anything, but I'm reporting to improve the app
I found some settings in pic16Devices.pas but I did not succeed in fixing
En el siguiente código de prueba:
{$IF LCD_BUS_DATA_BITS = 8} // Si Modo bus de datos 8 BITS.
{$DEFINE LCD_PORT_DATA_8BIT = PORTB} // Puerto de bus de datos de 8 BITS.
{$MSGBOX 'MICROCONTROLADOR: ' + PIC_MODEL}
{$MSGBOX 'BUS DE DATOS DE ' + LCD_BUS_DATA_BITS + ' BITS'}
{$MSGBOX 'PUERTO USADO: ' + LCD_PORT_DATA_8BIT}
{$ENDIF}
Los dos primeras MSGBOX funcionan perfectamente, pero el tercero muestra el mensaje de error:
Identificador desconocido: PORTB
y detiene la compilación.
Aclarar que si elimino la linea del error y la compilación se completa, LCD_PORT_DATA_8BIT (= PORTB) es perfectamente aceptado en la librería donde lo usa y compila hasta el final sin problemas.
in the datasheet the address is correct
Hello all,
I just discovered your project and find it very interesting.
I would be happy to contribute, I think I could be helpful for:
Besides, I have one question, a friend of mine is using Linux. What's the most recent version he can use ? Any plan to release up to date binaries for that platform ?
Thanks!
Cuando se intenta traspasar un valor menor de 255 a un procedimiento con una variable de entrada tipo word el compilador comunica un error de tipo. Ejemplo:
procedure delay_us(microsegundos: word);
begin
// cuerpo de procedimiento.
end;
begin
delay_us(100);
end.
El compilador advierte de error "Type paremeters error" y no compila.
Si en lugar de 100 se pone 256 compila perfectamente. Por lo tanto, no admite traspaso de variables tipo word menores de 256 en la versión 0.6.4.
Hi.
Do you have plan to maintain 877A support? I've looked at Microchip's news and got the following (bad) news:
PIC16F877A
Not Recommended for new designs
Please consider this device PIC16F18877
More...
However, the 18877 models are very recent, expensive, and hard to be found in common sites (aliexpress, ebay etc.).
Thank you!
Hi again. You could make the PicPas on ATsynedit, and then make better lexer for pascal for pic (it is easy to make lexer, no code)
function adc_read(adc_chan:byte):word;
begin
end;
error : ":" or ", " expected.
Un pequeño detalle, probando el compilador este este código:
{
Prueba de Directivas de compilador.
PicPas 0.7.6
}
{$PROCESSOR PIC16F877A}
{$FREQUENCY 16MHz}
{$SET CICLO_MAQUINA = 4*1000000/PIC_FREQUEN}
{$MSGBOX 'CICLO MAQUINA = ' + CICLO_MAQUINA + ' us'}
{$SET dato1 = 100}
{$SET dato2 = 7}
{$SET RESULTADO = (DATO1\DATO2)}
{$MSGBOX 'RESULTADO: ' + RESULTADO}
program nombre;
var
dato_bank0 : word absolute $020; // Se localiza la variable en el Bank 0
dato_bank1 : word absolute $0A0; // Se localiza la variable en el Bank 1
dato_bank2 : word absolute $120; // Se localiza la variable en el Bank 2
dato_bank3 : word absolute $1A0; // Se localiza la variable en el Bank 3
begin
{$MSGBOX 'BANCO DE MEMORIA ACTUAL = ' + CURRBANK}
dato_bank0 := word({$RESULTADO});
{$MSGBOX 'BANCO DE MEMORIA ACTUAL = ' + CURRBANK}
dato_bank1 := word({$RESULTADO});
{$MSGBOX 'BANCO DE MEMORIA ACTUAL = ' + CURRBANK}
dato_bank2 := word({$RESULTADO});
{$MSGBOX 'BANCO DE MEMORIA ACTUAL = ' + CURRBANK}
dato_bank3 := word({$RESULTADO});
{$MSGBOX 'BANCO DE MEMORIA ACTUAL = ' + CURRBANK}
end.
Primero darte la enhorabuena por el control actual sobre los bancos de memoria RAM donde se sitúan las variables.
Y el detalle de los decimales basura se da cuando la velocidad de reloj es, por ejemplo, 12 MHz. En lugar de obtener en la ventana de mensajes el dato 0,333333333333333333, a partir del decimal 9 no es correcto, y si pones 10 MHz se debería obtener 0,4 los "decimales basura" estropean el resultado a partir nuevamente el noveno decimal.
Ya se que no es algo significativo, pero estaba probando otros que funcionan perfectamente, y este detalle estético creo que también hay que cuidarlo. :)
Hello again,
As I said earlier, I would be happy to add support for other PIC models.
I noticed that many newer PIC actually have 2 config words, CONFIG1 and CONFIG2, located at address 0x8007 and 0x8008 (see for instance the datasheet of PICS 16F1825/16F1829).
I believe it is not currently supported.
How easy would it be to make PicPas handle 2 config words ?
In the mean time, I could add support for the PICs that still use a single config word.
Do you have a list of favorite models that you would like to see supported in priority ?
PicPas tiene un problema con el uso de memoria RAM cuando se amplean muchas variables globales. De hecho en este momento es más interesante usar variables globales para enviar datos a las funciones.
Creo que solucionar este problema de manera general no será sencillo, o habrá que solucionarlo usando variables auxiliares reutilizables, pero creo que sería sencillo que si distintas funciones usan un mismo nombre de variables de entrada y del mismo tipo, las pudieran reutilizar.
Por ejemplo, tengo estas cinco funciones:
Print_Digito (numero : byte);
procedure Print_Numero_8bit(numero : byte);
procedure Print_Numero_16bit(dato : char);
procedure Print_Numero_32bit(dato : char);
procedure Print_Numero_64bit(dato : char);
Se compila:
numero EQU 0x038
numero EQU 0x039
dato EQU 0x03A
dato EQU 0x03B
dato EQU 0x03C
Ya que hay variables locales que se llaman igual y son del mismo tipo, tal vez resultara sencillo que PicPas lo compilara como:
numero EQU 0x038
dato EQU 0x039
Aunque el problema vendría en caso de llamadas entre funciones compartan algún nombre de variable de entrada que sea también del mismo tipo. En ese caso si que sería necesario crear alguna variable auxiliar antes de llamadas entre esas funciones (o de momento, advertir claramente en la documentación de PicPas que dos funciones que se llamen entre si, no pueden tener los mismos nombres de variables locales de entrada, o que el propio compilador lo detecte, advierta y avise de error).
Cuando se empiezan ha hacer librerías un poco complicadas, las variables locales se comen literalmente la memoria RAM del microcontrolador, por lo que hay que acabar usando el método del lenguaje ensamblador de crear variables de intercambio globales y llamar a las funciones como si fueran procedimientos.
you have an error "for" loop and "while TXSTA_TXEN = 0 do end; " . Those are very important. I want to inform you, if you are interest. Good luck. You will see when you have to try this command row for test.
I'm using the code below to test it.
program NewProgram;
{$PROCESSOR PIC16F84A}
{$FREQUENCY 4MHZ}
uses PIC16F84A;
//Declarations here
begin
SetAsInput(PORTA_RA0);
TRISB:=$FF;
end.
===========asm part============
TRISA EQU 0x000;
TRISB EQU 0x086
direccion EQU 0x000;
valor EQU 0x000;
addr EQU 0x000;
;------ Work and Aux. Registers ------
;===Blocks of Code===
0x000 goto 0x001
main_program:
0x001 bsf STATUS, 5 ;Bank set.
0x002 bsf PORTA_RA0
0x003 movlw 0xFF
0x004 movwf PORTB
end_program:
0x005 sleep
;--------------------
END�
Para hacer librerías genéricas para PicPas, nos encontramos con la dificultada de que es no es posible definir parámetros o variables en la librería que se deban declarar en el programa que la vaya a usar.
Es un problema importante, ya que por ejemplo, para poder usar una librería es necesario definir en la propia librería el microcontrolador y cargar su librería de registro SFR (o escribir en el propio programa la posición de memoria de cada registro SFR que utilice). Así es muy complicado hacer una librería genérica. Tampoco hereda o reconoce directivas DEFINE del programa principal. Todo ello imposibilita la realización práctica de librerías genéricas, tan solo se pueden hacer para un o unos determinados microcontroladores y siempre que coincidan las posiciones de los registros SFR, pero tampoco es correcto ya que el dato de memoria RAM y Flash de un micro a otro también varía, por lo que en la práctica casi sería necesario hacer una versión diferente de cada librería para cada microcontrolador PIC soportado.
En un principio, con que pudiera heredar los uses y define del programa que usa la librería sería suficiente, o al menos definir algún tipo de identificador tipo EXTERNAL para variables y constantes.
Hi,
I made some big changes about internationalization。
Removed the original multilingual translation section。
Can you give me your email address?In this way, I can email you。
for my bad english
Hello,
I am using lazarus v1.8.2 and try to compile the source code,
there are some missing units such as SynFacilUtils,MisUtils
please how to compile the source code?
thanks.
Hay un error en la codificación de sumas cuando los dos operadores son variables.
Variables de tipo byte:
;bcd = bcd + decimal;
0x02A movf decimal,w
0x02B addwf bcd,w
0x02C subwf bcd,w <--------- ¿que hace aquí esta resta?
Y cuando las variables son tipo word:
;bcd = bcd + decimal;
0x06F movf bcd@1,w
0x070 addwf decimal@1,w
0x071 movwf _H
0x072 movf bcd@0,w
0x073 addwf decimal@0,w
0x074 btfsc STATUS, 0
0x075 incf _H,f
0x076 movwf aux4 <----- a partir de aquí ¿?
0x077 movf bcd@1,w
0x078 subwf _H,w
0x079 btfss STATUS, 2
0x07A goto 0x07D
0x07B movf bcd@0,w
0x07C subwf aux4,w
Son fragmentos de compilar estas dos funciones en una librería:
//***********************************************************************
// FUNCION: DecToBCD
// Devuelve el valor de entrada decimal en formato BCD de 2 digitos.
//***********************************************************************
procedure DecToBCD_2bytes(decimal : byte) : byte;
var
bcd : byte;
begin
if decimal>99 then exit($EE) end; // Indica ERROR en valor decimal de entrada.
bcd := 0;
while decimal > 9 do
bcd := bcd + 16;
decimal := decimal - 10;
end;
bcd = bcd + decimal;
exit(bcd);
end;
//***********************************************************************
// FUNCION: DecToBCD
// Devuelve el valor de entrada decimal en formato BCD de 4 digitos.
//***********************************************************************
procedure DecToBCD_4bytes(decimal : word) : word;
var
bcd : word;
begin
if ((decimal.high>99)
OR ((decimal.high=99) AND (decimal.low>99)))
then exit($EEEE) end; // Indica ERROR en valor decimal de entrada.
bcd := 0;
while ((decimal.high>0) OR (decimal.low > 9)) do
bcd := bcd + word(16);
decimal := decimal - word(10);
end;
bcd = bcd + decimal;
exit(bcd);
end;
Por cierto, el operador += parece no estar implementado todavía aunque en el manual se diga que ya lo esta, o eso es lo que me pareció entender.
bcd += decimal;
Produce un error: Undefined operator: += for type: byte
I checked the documentation and the source code and found no reference to the internal oscillator of 12f675 {$ CONFIG}
{$CONFIG _CP_ON,_CPD_ON, _WDT_OFF, _WRT_OFF, _DEBUG_OFF, _LVP_OFF, _BOREN_OFF, _PWRTEN_OFF, INTOSC_NOCLKOUT }
I intend to make an improvement in the libraries by putting error messages if something is set wrong
example if pin3 = output then {$ MSGBOX 'error config pin3'}
so a pin that can only be used with input if it is used as output (this in the user's design unit) error appears when compiling ...
I do not know, it's possible or it's viable.
Hello,
I should now be able to work on the french translation.
Can you describe me the procedure to follow ?
(I saw the "language" folder, but I'm not sure how to proceed)
Thanks,
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.