Ir ao conteúdo
  • Cadastre-se

Tutorial : Introdução ao uso de PIC´s em BASIC com o PIC Simulator IDE - Parte 1/2


Posts recomendados

Oi IAS, obrigado pelo elogio, eu estou terminando a última parte dele, mas dei uma parada pois estou pegando experiência com os Avrs também e aprendendo bem a usar o BASCOM..... depois volto para os PICs e termino o tutorial !

Olha, fazer isso que voce quer , em Basic, é bem simples, pois o Basic buferiza os caracteres para nós, que é a função HSERGET, mas tem um inconveniente em seu caso : ela nos sinaliza com um valor diferente de zero ( de 1 a 255 ) que recebeu um caracter na serial.... e como voce vai usar sinais de controle de fluxo, pode ser que um dos caracteres tenha o valor de zero também....

voce pode usar a função HSERIN, ela espera receber o número de bytes desejado, mas fica esperando indefinidamente por esses bytes ... mas ela pode receber seus 5 bytes em uma lista de 5 variáveis, ok ?

Segue o trecho do manual do PSI :

HSERIN statement can be used to load a list of Byte and Word variables with the values received on serial port. This statement will wait until the required number of bytes is received on serial port.

Exemplo : HSERIN V1,V2,V3,V4,V5

Mas tome cuidado, seu programa pode ficar parado indefinidamente esperando pelos bytes.....

Quanto ao Assembler, prefiro que os amigos mestres nele opinem para te ajudar, ok ?

Boa sorte meu amigo !

Paulo

Link para o comentário
Compartilhar em outros sites

Amigo Paulo...

O meu muito obrigado pela luz no fim do túnel. Apesar de já utilizar o VB há algum tempo, estava fazendo confusão no uso do BASIC para o PIC, já que existem várias e várias versões do BASIC, cada uma voltada para um determinado compilador. Abaixo a rotina testada com sucesso no PSI - as semelhanças com o PROJETO 6 do seu tutorial 2 não são mera coincidência.

Define CONF_WORD = 0x3f50

Define CLOCK_FREQUENCY = 4

AllDigital

TRISA = 0x00

PORTA = 0x0

OPTION_REG = 7

Dim rxbuff(7) As Byte

Dim dado As Byte

Dim x As Byte

Hseropen 9600

Hserout "Projeto 6 - Comunicação Serial", CrLf

For x = 0 To 4

m21:

Hserget dado

If dado = 0 Then GoTo m21

rxbuff(x) = dado

If x = 4 Then

If rxbuff(0) = "G" Then PORTA 0# = 1

If rxbuff(2) = "C" Then PORTA 0.2 = 1

If rxbuff(4) = "*" Then PORTA 0.4 = 1

End If

Next x

Um grande abraço

Itamar

Link para o comentário
Compartilhar em outros sites

:DBuenas Professor, tudo numa boa.

Retornando ao assunto

Memória EEPROM

O PIC16F628A possui 128 posições de memória EEPROM, com capacidade de

armazenamento de 1 byte em cada posição. A faixa de endereços usada para acesso a memória é 00h (zero) até 7Fh (127).

Em cada byte temos 8 bits

O acesso se dá usando

Write a,b ==> para escrita na memória.

Read a,b ==> para ler na memória.

===> a = 00h até 7Fh ---endereço da memória

===> b = nome da variavel onde está o conteudo desejado

=> ao armazenar numeros

ex: write 00h, 32406093 ==> cada algarismo ocupa um bit, totalizando os oitos de um byte ou tenho que converte-los para binários

3 = 0011 2 = 0010 e armazenar os dois em um bit ou somente

3 = 00000011 ocupa o bit inteiro.

Tá grande a salada de frutas não!!!!! Não me admira se tiver pipino ai na confusão.

Vamos tentar separar as frutas dos legumes.

Com a palavra querido Mestre habilíssimo em descascar abacaxi não vai se arrepiar com pepinos KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

:confused:Tudo brincadeira meu amigo é só um aluno confuso.:confused:

Um abraço do aluno CDF,

Enio.:hehehe:

Link para o comentário
Compartilhar em outros sites

