GPSIM

Tutorial gpsim
-->
gpsim




$Data: Documento original 2006-11-09 08:27:47 $
$Data: Tradução e complemento 27/08/20012 01:11:25 $
 
 Linux: para quem não tem medo do novo...
 
 
-->
Introdução



Modificado a configuração para remover a dependência
libgtk + extra-x11-3.0-0. Como resultado, não existe mais interface gui

para o gpsim. No entanto, as bibliotecas caracterizado por esta compilação são
suficiente para Ktechlab, que fornece uma interface gráfica.

 
-->
1.2 Executando



O criado executável  anteriormente é chamado de: gpsim. As opções de linha de comando podem ser especificadas quando gpsim é invocado.



Gpsim [-?] [-p <device> [<hex_file>]] [-c <stc_file>]

-p, --processor=<processor name> processador (por exemplo-pp16c84 para o "c84

-c, --command=STRING arquivo de inicialização de comandos .sct

-s Arquivo.cod

-L, – lista separada por dois pontos de diretórios t pesquisar

-v, --version

-i, --cli modo só linha de comando

-d, --icd=STRING use a CID (por exemplo,-d / dev/ttyS0).

Help options:

-?, --help Mostrar esta mensagem de ajuda

--usage Mostrar mensagem de uso breve



Invocando gpsim:

/diretório_do_arquivo gpsim -s arquivo.cod



O gpsim irá abrir o arquivo.cod e executar seu conteúdo.

-->
Outro exemplo:

/diretório_do_arquivo gpsim -p pic16f628 -s arquivo.cod -c arquivo.sct


O gpsim carrega o PIC16f628 abre o arquivo.cod e inicializa o arquivo de comandos.sct(se vc já o tiver editado)

-->
Capitulo 2



Interface de linha de Comandos



A interface de linha de comando é bastante simples. A tabela abaixo resume o comandos disponíveis Breves descrições destes comandos também podem ser exibidas digitando help na linha de comando.



Attack – anexar estimulos para os nós

break - definir um ponto de ruptura ou parada

bus - adicionar ou exibir nó de barramento

clear - remover um ponto de ruptura

disassembly - desmonte cpu atual

dump - mostrar ou memória ram ou eeprom

frequency -definir frequencia do processador

help -ajuda

icd - In Circuit Debugger apoio.

List -Exibir arquivos de origem e lista

load - Carregar ou um arquivo hexadecimal ou comando

log - Entrar / gravar eventos em um arquivo

node - Adicionar ou exibir os nós de estímulo

module - Selecionar e exibir módulos

processor - Adicionar processadores / lista

quit -Saia gpsim

reset - Redefinir a totalidade ou parte da simulação

run - Execute o programa pic

set -exibir e controlar flags comportamento gpsim

step - Executar um ou mais instruções

stimulus -Criar um estímulo

stopwatch -Medida de tempo entre eventos

symbol - Adicione símbolos / lista

trace -Esvazie a histórico de rastreamento

version - Exibe a versão de gpsim

x - (obsoleto) examinar e / ou modificar memória


-->

Invocando gpsim:
/diretório_do_arquivo gpsim -s arquivo.cod

O gpsim irá abrir o arquivo.cod e executar seu conteúdo.

Outro exemplo:
/diretório_do_arquivo gpsim -p pic16f628 -s arquivo.cod -c arquivo.sct
O gpsim carrega o PIC16f628 abre o arquivo.cod e inicializa o arquivo de comandos.sct


Exemplo do como usar o gpsim



Este é um exemplo de um circuito simulando gpsim, é a verificação do funcionamento dos comparadores em um PIC16F877A.



Modulo Led

Gpsim-led é um módulo de LED de 7 segmentos para gpsim, que consiste em uma biblioteca compartilhada que é carregada dinamicamente. Exemplos Como usar o módulo estão incluídos.

-->
Este é um resumo do circuito em gpsim dos primeiros passos para os iniciantes.

No meu caso não abriu o GUI que, é a janela de visualização do gpsim, tentei várias versões e inumeras vezes e nada. Enfim estou usando o Gpsim versão 0.24.0 original de minha instalação como recomendado.

Gpsim tem uma interface gráfica muito básica e não pode desenhar circuitos diretamente no modo gráfico, a príncipio é um pouco díficil, mas é o que temos ... alguém com conhecimento de C + + poderia se sentir incentivados a melhorar isso??



Para exemplificar estou usando um código fonte de modelo para este tutorial: Led1.asm

-->
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* PROJETO: Acionando Led *
;* *
;* DESENVOLVIDO: HENRY MARCONDES *
;* VERSAO: 1.0 DATA: 01/02/12 *
;* *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;* DESCRICAO DO ARQUIVO *
;*-----------------------------------------------------------------*
;* Este projeto foi desenvolvido para testar o gpsim *
;===================================================================
;* 1-1 ARQUIVOS DE DEFINICOES *
;-------------------------------------------------------------------
#INCLUDE <p16f873a.inc>
__CONFIG _CP_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;===================================================================
;* Descricao das Definicoes para PIC16f877A *
;------------------------------------------------------------------
;*CP_OFF -> Codigo de Protecao desligado *
;*CPD_OFF -> Memoria EEPROM desprotegida contra leitura *
;*BODEN_OFF -> Sistema de baixa tensao DESLIGADO *
;*PWRTE_ON -> Ativa Power Up Timer *
;*WDT_OFF -> Watchdog desligado *
;*LVP_OFF -> Sistema de programacao de baixa tensao desligado *
;*RS_OSC -> Oscilador CRISTAL p/ frequencia 4MHz *
;*DEBUG_OFF -> In circuit Debug desabilitado pino RB6 e RB7 -> I/O *
;===================================================================
;* 1-2 PAGINACAO DE MEMORIA *
;-------------------------------------------------------------------
;DEFINICAO DE COMANDOS DE USUARIO PARA ALTERACAO D0 BANCO DE MEMORIA
#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMORIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MEMORIA
;===================================================================
;* 1-3 VARIAVEIS *
;-------------------------------------------------------------------
; DEFINICAO DOS NOMES E ENDERECOS DE TODAS AS VARIAVEIS UTILIZADAS *
   CBLOCK 0x20 ;ENDERECO INICIAL DA MEMORIA DE
     TEMPO0 ;variavel da rotina DELAY_MS
     TEMPO1 ;variavel da rotina DELAY_MS
     FLAG ;Flag Auxiliar para sistema
     STATUS_TEMP
     W_TEMP
   ENDC
;===================================================================
;* 1-7 ENTRADAS E SAIDAS *
;-------------------------------------------------------------------
#DEFINE LED PORTB,1
#DEFINE BT1 PORTB,0
;===================================================================
;* 1-8 VETOR DE RESET *
;-------------------------------------------------------------------
  ORG 0x00 ;ENDERECO INICIAL DE PROCESSAMENTO
   GOTO CONFIGURA
;===================================================================
;* 1-9 INICIO DA INTERRUPCAO *
;* Salvar os Valores de W e Status para recuperar no fim da rotina *
;-------------------------------------------------------------------
  ORG 0x04 ;ENDERECO INICIAL DA INTERRUPCAO
   MOVWF W_TEMP ;COPIA W P/ W_TEMP
   SWAPF STATUS,W ;INVERTE STATUS E COLOCA EM W
   MOVWF STATUS_TEMP ;COPIA W P/STATUS_TEMP
;===================================================================
;* ROTINA DE SAIDA DA INTERRUPCAO *
;* Recuperar os valores de W e STATUS e resetar o flag da interrup *
;-------------------------------------------------------------------
SAI_INT
  SWAPF STATUS_TEMP,W ;INVERTE STATUSE COLOCA EM W
  MOVWF STATUS ; MOVW W PARA STATUS
  SWAPF W_TEMP,F ;INVERTE W_TEMP E COLOCA EM F
  SWAPF W_TEMP,W ;MOVE W_TEMP PARA W
  RETFIE
;===================================================================
;* 1-11 ROTINA DELAY (1mS ATE 256mS) *
;-------------------------------------------------------------------
DELAY_MS
  MOVWF TEMPO1
  MOVLW .250
  MOVWF TEMPO0
  DECFSZ TEMPO0,F
  GOTO $-1
  DECFSZ TEMPO1,F
  GOTO $-5
  RETURN
;===================================================================
;* 1-14 INICIO DO PROGRAMA *
;-------------------------------------------------------------------
CONFIGURA
  CLRF PORTA
  CLRF PORTB
  CLRF PORTC
  BANK1
  MOVLW B'00000000'
  MOVWF TRISA
  MOVLW B'00000010'
  MOVWF TRISB
  MOVLW B'00000000'
  MOVWF TRISC
  MOVLW B'11011011'
  MOVWF OPTION_REG ;PUL-UPs desabilitados
                   ;int na borda de subida para RB0
                   ;TIMER0 incr pla maquina
                   ;WDT - 1:8 TIMER - 1-1
  MOVLW B'00000000'
  MOVWF INTCON
  BANK0
  BSF LED ;LIGA LED
  GOTO MAIN
;===================================================================
;* 1-19 ROTINA PRINCIPAL *
;-------------------------------------------------------------------
; A rotina de LIGA e DESLIGA o LED sempre que o BT1 estiver *
;pressionado *
;------------------------------------------------------------------*
MAIN
  BTFSC BT1 ;TESTA se BT1=0
  GOTO MAIN ;NAO
  BTFSC LED ;TESTA se LED=0
  GOTO DESLIGA ;NAO, entao desliga o LED
  GOTO LIGA ;SIM, entao liga o LED
DESLIGA
  BCF LED
  MOVLW 0XFF
  CALL DELAY_MS
  GOTO MAIN
LIGA
  BSF LED
  MOVLW 0XFF
  CALL DELAY_MS
  GOTO MAIN
;------------------------------------------------------------------*
; FIM DO PROGRAMA *
;------------------------------------------------------------------*
END

-->
Primeiramente abrir um terminal shell (Konsole) e carregar um archivo.cod. Ou Cof, este arquivo é gerado quando você compila (constrói) seu projeto no gputils pode ser feito no mesmo terminal( gpasm -s nomedoArquivo.asm), ou Piklab ou onde você sempre tem feito.



/Modelo$ gpasm -p p16f873a Led1.asm -w 2

Se tudo estiver correto o arquivo .cod será gerado no diretório (no meu caso dir Modelo).



Abrindo o gpsim: não esqueça que você tem que estar no diretótio onde se encontra o 'arquivo .cod'

/diretório do arquivo gpsim -s arquivo.cod
Você deverá visualizar algo do parecido com o descrito abaixo:

gpsim – the GNUPIC

version: Release 0.24.0



type help for help

**gpsim> Disabling WDT

**gpsim>



Para ir se familiarizando com os comandos vamos a algumas instruções no gpsim:

Vamos definir o processador, no meu caso PIC16F873A



**gpsim> processor list



Confira se o processador que você está usando consta na lista de processadores suportados pelo gpsim.



**gpsim> processor



Irá mostrar o processador que esta definido no arquivo.cod caso sejá difernte ou caso vc queira mudar o processador EX :



**gpsim> processor pic16f877a

OBS: Não esqueça de retornar ao processador original caso faça este teste para evitar erros futuros.



Agora vamos conferir os pinos do processador :





**gpsim> processor pins

+--+----------\/----------+--+

L | 1| portb7 |28| L

L | 2| porta0 portb6 |27| L

L | 3| porta1 portb5 |26| L

L | 4| porta2 portb4 |25| L

L | 5| porta3 portb3 |24| L

L | 6| porta4 portb2 |23| L

L | 7| porta5 portb1 |22| L

L | 8|              portb0 |21| L

L | 9|                          |20| L

L |10|                          |19| L

L |11| portc0 portc7 |18| L

L |12| portc1 portc6 |17| L

L |13| portc2 portc5 |16| L

L |14| portc3 portc4 |15| L

+--+---------------------+--+





Verificando a frequência do oscilador, como visto anteriormente o padrão do gpsim é 20MHz. Basta então entrar com o comando:



**gpsim> frequency

Clock frequency: 20MHz



**gpsim>frequency 4000000.000000000



**gpsim> frequency

Clock frequency: 4MHz



É possivel iniciar diretamente a simulação do arquivo.cod , pórem provavelmente o circuito não terá o resultado esperado devido as variáveis ou condição das entradas e saídas nos PORTS, que são definidos pelos hardware acoplados ao PIC,(Leds, chaves, circuitos, etc...) ou seja os módulos, na linguagem do gpsim.


O procedimento para criar o circuito no gpsim começa por carregar uma biblioteca de módulos, para efetuarmos os 'nós' (ligações) , a "Biblioteca Add" que é meio escondida, é carregado através do bloco libgpsim_modules.so, só então nós podemos escolher os componetes e "Adicionar módulo", dar-lhe um nome e definir os valores. Maiores detalhes ver tópico 2.13 

Note que apesar de parecer um simples simulador o gpsim é muito poderoso e rico em informações de depuração, o pouco que trabalhei com MPLAB não consegui chegar ao nivel de simulação com drivers acoplados aos pinos do gpsim.


Módulos

Abrindo a bliblioteca de módulos disponiveis no gpsim:



**gpsim> module lib libgpsim_modules



Verificando os módulos disponiveis:

A cada versão do gpsim esses modulos podem variar um pouco, e como eu disse anteriormente, (é usar o que temos disponível no momento),


**gpsim> module list


Agora começa a parte que exige mais atenção, você precisa para criar os"nós", ... pinos, nomes... os componentes não se conectam diretamente uns aos outros, mas estão ligados a nós, para ligar duas coisas, primeiro crie um nó e, em seguida, conectar tudo ao nó.




Este arquivo foi escrito para gpsim.
Você pode usar o arquivo arquivo abaixo, como modelo ou referência, carregar o mesmo ou entrar com os dados “á unha....” .


gpsim-s mycode.cod-c netlist.stc

Se você quiser adicionar comandos, você pode criar outro arquivo. Stc e carregar este arquivo a partir dele. Algo parecido com isto:



# ----------- myproject.stc ---------------
# load s mycode.cod
# frequency 4000000
# load c netlist.stc



Basta, então, carregar este novo arquivo:



  gpsim -c myproject.stc



e usar netlist.stc sempre que você salvar a partir do ProtBoard



# Processor position:


# Module libraries:
module library libgpsim_modules.so


# Modules:
p16f873a.CONFIG=$ff
p16f873a.WarnMode=true
p16f873a.SafeMode=true
p16f873a.UnknownMode=true
p16f873a.BreakOnReset=true
p16f873a.BreakOnInvalidRegisterRead=true
p16f873a.BreakOnInvalidRegisterWrite=true
p16f873a.frequency=4000000,000000000
p16f873a.xpos=216,0000000000000
p16f873a.ypos=180,0000000000000

module load led led1
led1.xpos=384,0000000000000
led1.ypos=240,0000000000000

module load led led2
led2.xpos=384,0000000000000
led2.ypos=180,0000000000000

module load switch switch1
switch1.state=false
switch1.Ropen=100000000,0000000
switch1.Rclosed=1,000000000000000
switch1.xpos=60,00000000000000
switch1.ypos=180,0000000000000

module load switch switch2
switch2.state=false
switch2.Ropen=100000000,0000000
switch2.Rclosed=1,000000000000000
switch2.xpos=60,00000000000000
switch2.ypos=288,0000000000000

module load pullup pullup1
pullup1.resistance=1000,000000000000
pullup1.capacitance=0,000000000000000
pullup1.voltage=2,000000000000000
pullup1.xpos=276,0000000000000
pullup1.ypos=84,00000000000000

module load pullup pullup2
pullup2.resistance=1000,000000000000
pullup2.capacitance=0,000000000000000
pullup2.voltage=5,000000000000000
pullup2.xpos=144,0000000000000
pullup2.ypos=60,00000000000000

module load pullup pullup3
pullup3.resistance=1000,000000000000
pullup3.capacitance=0,000000000000000
pullup3.voltage=5,000000000000000
pullup3.xpos=216,0000000000000
pullup3.ypos=480,0000000000000

module load pulldown pulldown1
pulldown1.resistance=100,0000000000000
pulldown1.capacitance=0,000000000000000
pulldown1.voltage=0,000000000000000
pulldown1.xpos=36,00000000000000
pulldown1.ypos=396,0000000000000



# Connections:
node nA2
attach nA2 pullup2.pin porta2 switch1.A cm_stimulus_3

node nA3
attach nA3 pullup3.pin porta3 switch2.A cm_stimulus_4

node nB6
attach nB6 led1.in portb6

node nB7
attach nB7 led2.in portb7

node nGnd
attach nGnd pulldown1.pin switch1.B switch2.B

node nUp
attach nUp pullup1.pin porta0 porta1 cm_stimulus_1 cm_stimulus_2


# End..





Se você tentar usar esse arquivo de novo não vai funcionar ... pelo menos eu não consegui, o problema é que casas decimais não tem que ir com vírgulas, mas com pontos, que é resolvido rapidamente em seu editor de texto para substituir a função.

Uma vez dispostas essas pequenas coisa o circuito pode ser usado ​​em outras simulações.

Como sugerido pelo mesmo script no início:
Você pode usar este arquivo (netlist.stc) desta maneira:

gpsim-s-c mycode.cod netlist.stc


Para criar um arquivo tipo netlist, abra um editor de sua preferência edite segundo suas necessidades e salve com a extenção .stc, no meu caso as posições dos componentes, eu usei o Kicad como referência, simplesmente copiei a localização dos componentes.

A princípio vamos utilizar o comando step, que a propria tradução já diz passo, este comando vai executar passo a passo cada linha linha de instrução do arquivo fonte e você pode acompanhar a seguência e os resultados de cada instrução ex:

 **gpsim> step
 **gpsim>GOTO CONFIGURA
0000000000000001 
ETC....

Caso deseje avançar mais de uma linha pode-se definir o comando step como abaixo:

 **gpsim> step 10

O gpsim vai executar 10 linhas de uma só vez , isso é muito útil para agilizar a simulação.
Outra ferramenta muito util na simulação é o conjunto break e run . Dica não acione o run
se você não tiver um break para parar a simulação. O comando break pode ser editado para
parar a simulação em diversas situações definidas pelo usúario . 

Vamos a um exemplo prático:
Observe que no fonte editado como exeplo teos um delay ( DELAY_MS) então é de nosso interesse sair rápidamente desse loop para continuar os testes, então... inicialente criamos
um break:

 **gpsim> break r T1      


A variável 'r' após break quer dizer "pare quando for feita uma leitura no registro T1"
podemos agora digitar 'run' . mas antes digite somente break e verá os dados do comando de 
parada que você acabou de criar.

 **gpsim> break  
  
Agora sim digitamos 'run' , em sempre que o registro T1 for lido é feito o break, mesmo assim
ainda vai demorar muito para sair do loop, então vamos antecipar o fim ....  usando os artifícios
do comando de leitura dos registros 'symbol'

 **gpsim> symbol T1

E será mostrado o endereço do registro e seu valor, sabendo que quando T1 for zero o loop termina então podemos alterar seu valor 

**gpsim> T1=0x01 
  
Fazendo isso quando o simulador run chegar a T1 ocorre o break e T1 no próximo passo 'step' é decrementado chegando a '0' e o loop termina.

Henry