Ir ao conteúdo
  • Cadastre-se

test man*~

Membro Pleno
  • Posts

    571
  • Cadastrado em

  • Última visita

Tudo que test man*~ postou

  1. O que você acha do Atmel-ICE (PCBA + cabo) @aphawk? Ele grava até os SAM, parece ser um bom negócio. http://www.atmel.com/tools/atatmel-ice.aspx ----- Eu estava fazendo um código para o TMP101 e o USBasp estava muito estranho (hora lia os FUSES corretamente hora não, hora dava erro hora não, etc.) daí resolvi dar uma lida pela internet e encontrei estes links: http://blackstufflabs.com/2013/10/24/aggiornare-firmware-usbasp-con-arduino/?lang=en http://openrcforums.com/forum/viewtopic.php?f=10&t=1363#p29615 Regravei o bootloader do Arduíno Mega e o usei como ISP (sketch Arduíno ISP), segui os passos do 1° link porém usando os pinos 50, 51, 52, 53 e o arquivo main.hex (firmware USBasp) do 2° link. Na primeira tentativa, após a gravação, tirei o jumper (self Prog) do USBasp e o conectei ao PC e ele nem deu sinal de vida, o PC não o reconheceu (achei que ele tinha morrido, que eu tinha matado ele) Adicionei o AVRDUDESS à lista de permissão do firewall do windows, coloquei para executar como administrador, tirei os LEDs de status (Heartbeat, Error e Programming) que a sketch Arduíno ISP indica e tentei gravar novamente... Nesta tentativa o AVRDUDESS mostrou tudo certinho (porcentagem do processo, detectou o ATmega8 do USBasp, etc.) daí testei o USBasp e parece que os erros foram embora até aquele do sck... O bom é que há uma sketch para tudo no arduino!!! HEHE Vou continuar o programa para o TMP101 se isso realmente tiver corrigido o problema eu confirmarei... Vi que o PICkit 2 está na lista de programadores, depois vou tentar gravar o 2560 com ele... Esse AVRDUDESS parece ser bom... EDIT > [...] Trecho apagado [...]
  2. Mestre Paulo @aphawk eu estou com um problema, na verdade é uma situação estranha... Eu estava fazendo uns testes com os FUSES (nem encostei no SPIEN xD), erasing chip, gravando um blink led (feito no BASCOM) e regravando o bootloader de um ATmega2560... O estranho é que todos os testes funcionaram mas na hora de regravar o bootloader da um erro em "verifying flash" porém o bootloader é gravado corretamente (sketch do blink led + serial funcionam normalmente). Achei que era o PROGISP então instalei o eXtreme Burner - AVR e nele quando eu vou gravar o bootloader não aparece erro algum mas o bootloader não é gravado corretamente... Estranho isso, dá o erro na verificação da flash mas o bootloader gravado aparentemente funciona, isso é normal? Ou pode ser que em uma siuação o programa (sketch) não funcione corretamente por causa disso? Não usarei a IDE do Arduíno mas é só para saber mesmo. (Usei um arduino mega 2560 e o USBasp da imagem) Ele possui uma chave para selecionar entre 3,3V e 5V mas não é possível fazer ele não alimentar o circuito... Tive que cortar o fio do VCC (na época não encontrei aquele com o ZIF que você indicou no tutorial).
  3. Após escritas consecutivas na EEPROM é bom esperar o término da escrita anterior. while(EECON1.WR){} //PIC16F877A
  4. @_xyko_ Isso mesmo... quando eu estava lendo o tutorial do Paulo Aphawk isso deu um nó na minha cabeça HEHE!!! @fabiano aladin coloquei o CCS 4.78 para testar... Apesar de o PROTEUS mostrar um warning o circuito funcionou normalmente. Aparentemente o problema não está no CCS.
  5. Não, tipo 1=saída 0=entrada para os AVRs (ou eu estou errado?) nos PICs 1=entrada 0=saída...
  6. Você mudou o código ¬¬ Vê se iso resolve... Estou chutando!! =D Se resolver eu falo o que eu acho que está acontecendo... # INCLUDE <16f628a.h># USE DELAY (CLOCK=4000000)# FUSES XT ,NOWDT , PUT , BROWNOUT , NOLVP# USE FAST_IO( # BYTE TRISB = 0X86 // <<<--- Adicionado# BIT TRISB0 = TRISB.0 // <<<--- Adicionado# BIT TRISB7 = TRISB.7 // <<<--- Adicionado VOID MAIN (){ INT a = 0; //set_tris_b (0b00000001); // <<<--- Retirado TRISB0 = 1; // <<<--- Adicionado PINO B0 COMO ENTRADA TRISB7 = 0; // <<<--- Adicionado PINO B7 COMO SAÍDA WHILE (TRUE){ IF (input (pin_B0)==1) { delay_ms (300); a = a + 1; } IF (a == 1) { delay_ms (50); output_high (PIN_B7); } IF (a == 2) { delay_ms (50); output_low (PIN_B7); a = 0; } }} Edit: O # USE FAST_IO( B ) continua, erro meu!
  7. Já aconteceu isso umas três vezes comigo... Após quebrar a cabeça por uns 2 dois dias acabei descobrindo que o problema era no PROTEUS... Mas mesmo assim, ele é EXCELENTE
  8. O PIC é invertido se comparado aos AVR's Testei aqui e funcionou normalmente... A diferença é que a versão do CCS é a 5.046... Você pode postar o arquivo .lst? # INCLUDE <16f628a.h># USE DELAY (CLOCK=4000000)# FUSES XT ,NOWDT , PUT , BROWNOUT , NOLVP# USE FAST_IO( VOID MAIN (){ INT a = 0; set_tris_b (0b00000001); WHILE (TRUE){ IF (input (pin_B0)) { //IF (input (pin_B0)==1) { delay_ms (300); a = a + 1; } IF (a == 1) { delay_ms (50); output_high (PIN_B7); } IF (a == 2) { delay_ms (50); output_low (PIN_B7); a = 0; } }}
  9. É possível sim cara... Você adicionou a STDLIB #INCLUDE <STDLIB.H> Os PICs não fazem coisa alguma =D nem "if(X>0)" HEHE
  10. Lembrei do joguinho de cartas do FFIX HEHE! A função rand(); produzirá sempre uma mesma sequencia, para mudar deve ser usado srand(); (acho que é isso mesmo). Mas o esquema do Timer fica mais fácil... Tipo, o que determina que o número escolhido pode ser considerado aleatório? No caso do Timer como garantir que a leitura atual dele gere um número realmente aleatório? Só curiosidade mesmo!
  11. Se você estiver usando o CCS dê uma olhada na função rand(); no help. //#define RAND_MAX 2 #INCLUDE <STDLIB.H> : void main() { int I; I=rand(); // <--- I igual a um número aleatório (pseudo-random). :
  12. O Correios resolveu sumir com minhas encomendas, então eu decidi fazer uma biblioteca para o uso de um LCD 16X2 ou 20x4 usando o módulo LCD I2C (PCF8574 ou PCF8574A) no PROTEUS mesmo: Dessa forma dá para controlar o LCD com 2 pinos do PIC. O circuito com o módulo fica assim: A biblioteca deve funcionar corretamente desde que comandos I2C (i2c_start(), i2c_write(), i2c_stop()...) não sejam usados dentro de uma interrupção. Programa para testar as funções da biblioteca (meio grandinho =D): #include <16F883.h>#device ADC=10 #FUSES PUT //Power Up Timer#FUSES MCLR //Master Clear pin enabled#FUSES NOPROTECT //Code not protected from reading#FUSES NOCPD //No EE protection#FUSES NOBROWNOUT //No brownout reset#FUSES NOIESO //Internal External Switch Over mode disabled#FUSES NOFCMEN //Fail-safe clock monitor disabled#FUSES NOLVP //No LOW V PROG, B3(PIC16) or B5(PIC18) used for I/O#FUSES BORV40 //Brownout reset at 4.0V#FUSES NOWRT //Program memory not write protected#use delay(internal=8MHz) #byte portb=0x06#byte trisb=0x86 #bit led=portb.0#bit trisb0=trisb.0 /*********************************** MODULO LCD I2C **********************************************/#use i2c(Master, Fast, I2C1, force_hw) // Fast = 400KHz #define PCF8574A // Comentar para módulos que usam o PCF8574 #define A2_A1_A0 0B111 // Estados dos pinos de endereço (A2 A1 A0) do PCF8574A/PCF8574.#define LCD20X4 // Comentar esta linha para usar LCD 16x2#include <lcd_i2c_pcf8574.c>/*************************************************************************************************/ void main() { int b1,b2,b3,b4; int array[8]; trisb0 = 0; led = 0; // Ligando o LCD inicializa_lcd_i2c(); printf(escrever_lcd_i2c,"\fPrimeira linha.\nsegunda linha."); printf(escrever_lcd_i2c,"\nTerceira linha.\nQuarta linha."); delay_ms(4000); // Rotacionando para a direita (sem alterar dados) for(b1 = 0; b1 < 20; b1++) { deslocar_lcd_i2c(DIREITA); delay_ms(500); } // Rotacionando para a esquerda (sem alterar dados) for(b1 = 0; b1 < 10; b1++) { deslocar_lcd_i2c(ESQUERDA); delay_ms(500); } // Retornar o LCD para a posição normal (cursor na coluna 1 e linha 1) lcd_i2c_posicao_original(); delay_ms(2000); // \a posiciona o cursor no inicio da primeira linha printf(escrever_lcd_i2c, "\aABCDEFGHIJKLMNOPQRST"); // \a printf(escrever_lcd_i2c, "\nabcdefghijklmnopqrst"); printf(escrever_lcd_i2c, "\n12345678901234567890"); printf(escrever_lcd_i2c, "\n!@#$^&*(){}[]:;<>?/="); delay_ms(3000); //Limpando o LCD limpar_lcd_i2c();// Ou printf(escrever_lcd_i2c,"\f"); delay_ms(1000); //Colocando um número em cada canto e testando função lcd_i2c_irpara_xy(); lcd_i2c_irpara_xy(4, 2); printf(escrever_lcd_i2c, " Um numero em"); lcd_i2c_irpara_xy(4, 3); printf(escrever_lcd_i2c, " cada canto."); lcd_i2c_irpara_xy(1, 1); printf(escrever_lcd_i2c, "1"); lcd_i2c_irpara_xy(20, 1); printf(escrever_lcd_i2c, "2"); lcd_i2c_irpara_xy(20, 4); printf(escrever_lcd_i2c, "3"); lcd_i2c_irpara_xy(1, 4); printf(escrever_lcd_i2c, "4"); delay_ms(4000); //Lendo caracteres do LCD b1 = ler_caractere_lcd_i2c(1,1); // Ler caractere da coluna 1 linha 1 b2 = ler_caractere_lcd_i2c(20,1); // ler caractere da coluna 20 linha 1 b3 = ler_caractere_lcd_i2c(20,4); b4 = ler_caractere_lcd_i2c(1,4); printf(escrever_lcd_i2c, "\f Caracteres lidos\n"); printf(escrever_lcd_i2c, " dos quatro cantos:\n\n"); printf(escrever_lcd_i2c, " %c %c %c %c", b1, b2, b3, b4); delay_ms(4000); printf(escrever_lcd_i2c,"\f Testando cursor.\nCursor ligado\nBlink desligado: "); lcd_i2c_cursor(CURSOR_LIGADO | BLINK_DESLIGADO); delay_ms(4000); printf(escrever_lcd_i2c,"\f Testando cursor.\nCursor desligado\nBlink ligado: "); lcd_i2c_cursor(CURSOR_DESLIGADO | BLINK_LIGADO); delay_ms(4000); printf(escrever_lcd_i2c,"\f Testando cursor.\nCursor ligado\nBlink ligado: "); lcd_i2c_cursor(CURSOR_LIGADO | BLINK_LIGADO); delay_ms(4000); // \r posiciona o cursor no inicio da linha printf(escrever_lcd_i2c,"\fTeste CR>>"); // CR - Carriage return '\r' delay_ms(1000); printf(escrever_lcd_i2c,"\r"); delay_ms(3000); printf(escrever_lcd_i2c,"\fLendo endereco do\ncursor."); lcd_i2c_irpara_xy(11, 4); delay_ms(3000); b1 = ler_endereco_cursor(); printf(escrever_lcd_i2c,"\fCursor estava na\nposicao: 0x%X",b1); delay_ms(4000); lcd_i2c_cursor(CURSOR_DESLIGADO | BLINK_DESLIGADO); printf(escrever_lcd_i2c,"\f Backlight\n desligado"); lcd_i2c_backlight(BL_DESLIGADO); delay_ms(3000); printf(escrever_lcd_i2c,"\f Backlight\n ligado"); lcd_i2c_backlight(BL_LIGADO); delay_ms(3000); printf(escrever_lcd_i2c,"\f Backlight\n desligado"); lcd_i2c_backlight(BL_DESLIGADO); delay_ms(3000); //testando CGRAM array[0] = 0b01010; array[1] = 0b01010; array[2] = 0b01010; array[3] = 0b00000; array[4] = 0b10001; array[5] = 0b01110; array[6] = 0b00000; array[7] = 0b00000; escrever_cgram_lcd_i2c(1,array); // Escreve =) na CGRAM // posição 1 (pode ser de 0 a 7). array[0] = 0b01010; array[1] = 0b01010; array[2] = 0b01010; array[3] = 0b00000; array[4] = 0b01110; array[5] = 0b10001; array[6] = 0b00000; array[7] = 0b00000; escrever_cgram_lcd_i2c(7,array); // Escreve =( na CGRAM // posição 7 (pode ser de 0 a 7). array[0] = 0b01010; array[1] = 0b11111; array[2] = 0b11111; array[3] = 0b01110; array[4] = 0b00100; array[5] = 0b00000; array[6] = 0b11111; array[7] = 0b00000; escrever_cgram_lcd_i2c(4,array); // Escreve <3 na CGRAM // posição 4 (pode ser de 0 a 7). array[0] = 0b11111; array[1] = 0b10000; array[2] = 0b11111; array[3] = 0b00001; array[4] = 0b11111; array[5] = 0b10000; array[6] = 0b11111; array[7] = 0b00000; escrever_cgram_lcd_i2c(0,array); // Escreve ?? na CGRAM // posição 0 (pode ser de 0 a 7). printf(escrever_lcd_i2c,"\fDesenhando Caractere\n\n "); // Limpa LCD escrever_caractere_desenhado(1); // Escreve o caractere desenhado na pos. 1 printf(escrever_lcd_i2c," "); escrever_caractere_desenhado(7); // Escreve o caractere desenhado na pos. 7 printf(escrever_lcd_i2c," "); escrever_caractere_desenhado(4); // Escreve o caractere desenhado na pos. 4 printf(escrever_lcd_i2c," "); escrever_caractere_desenhado(0); // Escreve o caractere desenhado na pos. 0 delay_ms(5000); printf(escrever_lcd_i2c,"\f\n \1 FIM!! \1"); while(TRUE) { led = !led; delay_ms(1000); } } Download do código: http://www.4shared.com/rar/Fh2VzRhFce/LCD_I2C_PIC_CCS.html?
  13. Em: void troca_posicao(void) { aux = V[p0]; V[p0] = V[p1]; V[p1] = aux; } Você usa o P1, mas em: for (K = 0; K < 7; K++) { for (p0 = 0; p0 < 7; p0++) if (V[p0] > V[p0+1]) troca_posicao(); mostra_posicao(); } Você não incrementa ele, tente algo do tipo: for (K = 0; K < 7; K++) { for (p0 = 0; p0 < 7; p0++) { if (V[p0] > V[p0+1]) troca_posicao(); p1++; // <<-- Incrementa o P1 } p1 = 1; // <<-- Inicializa o P1 com 1 novamente mostra_posicao(); } DICA: Carregue o PROTEUS com o arquivo .cof e em vez do .hex, aperte o pause para debugar... Daí vá fazendo o passo a passo (Step Over, Step Into) e olhando o que acontece com as variáveis K, G, P0, P1 e V[8]. õ/
  14. É... Ai fica osso, não sei coisa alguma de JAVA... E é perigoso você viu as fotos que o Isadora postou?? HAHAHAHAHAHAHAHAHAHAHA!!!!!
  15. Cara, você já ouviu falar do labVIEW (Os Os Mythbusters já usou ele)? Ele usa linguagem gráfica assim fica bem simples usá-lo. Dá uma olhada e vê o que você acha dele, se gostar... Off.: Conheço/Conheci o cara do vídeo que você postou, HEHE!
  16. Bacana, já deu para aprender um monte com esse projeto seu @aphawk
  17. Ou então você pode usar um PCA9685... Como a Adafruit vende uma plaquinha com o CI provavelmente eles também disponibilizam uma biblioteca para o Arduíno.
  18. A única coisa que posso pensar agora é o MCLR, você desabilitou ele? As páginas 39 e 41 do datasheet fala sobre o CMCON e como desligar o modulo comparador Agora que eu vi, o @Isadora Ferraz já tinha dado a solução HUAhuahuaHU inclusive para esta (FUSES).
  19. EDIT: @Ramiro Peralta Saquei cara... O PIC16F676 é inicializado (POR / BOR / BOD) com as portas analógicas e comparador ativado, assim é preciso desativá-los (o CCS C faz isso sozinho o MikroC e o MPLAB XC8 não) void main() { ANSEL = 0b00000000; // DESLIGA AS PORTAS ANALOGICAS =D CMCON = 0b00000111; // DESLIGA O COMPARADOR =) TRISA = 0b111111; TRISC = 0b000000; // PORTA = 0b000000; PORTC = 0b000000; while(1){ if(RA0_bit == 1){ RC5_bit = 1; } }} falou! õ/
  20. fiz um teste aqui... Usando o mikroC o código não funciona, deixei todos os fuses "Disabled" somente o master clear "Enabled". Usando o CCS o código funcionou normalmente então >>APARENTEMENTE/TALVEL/EUACHO<< o problema não é o PROTEUS... Código CCS: #include <16F676.h>#device ADC=10 #FUSES NOPUT //No Power Up Timer#FUSES MCLR //Master Clear pin enabled#FUSES NOBROWNOUT //No brownout reset#FUSES NOPROTECT //Code not protected from reading#FUSES NOCPD //No EE protection #use delay(internal=4MHz)#include <PIC16F676_registers.h> #bit LED = MCU_PORTC.5#bit botao = MCU_PORTA.0 void main() { MCU_TRISA = 0b111111; MCU_TRISC = 0b000000; MCU_PORTC = 0b00000000; while(1) { if(botao == 1) { LED = 1; } }} Nos dois circuitos usei "Logic state" e "Logic probe" para facilitar. Dei uma olhada no ASM gerado pelo MikroC (depois de ter alterado um pouco o seu código) e me pareceu tudo OK mas nada de funcionar ... Faz um teste com o circuito na prática... õ/
  21. Na aba projects (dentro do MPLAB) clique com o direito na pasta do projeto / Selecione Properties / Selecione o XC8 global options / em Output file format escolha COFF. O cof será salvo na pasta diretório do projeto > dist > default > production No proteus quando você carregar o PIC com o .cof clique em pause e a janela do código aparecerá (talvez em branco) então você clica na setinha "step in" / "step over" o código aparecerá daí é só ir fazendo os testes =D... Se você clicar duas vezes em uma linha de código qualquer uma bolinha vermelha aparecerá (breakpoint) daí dando o play ou clicando no símbolo com o homenzinho correndo a simulação pausará quando o PIC for executar aquela linha (dá para economizar um tempinho). Meu MPLAB XC8 demora 15 segundos para compilar um código (bem pequeno) para o 18F4550 =(
  22. Edit1: Para ativar a interrupção do TMR0 o bit PEIE (Peripheral Interrupt Enable bit) também deve ser setado, ou não? Edit2: Não, não precisa =) if(PORTAbits.RA4 == 1) { INTCONbits.TMR0IE = 0; PORTAbits.RA0 = 1; PORTAbits.RA1 = 1; PORTAbits.RA2 = 1; PORTAbits.RA3 = 1; if(PORTAbits.RA6 == 1) //incrementa minuto { minuto = minuto + 1; converte_valor(); } } else { INTCONbits.TMR0IE = 1; if (estouro == 15) { //contador do estouro. a cada 15 estouros temos 1 segundo led_seg = ~led_seg; //inverte estado do led segundo++; //incrementa segundos estouro = 0; //zera valor do estouro converte_valor(); if(segundo == 60) { minuto++; //incrementa minuto segundo = 0; //zera segundo converte_valor(); if (minuto == 60) { hora++; //incrementa horas minuto = 0; //zera minuto converte_valor(); if(hora == 24) { hora = 0; //zera hora } } } } } Se o pino RA4 e o RA6 estiverem em nível alto o PIC incrementa a variável minuto porém o incremento não é mostrado no display pois a interrupção está desativada e é lá que a atualização do display é feita; if(PORTAbits.RA4 == 1) { INTCONbits.TMR0IE = 0; o else também não é executado então o PIC incrementa a variável minuto fazendo com que ela passe de 60. Considerando que há botão conectado ao pino RA6, ao apertá-lo a variável minuto incrementará muitas vezes... os displays estão sendo multiplexados no tempo (eu acho xD) então não é possível você ligar todos eles no mesmo instante. //Todos os displays acesos PORTAbits.RA0 = 1; PORTAbits.RA1 = 1; PORTAbits.RA2 = 1; PORTAbits.RA3 = 1; Se você estiver usando o Proteus carregue o pic com o arquivo .cof e em vez de apertar play aperte pause e faça o passo a passo do código... Assim fica mais fácil encontrar erros.
  23. Já foi marcado como resolvido mas vou postar assim mesmo HEHE! Mestre @aphawk o PICKIT 2 também possui o in-circuit debugger... A diferença entre os dois é que o PICKIT 2 não suporta os chips mais novos com os PIC32MZ, ele foi descontinuado pela Microchip. Dê preferência a um PICKIT 3 original, a maioria dos PICKIT 2 falsificados (não sei se isso acontece com o 3) fornecem apenas 5V assim você não poderá gravar chips que operem com 3.3V, até poderá, mas usando "arranjos técnicos" =D. A Microchip não cobra frete para ferramentas de desenvolvimento e se você for estudante ainda conseguirá um desconto de 25%. http://www.microchipdirect.com/ProductSearch.aspx?Keywords=PG164130

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!