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 amigo Felipe,

Estou trabalhando numa matriz de leds e quero implementar o deslocamento do caracter onde digamos terei 8 frames e a cada frame terei um deslocamento de um bit. No ultimo frame o caracter some e começa a aparecer o seguinte indo da extrema direita para a esquerda. A ideia de mesclar conhecimento de basic com assemble me parece boa pois assim o professor não perderá um aluno promissor.KKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

Link para o comentário
Compartilhar em outros sites

O Jorge postou isto aqui no forum

Define CONF_WORD = 0x3f50

Define CLOCK_FREQUENCY = 4

AllDigital

TRISB = 0

Dim cont As Byte

cont = 0

For cont = 0 To 8

PORTB.0 = 1

ASM: rrf portb,f

WaitMs 1

Next cont

End

Eu acho que é por ai a solução, mesclar basic com asm.

O próprio Paulo confessa que já teve que recorrer a isso. KKKKKKKKKKKKKKKKKKKKKK

Valeu, estou abrindo os horizontes para tentar como solução.

Link para o comentário
Compartilhar em outros sites

basic

boa tarde a todos.

encontrei esse codico, tentei simula-lo mais não funciona.

deve estar faltando alguma coisa, algum amigo do forum pode me ajudar?

program display

adcon=1

trise=0

trisd=0

lcd8_config(porte,portd,2,1,0,7,6,5,4,3,2,1,0,)

lcd8_init(porte,portd)

lcd_out(1,1, "cernetecnologia")

lcd8_out(2,1,"cerne-tec.com.br")

end.

Link para o comentário
Compartilhar em outros sites

basic

aparece o seguinte erro:

0 1 mBPic.exe -DBG -pP18F442 -MSF -Y -DL -O11111114 -fo4 -N"C:\Arquivos de programas\PIC\display.mbppi" -SP"C:\Arquivos de programas\Mikroelektronika\mikroBasic PRO for PIC\defs\" -SP"C:\Arquivos de programas\Mikroelektronika\mikroBasic PRO for PIC\uses\P18\" -SP"C:\Arquivos de programas\PIC\" "__Lib_Math.mcl" "__Lib_MathDouble.mcl" "__Lib_System.mcl" "__Lib_Delays.mcl" "__Lib_CType.mcl" "__Lib_String.mcl" "__Lib_Conversions.mcl" "__Lib_Time.mcl" "__Lib_Trigon.mcl" "__Lib_Trigonometry.mcl" "__Lib_Button.mcl" "__Lib_Keypad4x4.mcl" "__Lib_Manchester.mcl" "__Lib_OneWire.mcl" "__Lib_PS2.mcl" "__Lib_Sound.mcl" "__Lib_SoftI2C.mcl" "__Lib_SoftSPI.mcl" "__Lib_SoftUART.mcl" "__Lib_ADC_A_C.mcl" "__Lib_EEPROM_256.mcl" "__Lib_FLASH_w8_e64.mcl" "__Lib_I2C_c34.mcl" "__Lib_PWM_c21.mcl" "__Lib_SPI_c345.mcl" "__Lib_UART_c67.mcl" "__Lib_PortExpander.mcl" "__Lib_CANSPI.mcl" "__Lib_CF.mcl" "__Lib_CFFat16.mcl" "__Lib_GlcdFonts.mcl" "__Lib_Glcd.mcl" "__Lib_LcdConsts.mcl" "__Lib_Lcd.mcl" "__Lib_Mmc.mcl" "__Lib_MmcFat16.mcl" "__Lib_RS485.mcl" "__Lib_T6963C.mcl" "__Lib_SPIGlcd.mcl" "__Lib_SPILcd.mcl" "__Lib_SPILcd8.mcl" "__Lib_SPIT6963C.mcl" "__Lib_EthEnc28j60.mcl" "display.mbas"

0 154 Available RAM: 747 [bytes], Available ROM: 16384 [bytes]

0 132 Compilation Started C:\Arquivos de programas\PIC\display.mbas