Bom, de volta ao batente .... tava muito bom prá continuar na boa vida ....

IAS,

Opa, legal que deu certo ! Eu pesquisei na Internet, e i que existem soluções bem mais simples do que usando zigbee.... dá uma olhada nisto aqui, veja os custos, e veja se serve para simplificar o seu trabalho !

módulo USB - http://www.futurlec.com/USB.shtml veja este USBMOD4

módulo tx / rx longa distãncia wireless - http://www.futurlec.com/Radio-433MHZ.shtml

Qualquer dúvida é só mandar post !!!!

Tchê ,

Eu achei que estava claro no Tutorial... mas explico de novo aqui ( paciência é mesmo uma virtude ? :lol: )!

Uma novidade que eu não coloquei no tutorial é a facilidade de definir valores iniciais da Eprom... segue aqui o trecho original em inglês :

EEPROM memory content can be defined in basic programs using EEPROM statement. Its first argument is the address of the first byte in the data list. Multiple EEPROM statements can be used to fill in different areas of EEPROM memory, if needed. For example:

EEPROM 0, 0x55

EEPROM 253, 0x01, 0x02, 0x03

Agora, quanto ás funções normais :

Write a,b ==> para escrita na memória.

Read a,b ==> para ler na memória.

Lembre-se de que o valor a ser lido ou gravado é sempre entre 0 e 255 ( 8 bits ).

a -> é o endereço da Eprom, e sempre é uma constante ou uma variável tipo BYTE.

b -> é o dado a ser lido (no READ é obrigatóriamente uma variável) ou a ser gravado, e no Write poder ser também uma constante ou uma variável tipo BYTE.

Portanto, em geral,

Para escrever, o conteúdo da variável dado na posição da memória EPROM 25, usamos WRITE 25, dado

Para escrever o valor 12 direto no endereço da EPROM indicado por uma variável chamada de end1, usamos WRITE end1, 12

Para ler o conteúdo da posição de memõria 120 e colocar na variável dado, usamos READ 120, dado

Para ler o conteudo da posição de memória indicada pela variável chamada de end1, e colocar numa variável chamada dado, usamos READ end1, dado

Veja se ficou mais claro agora ok ?

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Amigo Paulo....

Realmente os módulos de RF da Futurlec prometem muito (alcance de 300 e 800m) em área aberta. Teria que testar para ver se realmente funcionam - infelizmente parece não haver representantes no Brasil dos mesmos.

Estou tendo dificuldades com uma rotina em basic para testar os 8 bits de uma variavel, se houver alguém que possa ajudar agradeço antecipadamente.

A rotina é essa:

dim x as byte

dim temp as byte

for x=0 to 7

if temp(x)=1 then porta.1=1

if temp(x)=0 then porta.1=0

waitus 100

next x

uma outra tentativa foi:

for x=0 to 7

temp=shiftright(temp,1)

waitus 100

if status.c=1 then porta.1=1

if status.c=0 then porta.1=0

next x

O objetivo desta rotina é serializar o byte contido em temp, fazendo o mesmo sair pela porta.1 - Nenhuma das duas funcionam.

Desde já agradeço a boa vontade de alguém que possa esclarecer ou orientar para o bom funcionamento da mesma.

IAS

Link para o comentário
Compartilhar em outros sites

:confused:Olá Paulo,

Se possivel tenho uma dúvida ::D

Vejamos:

if dado = 3 then

PORTA.0 = 1

waitms 500

endif

if dado = 4 then

PORTA.1 = 1

waitms 500

endif

if dado = 5 then

PORTA.2 = 1

waitms 500

endif

goto inicio

Não consigo manter mais de uma porta em 1 sempre a ultima a entrar isto é, das tres acende apenas uma de cada vez. É possivel mudar? Gostaria de manter uma independente das demais.

Um forte abraço, e uma boa semana.

Enio.:o

Link para o comentário
Compartilhar em outros sites

IAS,

Eu estou comprando alguns produtos deles, inclusive esses módulos de RF, assim que receber eles aqui vou testar, e eu te aviso ok ?

Quanto ao seu problema :

