Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

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.

 

Link para o comentário
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

Link para o comentário
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

 

 

  • Curtir 1
Link para o comentário
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

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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'...

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...