1 1015 Hint: Compiling unit "C:\Arquivos de programas\PIC\display.mbas" display.mbas

6 303 Identifier "lcd8_config" was not declared display.mbas

6 304 Syntax error: Expected "end" but "lcd8_config" found display.mbas

6 304 Syntax error: Expected "." but "(" found display.mbas

0 102 Finished (with errors): 26 mar 2010, 13:44:29 display.mbppi

Link para o comentário
Compartilhar em outros sites

Olá Amigo,

Estou montando um Transmissor de FM PLL Com Pic 16F628 e PLL SAA1057 Da philips

O PLL possui o oscilador que é controlado pelo SAA1057 que por sua ves precisa que o PIC gere o codigo correspondente a frequencia tipo 987 seria 98,7 MHz éssa seria a frequencia a ser sintetizada.

Já sei programar basic, Mas não consigo me comunicar com o SAA1057

Alguém pode ajudar ?

Link para o comentário
Compartilhar em outros sites

Opa ... parece que tem um cara dos ASM's "infiltrado" aqui no tópico !!!!!:D

Poxa, Felipe, assim vai acabar a minha matéria por falta de alunos KKKKKKKK!

Não vou discutir de novo Basic x ASM, mas acho que o que está acontecendo aqui é mais um daqueles problemas simples .... já que os Shifts e os Shifts-and-rotate são mais difíceis de serem feitos em Basic, porque não colocar essas funções que são muito fácilmente implementadas no Assembler ( creio que duas ou 3 instruções bastam, certo Mestre Felipe ? ) como sub-rotinas do Basic ??????

Já fiz isso com rotinasbem mais complexas, e funcionou direitinho, tinha 8 funções para conversar com uma maldita memória serial, que só mesmo em Assembler pois o I2C do PSI não era compatível com ela :angry: !

Às vezes, apenas o Basic não resolve, então, temos de "apelar" ( com todo o respeito, viu Felipe ! ) para o Assembler para ser usado pelo Basic !

Mudando de assunto um pouco .... agora que vou ficar doido de vez, acabei de publicar um tutorial semelhante para os AVR's usando o Bascom.... tirar dúvidas dos dois ao mesmo tempo vai ser fogo....

Pablors,

A comunicação é do tipo I2C, mas existe um terceiro sinal, o Dlen, que voce vai ter de tratar fora do I2C.... o problema é que a Phillips é campeã de circuitos I2C que utilizam clock de baixíssima velocidade, e voce não consegue isto com o PSI.... O correto seria voce mesmo implementar o protocolo de baixa velocidade, em Basic mesmo, mas não é fácil, ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

são mais difíceis de serem feitos em Basic, porque não colocar essas funções que são muito fácilmente implementadas no Assembler ( creio que duas ou 3 instruções bastam, certo Mestre Felipe ? ) como sub-rotinas do Basic ??????

Exato,

simplesmente

asm:

rlf buffer,f

bsf clock

nop

nop

bcf clock

end

simples assim,

agora quanto a I2C fiquei curioso, o que acontecia para nao ser compativel, nao gerava todos os sinais

tava estão feliz em começar usando o i2c pronto pro avr la no basic dele, mas agora fiquei desanimado...

Abs.

Link para o comentário
Compartilhar em outros sites

Felipe, o problema é que a Phillips também faz muito componente que usa o SMBUS, que é um subset do I2C. E ela chama isso de I2C !

Muda o timeout, o clock speed, e os níveis de tensão.

Segue este link que mostra as diferenças :

http://www.maxim-ic.com/app-notes/index.mvp/id/476

Como os AVR's podem trabalhar com tensões mais baixas ( modelos com sufixo v ), os níveis de tensão são resolvidos fácilmente, mas as diferenças de timing ( o PSI usa 400 Khz de clock no I2C, ou seja, segue o modelo FAST do I2C, mas isso atende apenas às memórias seriais, outros componentes não aceitam essa velocidade, suportam apenas 100 Khz no máximo. ) são bem complicadas, eu tive de refazer um monte de código para falar com o maldito chip a 10 Khz ...... Fora que existem chips onde temos de conversar sem o Ack / Nak ( e o PSI só faz Ack .... ) !