Vou supor aqui que voce quer transmitir os bits, indo do maior para o menor, ok ?

Vou utilizar seu primeiro exemplo , e acho que o dado que voce quer transmitir está na variável X , correto ? Vamos lá , lembrando que shift à direita é apenas uma divisão por dois :


dim x as byte ' nosso dado
dim i as byte
dim temp as byte
temp = 10000000b ' 128 em decimal e vamos dividindo
for i = 1 to 8
porta.1 = x [COLOR=Red]and[/COLOR] temp ' isolo apenas o bit que queremos
waitus 100
temp = temp/2 ' próximo bit à direita ( maior para menor )
next i

Mas tem uma maneira também bem legal, eu chamo isso de "força bruta", é deselegante, mas não usa nenhuma variável adicional, e mostra uma função pouco conhecida do PSI :


dim x as byte 'nosso dado a tansmitir
...
porta.1 = x.7 ' bit 7
waitus 100
porta.1 = x.6 'bit 6 e assim em diante
waitus 100
porta.1 = x.5
waitus 100
porta.1 = x.4
waitus 100
porta.1 = x.3
waitus 100
porta.1 = x.2
waitus 100
porta.1 = x.1
waitus 100
porta.1 = x.0
waitus 100

Podemos acessar diretamente um bit de qualquer variável BYTE ou WORD, ok ?

Veja se ajuda !

Um abraço.

Paulo

Link para o comentário
Compartilhar em outros sites

Tche,

Não vejo nada errado nesse trecho de código....

Em algum outro lugar do programa, voce está colocando de novo essas saídas em 0, ou talvez voce náo tenha declarado todos esses bits do port como saída. O problema com certeza está depois do label INICIO !

Enfim, posta o programa inteiro prá eu ver se acho o erro ok ?

Quanto à sua pergunta, se é possível mudar, lembre-se de que podemos mudar tudo, exceto a morte e os impostos :D !!!!!

Um abraço !

Paulo

Link para o comentário
Compartilhar em outros sites

Bom dia Paulo,:confused:

:DEu coloquei meu código neste endereço para não encher a pagina aqui.

http://www.enterupload.com/j95855p93b00/pic.txt.html

Eu não consigo fixar a porta em 1 e sòmente ao meu comando ela deve retornar a zero. como poderia fazer isso? Do jeito que está sempre a ultima porta fica em 1, ao acionar outro comando outra porta passa a ser 1 e a anterior vai a zero.

Agradeço a atenção do amigo, um abraço

Enio.

Link para o comentário
Compartilhar em outros sites

;)Fala Jorge, tava sumido de férias numa boa é isso ai.:D

Que tenha um bom retorno.

O seguinte Jorge, não fez diferença.

A minha bronca é a seguinte:

Por meio de telecomando eu quero manter qualquer porta em 1 com total independencia, assim como coloca-la em zero. As 4 portas no projeto são dependentes pois na prática apenas uma de cada vez vai a 1 isto é nenhuma se mantém quando a ultima é acionada pois a variável "n" é que lidera a situação se ela muda troca tudo teria que fazer uma associação de maneira a tornar independente. Mas como???????????????

Um abraço,

Enio.:wacko:

Link para o comentário
Compartilhar em outros sites

Fiz um projeto que apresenta 7 led's. Eles acendem com 5 sequencias definidas. e o que quero incluir é isso, fazer com que ele não acenda do nada(on/off)... quero que numa das sequencias, ele vá acendendo aos pouco até chegar ao brilho máximo(5V na saida do pino)... e depois vá apagando.

O Felipe_Eletronic indicou usar modulo CCP do PIC, para gerar sinais de PWM. Mas não tenho ideia de como aplicar isso no PSI. Alguma ajuda?

Segue abaixo cópia do código usado.

=================================

Define CONF_WORD = 0x3ff1

TRISA = 0xff 'todos os pinos como entrada

TRISB = 00000001b

INTCON.INTE = 1 'enable RB0/INT interrupts

INTCON.GIE = 1 'enable all un-masked interrupts

Dim digito As Byte 'os números que vamos mostrar, de 0 a 9

Dim chave As Byte

