Git Product home page Git Product logo

picpas's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

picpas's Issues

Definir variables numéricas tipo word como absolute o implementar Low(word) y High(word)

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.

suggestion of folder structure

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 ...

Don't know if this is an issue...or me missing something.

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?

Error example LCD_Test.pas

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?

Missing some SET_STATE_RAM

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.

suggestion of implementing new macros

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

Instruccion org y delay_ms() / posible implementación de procedimiento especial para tratar interrupciones

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

Varios fallos al crear procedimientos escritura de EEPROM interna

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:

  • Ha sido necesario redefinir las variables EECON1 y EECON2 en direcciones del banco 0. Si se dejan las originales del banco 1 el código escrito en ensamblador falla.
  • En el procedimiento escrito en Pascal al intentar asignar un valor a los registros EECON1 y EECON2 (definidas en su direcciones originales, dejando en forma de comentarios los cambios del encabezamiento que las coloca en el banco 0), no se hace el cambio automático al banco 1 del SFR como lo hace cuando asignamos otros registros como los TRISs.
  • En el código Pascal no se reconocen las constantes definidas para asignar bits de los registros. En ensamblador funciona perfectamente BSF EECON1,EECON1_WREN, pero en Pascal EECON1,EECON1_WREN := 1; da error y tampoco se permite la definición de variable como bit del tipo WREN : bit absolute EECON1.EECON1_WREN;

Settings-Dialog

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....

Compiler issue with numeric constants

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.

Directiva DEFINE en uses

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.

error maximum number of RAM

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

Error al intentar mostrar variable de texto asignada con DEFINE en mensajes de directiva MSGBOX

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.

Need help ?

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:

  • Mac target binaries
  • French translation (and English)
  • Support for new PICs

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!

Error en traspaso de parámetros tipo word a procedimientos

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.

[QUESTION] 877A support

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!

Synedit

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)

Decimales basura en cálculos con datos de variables de directiva SET

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. :)

Support for new PICs

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 ?

Reutilización de variables locales (al menos si tienen el mismo nombre)

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.

error apparent function SetAsInput and SetAsoutput no TRISA action

I'm using the code below to test it.

  1. TRISA is not changed in the assembler
  2. trisB manually in asm it appears as PORTB, in the simulator the TRISB is triggered (in trisB it should be only the name of the variable)

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�

Herencia de parámetros del programa principal en el uso de Librerías

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.

I made some big changes about internationalization

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

source code compile

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.

Error grave en operación de suma de variables de tipo byte y word.

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

internal oscillator and config value for 12f675

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 }

improvement in libs

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.

French translation

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,

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.