Mas se serve como consolo, o Bascom tem uma função que deve resolver isso, tem o Config I2CDELAY, que permite chegar a um clock desde os 10 Khz até os 400 Khz ! E tem todo o subset de comandos I2C, inclusive com ou sem Ack / Nak ! Dá uma olhada no manual, é bem explicativo ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

Saudações aos amigos do ASM e do BASIC,

Olá Professor, continuo fiel a familia BASIC (equipe titular) o ASM seria um reserva que eventualmente temos que tirar do banco para suprir alguma necessidade emergente.KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

Desculpe meus amigos a vaidade é tudo brincadeira afinal somos todos uma grande familia.

Continuando o meu desafio, aos poucos vamos progredindo pois de grão em grão a galinha enche o papo(essa foi cruel KKKKKKKKKK).

O seguinte:

Tenho uma tabela 7 X 24 (cordenadas x, y)

Como armazenar na memória usando endereço com 2 coordenadas (no plano) se o comando que conheço "Write a, b" é linear ("a" endereço e "b" o dado gravado). Pensei em faze algo tipo a = x, y mas não tive êxito.

Um forte abraço.

Link para o comentário
Compartilhar em outros sites

Olá amigo,

aphawk,

Muito Obrigado pela dica.

Agora é que vem o pipino,

Como faço isso "protocolo de baixa velocidade" en Basic, ou até mesmo en asm mesmo,

Como disse eu sei programar somente en BASIC, e só sei o BASIC mesmo, rsrsrs.

Se alguém puder ajudar com até mesmo um DEMO do programa Agradeço pois preciso muito disso vocês não sabem como.

Muito Obrigado a Todos.

Aquele que perde dinheiro, perde muito ; Aquele que perde um amigo, perde mais ; Aquele que perde a fé, perde tudo.

Link para o comentário
Compartilhar em outros sites

Boa noite a todos,

Professor Paulo gostaria de tirar uma duvida com o amigo.

EXEMPLO:

FRASE: “Bom dia”

Como capturar letra por letra para ingressar em “seleciona”

Para obter os bytes relativos a cada linha para formar a letra.

Poderia usar o LookUP ? Como lançar as variáveis para isso? A parte final acho que tá legal o meu problema é o inico, a captura das letras na frase.

Exemplo:

Letra B =======matriz 7 linhas X 5 colunas

Linha1=30

Linha2=9

Linha3=9

Linha4=14

Linha5=9

Linha6=9

Linha7=30

seleciona:

Select Case letra

For k = 1 To 7

Case a

dig = LookUp(4, 10, 17, 17, 31, 17, 17), k

Case b ---bytes da letra b

dig = LookUp(30, 9, 9, 14, 9, 9, 30), k

case .......

EndSelect

linha(k) = dig

WaitMs 2

Next k

Um abraço.

Link para o comentário
Compartilhar em outros sites

Caramba .... Tchecara ...... voce é o meu Karma terrestre hahahahahahah!

Olha, entendi o que voce quer, mas acho que a sua estrutura está errada. Vou reproduzir aqui o que acho que deve funcionar :


Letra B =======matriz 7 linhas X 5 colunas
Linha1=30
Linha2=9
Linha3=9
Linha4=14
Linha5=9
Linha6=9
Linha7=30


seleciona:

For k = 1 To 7

Select Case letra
Case a
dig = LookUp(4, 10, 17, 17, 31, 17, 17), k
Case b ---bytes da letra b
dig = LookUp(30, 9, 9, 14, 9, 9, 30), k

case .......

EndSelect

linha(k) = dig
Next k

Na minha visão do programa, este trecho é uma sub-rotina, que deve ser chamada apenas para montar a matriz linha() com as linhas correspondentes à uma determinada letra.