Dim ct As Byte

Dim saida As Byte 'padrão de segmentos dos números 0 a 9

chave = 0

sempre:

Select Case chave

Case 0

PORTB = 0xfe

Case 1

ct = chave

PORTB = 0x00

For digito = 0 To 6

saida = LookUp(0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80), digito

If ct <> chave Then digito = 7

PORTB = saida

'WaitMs 250

Next digito

Case 2

ct = chave

PORTB = 0x00

For digito = 0 To 6

saida = LookUp(0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02), digito

PORTB = saida

If ct <> chave Then digito = 7

'WaitMs 250

Next digito

Case 3

ct = chave

PORTB = 0x00

For digito = 0 To 6

saida = LookUp(0xfc, 0xfa, 0xf6, 0xee, 0xde, 0xbe, 0x7e), digito

PORTB = saida

If ct <> chave Then digito = 7

'WaitMs 250

Next digito

Case 4

ct = chave

PORTB = 0x00

For digito = 0 To 6

saida = LookUp(0x7e, 0xbe, 0xde, 0xee, 0xf6, 0xfa, 0xfc), digito

PORTB = saida

If ct <> chave Then digito = 7

'WaitMs 250

Next digito

EndSelect

Goto sempre

End

On Interrupt 'interrupt routine

chave = chave + 1 'decrement the value on PORTA

If chave > 4 Then chave = 0

'WaitMs 400

INTCON.INTF = 0 'enable new RB0/INT interrupts

Resume

Link para o comentário
Compartilhar em outros sites

você quer um sequencial pwm.você pode tanto usar o ccp,qto fazer na mao.Procure no manual do psi q deve ter como usar o ccp.Ou pode tentar fazer no braço kkkkkkkkkkk.Se acender durante x tempo e apagar durante x tempo durante um intervalo de tempo acho q da este efeito ai.Eu to pra fazer aquele efeito estilo da super makina ,vou por aqui no carro da minha mae kkkkkkkkkkk.

Link para o comentário
Compartilhar em outros sites

gerar um PWM por software é tão fácil quanto andar para trás,

Vamos ao algoritmo:

- Usando o timer2, você pode determinar o periodo e a frequencia fixa do teu PWM;

- Usando uma variavel de controle você estabelece o tempo em que teu sinal fica em nível alto.

- Va comparando o valor corrente do timer com a variável de controle, enquanto o timer for menor que o valor da varavel de controle a saida mantem se em nível caso maior ou igual voce leva a saida a nivel alto;

- Para mudar o tempo em que a saida fica em nivel alto altere a variavel de controle de modo que 0=< variavel =< valor de estouro do timer.

Essa é uma das milhares de forma de se gerar um PWM, a resolução esta em torno de 7bits dependendo da frequencia, essa é a forma que considero mais simples, fiz esse codigo aqui em assembly mas ta comentado para gerar um PWM por esta técnica para construção de um inversor de tensão senoidal:


;FIRMWARE DE TESTE PARA INVERSOR
;VERSÃO 1
;DATA: 30/12/2009
;AUTOR:FELIPE NEVES


list p= pic16f88
#INCLUDE <P16F88.INC>
__CONFIG _CONFIG1, _CP_OFF & _WDT_OFF & _MCLR_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_IO

;=======================================================
CBLOCK 0X20
C1
C2
OFFSET
FLAG
COMP
CICLE
ENDC
;=======================================================
#DEFINE Q1 PORTB,0 ;TRANSISTOR DE SAIDA
#DEFINE Q2 PORTB,2 ;TRANSISTOR DE SAIDA
#DEFINE Q1_FLAG FLAG,0 ;FLAG DE INVERSÃO
#DEFINE Q2_FLAG FLAG,2 ;FLAG DE INVESÃO
;=======================================================
ORG 0X00
GOTO START

ORG 0X04
BTFSC PIR1,TMR2IF
GOTO PULSE_INT
BTFSC INTCON,TMR0IF
GOTO INVERT_DRIVE

SAI_INT:
RETFIE

