Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Fabio Munhoz

É possível interligar o Arduino com o pic 18f4520, de modo simples?

Recommended Posts

Boa tarde, gostaria de saber se é possível, e se alguém sabe como ligar o Arduino no pic, por exemplo com programações totalmente diferentes, mas usar uma porta do Arduino como saída pra ligar em uma de entrada do pic, as duas digitais mesmo, 0 ou 1. Ja testei desse modo com leds apenas para testar e não rolou, estou usando o mikroc pro para programar o pic, e no programa estava algo do tipo:

if ( PORTB.RB5 ==  1) {

PORTB.RB4 = 1;
}

ELSE {
POTB.RB4 = 0;
}

 

Obrigado, e desculpe a ignorância.

 

Editado por DiF
Botão CODE <>

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Fabio Munhoz ,

 

Sim, é possível, e é bem fácil. Infelizmente não sei como fazer isso na linguagem do Arduino, e nem na do Pic para te mostrar, mas logo algum  outro colega do Fórum pode te ajudar.

 

voce pode ligar da maneira que você citou, tipo interligando uma porta de cada um deles, e assim pode trocar 8 bits de informação de uma vez entre eles, ou pode apenas utilizar os pinos de uma interface serial de cada um deles e fazer a conexão TX-RX entre eles, assim com apenas 2 pinos voce pode ter uma comunicação serial eficaz.

 

Paulo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue um exemplo, aqui o PIC soma uma variável a cada segundo, e a cada soma manda o valor para o Arduíno que então imprimi o valor recebido no monitor serial. A comunicação é via I2C pois assim a serial fica livre para debugs... Download.

 

Conexão:

PIC SCL -------- ARDUINO SCL
PIC SDA -------- ARDUINO SDA

Com resistores de Pull Up (2k2 a 10k) em ambas as linhas conforme imagem abaixo.

 

Código do PIC (MikroC PRO for PIC):

// HS crystal externo 8MHz

 unsigned char Valor = 0;
 
void main() {
  delay_ms(500);      // Delay 0,5 segundo espera o Arduino se estabilizar.
  TRISB.RB0 = 0;      // set direction to be output

  I2C1_Init(100000);  // Inicializa i2c com o clock de 100KHz
  
  while(1) {
    latb.RB0 ^= 1;    // Muda o estado do pino B0 (toggle)

    // Enviado dados para o AVR
    I2C1_Start();     // Inicia a comunicação I2C
    I2C1_Wr(0x58);    // Envia o endereço I2C do Arduino
    I2C1_Wr(Valor);   // Envia a variável valor para o Arduino
    I2C1_Stop();      // Aqui o AVR irá para a função de recebimento de bytes
  
    Valor += 1;       // Incrementa 1 à variável valor
    
    if(Valor > 254)   // Zera a variável quando ela alcançar 255
      valor = 0;
      
    delay_ms(500);    // Delay 0,5 segundo
  }
}

 

Código do Arduíno:

#include <Wire.h>

int LedPin = 13;                       // BuiltIn Led na placa do Arduino
byte ByteRecebido;

// Essa variável possui a quantidade de bytes a serem enviados pelo PIC
volatile int QuantidadeBytesEsperados = 1;

void setup() {
  pinMode(LedPin, OUTPUT);
  
  Serial.begin(9600);                   // Inicia a comunicação serial com velocidade de 9600
  Serial.println("Testando comunicacao entre Arduino e PIC");
  
  Wire.begin(0x2C);                     // Inicia a comunicação I2C como escravo de endereço 0x2C (0010 1100) -> O Arduino desconsidera o bit de leitura ou escrita  
                                        // Mas o MikroC não, assim no MikroC deve ser usado 0x58 (0101 100X) onde X é o bit de leitura ou escrita
                                        // Escrita = 0 (0x58)| Leitura = 1 (0x59)
                                        
  Wire.setClock(100000);                // I2C 100KHz
  Wire.onReceive(receiveEvent);         // Função a ser executada quanto "QuantidadeBytesEsperados" bytes é enviado pelo mestre
}

void loop() {
  digitalWrite(LedPin, HIGH);           // Pino digital 13 do Arduino em nível lógico alto
  delay(500);                           // Delay 0,5 segundo
  digitalWrite(LedPin, LOW);            // Pino digital 13 do Arduino em nível lógico baixo
  delay(500);                           // Delay 0,5 segundo
}

void receiveEvent(int QuantidadeBytesEsperados) {
  ByteRecebido = Wire.read();           // Pega o valor enviado pelo PIC
  
  Serial.print("Valor recebido: ");     // Imprimi o valor recebido na serial 
  Serial.println(ByteRecebido);  
}

 

B8hqlRs.png

 

 

Editado por test man*~
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teoricamente daria para colocar um código simples de acender led em um arduino e um codigo de verificar se o botao foi apertado em um pic. Sendo que a saída do "led" do arduino em vez de ir para o led iria para porta que está configurada como entrada do pic assim retirando o "botão" que seria colocada nessa port... Isso seria um comunicação simples de zeros e uns... tipo se tiver ligado ou desligado (5V), sem protocolos de comunicação especiais ou coisa do tipo.

 

Ia fazer uma simulação aqui mais verifiquei que meus conhecimentos em pic aplicados para o Proteus estão na *****... por isso fico devendo essa T_T Funciona no arduino, mas no pic nao rola o if que coloco na programação. O bagulho pisca, mas a lógicas nao está funcionando com ou sem outro componente... vai entender... Ainda aprendendo T_T

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exemplo básico no Proteus... ignorando estruturas basicas como cristal do pic ... e alimentação...

596aa331076d4_zeroseu.thumb.PNG.072045eb81433137b669978f530df612.PNG

 

Arduino

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(2, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);                      // wait for a second
  digitalWrite(2, LOW);    // turn the LED off by making the voltage LOW
  delay(100);
  digitalWrite(3,HIGH);
  delay(100);
  digitalWrite(3,LOW);
  // wait for a second
}

No pic

void main()
{
  TRISB=0b00000001;
  //TRISB.f0=1;
  ADCON1 = 0x0F;
  PORTB=0X00;
  


  while(1)
   {
    if (PORTB.RB0==1) {
    PORTB.RB2=1;
    delay_ms(1000);
    PORTB.RB2=0;
    delay_ms(1000);
    }
   
   PORTB.RB4=1;
   delay_ms(40);
   PORTB.RB4=0;
   delay_ms(40);
    
   }
}

A porcaria do PIC não estava funcionando no Proteus porque a porta RB pode ser definida como digital ou analógica com o adcon1 você define como digital aí você pode usar a função de if.

 

Um exemplo simples e tosco ^^ mas está ai.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

4

Em 14/07/2017 às 14:29, Fabio Munhoz disse:

ligar em uma de entrada do pic, as duas digitais mesmo, 0 ou 1

As ideias dos amigos são válidas, mas que tal começar pelo início do princípio? Minimalisticamente:
 

main()
{
TRISB5=1;
TRISB4=0;
for (;;) (RB4=RB5)
}

Um led em RB4 vai espelhar o que você colocar na sua saída do arduíno que deve estar ligada em RB5. Óbvio d+?

Ah sim... consulte o datasheet sobre RB4. Ele pode 'especial'...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×