Mas como voce vai fazer o Shift ???

voce teria de ter uma outra matriz, com a próxima letra, e ficar fazendo o deslocamento de valores ( shift ) , usando as duas matrizes.

Mas isso também não vai dar certo.... o correto é voce fazer uma tabela enorme, com todas as linhas de cada uma das letras e números possíveis, baseados no valor ASCII crescente, assim fica fácil pesquisar elas, e localizar a sequência de linhas . Eu montaria vários ponteiros, para ser mais exato seriam 7 ponteiros, um para cada linha, e eles iriam se deslocando todos ao mesmo tempo, para ir mostrando as linhas passando pelo display.

É mais fácil voce deslocar os ponteiros, do que ficar copiando as linhas para ficar mostrando.

Agora, cá entre nós, essa ideia de usar um shift register para o deslocamento..... isso funciona bem quando é para acender um display de 7 segmentos, acabamos perdendo tempo precioso nas rotinas de shift ....

voce poderia fazer isso, usando uma das portas de um 16f877a para as linhas, e uma outra porta para as colunas, assim fica fácil trabalhar com um display de 64 pontos ( 8 x 8 ) , sem precisar perder tempo com os shifts. Aliás, é assim que eu ví alguns projetos, usando AVR's.

O truque é usar a interrupção do timer para ficar acendendo apenas uma coluna de cada vez, a cada 1/240 de segundo. Assim voce monta uma máquina de estado, e , por exemplo, a cada 1/8 de segundo voce faz o shift das colunas.

Isso, com uma rotina de vários ponteiros se deslocando, sincronizados com as interrupts, ficaria lindo de se ver !

Mas , essa tarefa deixo como um exercício de FS para o meu dileto aluno Tchecara !!!!!:D

E ve se dá um tempo prá mim né , afinal ainda estou terminando a parte 2 do tutorial de programação de AVR's em Basic, fico sem cabeça para pensar em programas para PIC do PSI ao mesmo tempo !!!!!! :(

Um abraço a todos !

Paulo

Link para o comentário
Compartilhar em outros sites

:priv:Mi magoei vou pro asm. :cry:isnif, isnif, isnif,........................

Oh prof não faz assim, tadinho do monstro criou ele agora agüenta. KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

Valeu a dica de usar 7 ponteiros mas a opção de usar um 16F877A não serve uma vez que a intenção é aumentar o número de display e ai não tem como escapar do Shift

Tá bom vou deixar concluir a próxima apostila:D.

Prof desculpa a brincadeira é só para desestreçar.

Um abraço.

Vou perguntar aos "Universitários" então.

Guiris é o seguinte:

Como declarar no PSI uma variável de cadeia onde é armazenado somente textos. No velho basic se expressava assim a variável:

frutas$ = "uva"

Tentei inplementar no PSI uma variável para entrar com textos e não tive êxito.

Com a palavra os amigos universitários.:chicote:

Gente sem brincadeira mas estou apanhando com uma coisa básica, não encontro informação em lugar algum veja só conforme os livros de basic "$" caracteriza uma variável string onde a forma escrita seria "frutas$" o PSI não aceita declaração String.

Link para o comentário
Compartilhar em outros sites

Amigo Tche....

Até onde aprendi de asm ou de basic, não dá. Se eu estiver enganado, os mestres presentes me corrijam: Em asm você teria que criar uma tabela com o end inicial, mostrar para um ponteiro e ir incrementando o end, No basic é semelhante...lembre-se que em cada posição de memória só dá para guardar 1 byte, ou seja, de H00 a HFF. Pelo que eu entendi do seu projeto, o mesmo é bastante interessante, o objetivo me parece é mostrar uma frase em movimento, deslocando-a a esquerda, semelhante ao existente em ônibus etc... no momento ando muito atarefado com a construção de um microCLP usando o PIC 16F628A e o basic, porém acho bastante simpática a ideia da construção de um painel de msg's (essa era a ideia nº 4 de uma lista de 10)ainda estou concluindo a Nº 2). Eu tb tive dificuldades para usar a instrução SHIFTLEFT no PSI para serializar um byte no reg W, porém encontrei um caminho alternativo mostrado algumas pag atrás.