PULSE_INT
CLRF PORTB ;DESABILITA TRANSISTOR
INCF OFFSET ;INCREMENTA INDICE DA TABELA
CALL SINE_TABLE ;CHAMA TABELA
MOVWF CICLE ;POE EM CICLE
BCF PIR1,TMR2IF ;DESABILITA FLAG DE INTERRUPÇÃO
CLRF TMR2 ;RESETA TIMER2
GOTO SAI_INT ;SAI DA INTERRUPÇÃO

INVERT_DRIVE:
CLRF PORTB ;LIMPA PORTB
CALL MILISEC ;ENTRA EM DEAD TIME
CLRF OFFSET ;RESETA OFFSET
COMF FLAG,F ;INVERTE O TRANSISTOR ATIVO
MOVF FLAG,W
ANDLW B'00000101' ;APAGA DEMAIS BITS
MOVWF FLAG
BCF INTCON,TMR0IF ;RESETA FLAG DE TIMER0
CLRF TMR0 ;ZERA TIMER0
GOTO SAI_INT ;SAI DA INTERRUPÇÃO


;======================================================
DELAYMS
MOVWF C2
CALL MILISEC
DECFSZ C2,F
GOTO $-2
RETURN

MILISEC ;DELAY DE DEAD TIME
MOVLW .10 ;CARREGA C1 COM 10d
MOVWF C1
NOP ;1uS
DECFSZ C1,F ;1uS
GOTO $-2 ;2uS
RETURN ;x10 + 2uS = 42uS

;====================================================================
LOOP:
MOVF CICLE,W
SUBWF TMR2,W ; FAZ (TMR2 - W) E VERIFICA QUEM É MAIOR
BTFSC STATUS,C ; QUEM É MAIOR?
GOTO LIGA ;TMR2, ENTÃO HORA DE CHAVEAR O DRIVE
BCF STATUS,C ;LIMPA CARRY E REPETE A OPERAÇÃO
GOTO LOOP

LIGA
MOVF FLAG,W ;MOVE QUAL TRANSISTOR DEVE SER O ATIVO
IORWF PORTB,F ;FAZ LÓGICA OR COM PORTB E GUARDA O RESULTADO LA MESMO
GOTO LOOP ;TERMINADA A OPERAÇÃO, RETORNA
;====================================================================
START:
BANKSEL OSCCON
MOVLW 065H ;OSCILADOR RODANDO A 4MHZ
MOVWF OSCCON
BANKSEL PORTA
CLRF PORTA ;LIMPA IO DO PORTA
CLRF PORTB ;LIMPA IO DO PORTB
BANKSEL CMCON
MOVLW 0X07 ;DESABILITA COMPARADOR
MOVWF CMCON
BANKSEL ANSEL
CLRF ANSEL ;SETA TODOS OS IOs PARA DIGITAIS
BANKSEL TRISA
MOVLW 0XFF ;PORTA SOMENTE ENTRADA
MOVWF TRISA
CLRF TRISB ;PORTB SOMENTE SAIDA


BANKSEL OPTION_REG
MOVLW B'10000100' ;CONFIGURA TIMER0 COM PREESCALER 1:32
MOVWF OPTION_REG
BANKSEL PR2
MOVLW .125 ;TIMER2 IRA INTERROMPER A CADA 2KHz
MOVWF PR2
BANKSEL T2CON
MOVLW B'00000101' ;CONFIGURA TIMER2 COM PRESCALER 1:4
MOVWF T2CON
BANKSEL PIE1
BSF PIE1,TMR2IE ;ATIVAR INTERRUPÇÃO PELO ESTOURO DO TIMER2
BANKSEL INTCON
MOVLW B'01100000' ;ATIVA INTERRUPÇÃO PELO TIMER0 E PERIFERICOS
MOVWF INTCON
BSF INTCON,GIE ;ATIVA TODAS AS INTERRUPÇÕES HABILITADAS
BCF STATUS,RP0


BCF Q1 ;DESATIVA Q1
BCF Q2 ;DESATIVA Q2
BSF Q1_FLAG ;INCIA FLAG DE INVERSÃO EM 1
MOVLW .113 ;INICIA COM CICLO ATIVO MINIMO
MOVWF CICLE
CLRF COMP ;LIMPA COMP
CLRF OFFSET ;ZERA OFFSET
CLRF TMR0 ;ZERA TMR0
CLRF TMR2 ;ZERA TMR2
BCF STATUS,C ;LIMPA CARRY
GOTO LOOP
;=================================================================================================

SINE_TABLE ;TABELA SENOIDE
MOVF OFFSET,W ;DEFINE O PONTO DO CICLO ATIVO CORRESPONDENTE
ADDWF PCL,F
RETLW .113
RETLW .100
RETLW .88
RETLW .75
RETLW .63
RETLW .50
RETLW .37
RETLW .25
RETLW .12
RETLW .25
RETLW .37
RETLW .50
RETLW .63
RETLW .75
RETLW .88
RETLW .100
RETLW .113

;=================================================================================================
END ;FIM DO FIRMWARE

Mestre Paulo me desculpe invadir o tópico com assembly, mas creio que va ajudar o amigo.

abs.

Link para o comentário
Compartilhar em outros sites

Mestre Paulo...

Na realidade, não é o byte a transmitir e sim o byte recebido a ser serializado - optei pela sua sugestão de "solução deselegante" e a coisa funcionou perfeitamente. Em tempo: conclui com sucesso o desenvolvimento do programa no PIC em tempo record, após de 2 anos e varias tentativas frustadas/desistencias e retomadas no assembler, o desenvolvimento usando o PSI foi rápido principalmente graças ao seu tutorial sobre o basic/PSI e a sua valiosa ajuda na solução de alguns detalhes.

Já gerei o arquivo .HEX, gravei em um PIC 16F628A e testei com absoluto sucesso no kit de desenvolvimento da SmartRadio (www.smartradio.com.br). Agora é passar para a PCI e testar em campo.

O que o programa faz:

Ao iniciar, transmite uma msg para o PC via porta COM a 9600 bouds rate "Comunicação Serial Ativa" e fica aguradando um comando proveniente do PC - decorrido um tempo, sai da rotina de espera (TIMEOUT) e entra em uma subrotina onde checa 4 chaves, enviando para o PC a informação se uma ou varias chaves foram acionadas - "Alarme 1", "Alarme N" e volta a rotina de espera de um comando enviado pelo PC - Se houver um comando enviado pelo PC, guarda a string de comando em um bufer de 5 bytes - checa se 3 dos 5 estão corretos segundo uma máscara e executa um ou vários comandos contidos nos outros 2 bytes, enviando ao PC a msg de "comando executado" - se qualquer um dos 3 bytes da máscara de controle estiver errado, não executa nada, a não ser enviar uma msg ao PC "Falha na comunicação serial". A intenção é que o PC possa acionar individualmente cada uma das 48 cargas conectadas ao sistema e monitorar cada uma das 4 chaves.

OBS: A memória usada foi de apenas 907 words (189 linhas)

Um grande abraço e o meu muito obrigado.

IAS

Link para o comentário
Compartilhar em outros sites

Pessoal, desculpem pela demora em responder...

IAS -

Legal, parabéns meu amigo, esse é o resultado que eu sempre esperei quando comecei a incentivar o uso do PSI para os PICs e AVRs.

A facilidade na linguagem, o enorme poder do simulador de hardware, e a ideia bem original do programa é o que faz dele uma execelente ferramenta profissional, porém, muito acessível para pessoas com pouca experiência em programação de microprocessadores.

Se precisar de mais alguma coisa, é só postar, para que todos os interessados possam também usufruir da troca de conhecimentos e experiências ok ?

Felipe_Eletronic -

Opa meu amigo, a sua presença aqui é sempre muito bem-vinda, mesmo em Assembler !!!!! O que importa é a sua valiosa informação de como se faz o uso do PWM, com certeza ajudou a muitos !

Particularmente, eu estou brincando um pouco com o PWM nos AVR´s, aprendendo a usar isto na prática e vou portar para os PIC´s ; logo farei a inclusão no tutorial de alguns exemplos de uso e a explicação geral da maneira de se implementar no PSI.

Tchecara -