PS: O pino 12 do 74HC595 é LATCH ou seja, você põe um dado no pino 14, espera que o mesmo estabilize, envia um pulso de clock no pino 11, espera que o mesmo estabilize e só então envia o pulso do LATCH no pino 12.

Se houver algo que eu possa ajudar, estou a disposição.

IAS

Link para o comentário
Compartilhar em outros sites

Olá Ias,

Pois é meu amigo que coisa, veja só a cada nova frase que eu queira rodar terei que entrar nas entranhas do programa e ordenar as letras para sua formação. Seria bem mais simpático se eu apenas armazenasse numa variavel e o sistema se encarregaria de processar a coisa automáticamente mas sem essa variável não tem jeito. E você acredita que nem o ASM teria essa possibilidade. Puxa que desencato.

Valeu meu velho.

Link para o comentário
Compartilhar em outros sites

Calma, pessoal, caramba, só não tem jeito para a morte ( e para os políticos ... ) , com software e memória dá para fazer qualquer coisa !

Deixem de ser pessimistas :

1 - Tchecara, compra uma memória serial I2C com uns 16K e pronto, seu problema acabou, por menos de R$ 10,00 !

2 - Agora, a briga é a seguinte : As frases a serem mostradas ficam armazenadas na eprom serial, ok ? E, olha só , o acesso aos dados dessa memória também é sequencial..... olha a ideia -

- Um programa para receber as frases, via serial RS232C, de um computador, e já vai armazenando cada um dos caracteres, trocando pela sua sequência de bytes ! Assim, quando o programa for acessar os dados da memória, ele já recebe cada byte da maneira que ele tem de ser mostrado, ok ?

- Um programa que busca os dados armazenados da memória serial I2C, um a um, e vai armazenando na memória principal do PIC e mostrando eles conforme necessário. Como temos bastante memória livre, dá para ficar manipulando os dados em Basic mesmo, inclusive simulando o tal do shift em Basic mesmo. Lembro que os dados já estarão armazenados no formato de bits, próprio para ir sendo enviado ao display.

Tá vendo como é fácil ?

Aliás, uma coisinha para vocês ficarem pensando..... um AVR ATMEGA16 tem 16K de memória Flash, e 1K de RAM, e 512 bytes de Eeprom , e custa quase o mesmo de um PIC 16f877a .... e o Basic do BASCOM faz milagres com strings ..... heheheh estou cutucando a onça !!!!!

Um abraço !

Paulo

Link para o comentário
Compartilhar em outros sites

Valeu Professor,

Gostei do novo avatar, muito real. Vou adicionar então mais um chip no meu projeto, a coisa tá complicando mas vai ficar bem profissional. Quanto ao uso do PC teria que fazer um software para fazer as edições? Me parece que no windows já tem um terminal para isso. Vi num projeto a EEprom 24C256 eu acho que serve.

Link para o comentário
Compartilhar em outros sites

HAHAHAHAHHA quanto ao avatar, prá ser real tinha de tirar o cabelo dele hihihihihih !!!!

Veja no tutorial, tem um projeto de relógio, nele tem a comunicação I2C com o chip de relógio, que nada mais é do que uma memória serial I2C meio metida a besta hihihihi .... e também tem o programa de comunicação RS232C.

No PC, use o Hyperterminal, tá prontinho, a inteligência tem de ficar do lado do PIC ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

Valeu mestre, realmente tá tudo ali. Vamos ao trabalho.

Comecei a brincar com o lookup e montei um teste para verificar seu funcionamento no caso setei para letra "A".

Estou postando o código pode ser útil para o iniciante. Terei que fazer um case para cada algarismo, bota serviço braçal.

seta_linhas:

letra = a

Select Case letra

For k = 0 To 6

Case a