Peguei o seu software no link, vou dar uma olhada e logo te respondo ok ?

Savant_rj -

Vou fazer um pequeno teste com um LED e PWM, e posto o código aqui para te ajudar ok ?

Um abraço a todos !

Paulo

Link para o comentário
Compartilhar em outros sites

Senhores...

Existe algum código exemplo em basic PSI que possa ser disponibilizado ou sugestão de como implemenar um menu de muitos itens a ser mostrado no LCD usando poucas chaves no PIC?

Exemplo: a intenção é alterar individualmente o tempo que cada led permanece aceso em um sequencial de 8 leds. Qualquer sugestão será bem vinda e antecipadamente agradeço...

IAS

Link para o comentário
Compartilhar em outros sites

Mestre paulo, não é so você que foi se meter ao lado negro da força (to falando dos AVR gente kkkkk) eu entrei na dança também, estou abrindo mais o AVR Studio do que o MPLab, mas claro né em assembly,mas estou usando a valiosa ferramenta o ASI que é o mesmo PSI so que para AVR.

No que eu puder ajudar, sendo em basic, C, asm estamos ai contem comigo.

abs.

Link para o comentário
Compartilhar em outros sites

Cara, eu to lendo o tutorial aqui e fazendo as simulações...

To na primeira parte ainda, mas to gostando muito do tutorial...

Só que está dando uma pala aqui...

O Projeto 3 não tá simulando?

Alguém sabe porque, é por ser demo e só aceitar 50 linhas?

Abraços e acradeço a ajuda

Link para o comentário
Compartilhar em outros sites

Senhores....

Segundo li em um dos numerosos tutoriais, artigos, foruns, não lembro bem.... sobre o PIC, o acesso a leitura e/ou escrita de dados na EEPROM leva um tempo muito maior que o acesso a uma posição de memoria comum. Desenvolvendo um programa para o PIC e desejando não perder os dados (17 variaveis ao todo), resolvi armazena-los na memória EEPROM e recupera-los ao iniciar após um reset do sistema. Usando o PSI fiz:

Ao iniciar o programa, carrego uma matriz b de 17 elementos

dim a as byte

dim b(16) as byte

for a= 0 to 16

read a, b(a)

next a

o sistema entra em loop infinito, exatamente lendo a EEPROM, porém de fizer:

dim a as byte

read 0,a

b(0)=a

read 1,a

b(1)=a

......

.....

b(17)=a

a coisa funciona. Algum dos colegas com mais experencia no uso do PSI tem alguma explicação para o fato ou sugestão?

Antecipadamente agradeço alguma sugestão/informação.

IAS

Link para o comentário
Compartilhar em outros sites

IAS,

Quanto ao fato de ser bem mais lento o acesso à Eprom, realmente é sim, pois são necessários tempos de acesso de ordens de grandeza 100 vezes ou até mais do que o necessário para o acesso normal à RAM...

Quanto ao programa ficar em loop infinito, eu tenho uma explicação sim : BUG do PSI ..... !

Deveria funcionar pelo que eu lí na documentação.... não achei nada de errado no código, nem nos tipos de variáveis.

Já ví alguns erros que acontecem numa versão nova e não aconteciam numa versão anterior. Experimente compilar com uma outra versão do programa.

Paulo

Link para o comentário
Compartilhar em outros sites

Paulo,

Apesar de o PSI ser um programa fantástico do meu modesto ponto de vista, parece também ter seus bugs...e com os iniciantes no uso do mesmo como é o meu caso, falta a segurança que só a experiência traz.

Mais uma vez, o meu muito obrigado.

PS: Quando é que sairá a terceira parte do tutorial?

Um forte abraço...

IAS

Link para o comentário
Compartilhar em outros sites

Pois é.... mas ainda bem que eu só conheço dois erros nele, com esse que você descobriu agora ! Ainda bem que podemos contornar de outras maneiras....

Quanto á terceira parte, falta apenas fazer uma experiência com potenciometro digital, e eu publico ele também. Vai ser um projeto de som....

Agora estou brincando com o Bascom e os AVR´s ... acho que logo vou fazer outro tutorial sobre isso também, ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!