dig = LookUp(4, 10, 17, 17, 31, 17, 17), k

linha(k) = dig

Case b

dig = LookUp(30, 9, 9, 14, 9, 9, 30), k

linha(k) = dig

EndSelect

Next k

PORTB = linha(0)

WaitMs 200

PORTB = linha(1)

WaitMs 200

PORTB = linha(2)

WaitMs 200

PORTB = linha(3)

WaitMs 200

PORTB = linha(4)

WaitMs 200

PORTB = linha(5)

WaitMs 200

PORTB = linha(6)

WaitMs 200

end

ESTOU POSTANDO AQUI PARA OS AMIGOS UM SOFTWARE PARA EDITAR MENSAGENS através DO PC E GRAVAR NUMA eeprom.

http://www.enterupload.com/dtphgv0ebe4i/LED_MSG.exe.html

Até mais.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

:-BEER Olá meus amigos,

Eureka............... Finalmente consegui fazer funcionar a comunicação PC X PIC. estou disponibilizando os códigos para auxiliar os iniciantes como eu.

A coisa funciona assim: Envio codigo ASCII pelo PC e gravo direto em uma memória EEPROM.

'PIC: 16F628A

Define CONF_WORD = 0x3f70

Define CLOCK_FREQUENCY = 4

AllDigital

TRISA.2 = 1

TRISA.3 = 0

TRISB.1 = 1

Dim rxbuff(7) As Byte

Dim dado As Byte

Dim addr As Word 'endereço memória

Symbol sda = PORTA.2

Symbol scl = PORTA.3

Hseropen 9600

For addr = 0 To 6

loop:

Hserget dado

If dado = 0 Then Goto loop

rxbuff(addr) = dado

WaitMs 2

I2CWrite sda, scl, 0xa0, addr, dado 'escrevendo dado na memória

Next addr

Segue o link com video demonstrativo

http://www.enterupload.com/09rzq1tr2y30/COMUNICAÇÃO___PC_x_PIC.FLV.html

Link para o comentário
Compartilhar em outros sites

Valeu, Tchecara, obrigado pela sua iniciativa em disponibilizar o código para ajudar os iniciantes !

Deixo aqui uma ressalva : esse tempo de 2 milisegundos está fora das normas de acesso a memórias do tipo I2C, pelo menos em caso de acesso aleatório.

O correto seria deixar pelo menos 5 milisegundos entre acessos à memórias do tipo I2C.

Se realmente essa troca de dados fosse feita entre 2 PICs, a 9600 Bauds, ocorreria troca de informações em eum tempo bem menor do que 5 milisegundos, e isto iria causar problemas quanto a confiabilidade dos dados gravados.

Se realmente for necessário a conversa nessa velocidade, entre 2 PIC's, sugiro o uso de um buffer circular, para dar tempo aos dados serem gravados.

Ou a implementação do protocolo XON / XOFF, onde seria usado um byte a ser enviado, que controlaria o fluxo de transmissão, assim a cada dado recebido o receptor envia um XOFF para parar a transmissão, gravar o dado na memória I2C, esperar os tais 5 milisegundos, e só então seria enviado um XON, que seria interpretado pelo transmissor como uma "permissão concedida" para enviar um novo byte.

Digo isto porque existem casos em que esse programa , do jeito que está escrito, realmente funciona, porque o PC está enviando os dados conforme são digitados ( tempo MUITO maiores do que 5 milisegundos ), e casos onde não funcionaria.

Mesmo assim, agradeço muito ao amigo TCHECARA, pela sua dedicação em fazer o programa, testar e publicar aqui !!!!

Se todos fizessem isso, muito mais usuários estariam aprendendo e usando os Pics.

Já ví alguns usuários do Fórum falarem que fizeram isto e aquilo, que iam disponibilizar o projeto, mas logo se "esquecem" , e fica só na promessa...

Agradeço de coração, em nome de muitos usuários que com certeza irão te agradecer, mesmo que em pensamento, pela sua ajuda !

Um abraço !

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!