collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Ajuda com shift register 74HC595!  (Lida 3183 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline m2snd

  • Mini Robot
  • *
  • Mensagens: 65
Ajuda com shift register 74HC595!
« em: 29 de Novembro de 2011, 22:50 »
Olá !!
Alguém me pode dar uma ajuda com o código abaixo? Quando chamo a função MorningAlarm(),
Código: [Seleccione]
// functions to be called when an alarm triggers:
void MorningAlarm(){
Serial.println("Alarm: - sob estores");
setRegisterPin(0, HIGH);
writeRegisters();
digitalWrite(Pin3, HIGH);
}
o setRegisterPin(0, HIGH), não entra em high enquanto que o digitalWrite(Pin3, HIGH); entra?

o código:
Código: [Seleccione]
Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver

  setTime(8,29,0,1,1,11); // set time to Saturday 8:29:00am Jan 1 2011
  // create the alarms
  Alarm.alarmRepeat(8,29,2, MorningAlarm);  // 8:30am every day
  Alarm.alarmRepeat(8,29,7, EveningAlarm);  // 5:45pm every day
  Alarm.alarmRepeat(dowSaturday,8,30,30,WeeklyAlarm);  // 8:30:30 every Saturday

  Alarm.timerRepeat(15, Repeats);            // timer for every 15 seconds   
  Alarm.timerOnce(10, OnceOnly);

  //reset all register pins
  clearRegisters();
  writeRegisters();
}               


//set all register pins to LOW
void clearRegisters(){
  for(int i = numOfRegisterPins - 1; i >=  0; i--){
    registers[i] = LOW;
  }
}

//Set and display registers
//Only call AFTER all values are set how you would like (slow otherwise)
void writeRegisters(){

  digitalWrite(RCLK_Pin, LOW);
  for(int i = numOfRegisterPins - 1; i >=  0; i--){
    digitalWrite(SRCLK_Pin, LOW);
    int val = registers[i];
    digitalWrite(SER_Pin, val);
    digitalWrite(SRCLK_Pin, HIGH);
  }
  digitalWrite(RCLK_Pin, HIGH);
}
//set an individual pin HIGH or LOW
void setRegisterPin(int index, int value){
  registers[index] = value;
}

void loop(){
  //le codigo infrared
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  } 
  digitalClockDisplay();
  Alarm.delay(1000); // wait one second between clock display

  //-----------------------------------------------------------------cozinha-----------------------------------------------------------

  //inicio do código COZINHA subir
  if ((results.value) == 0xE0E020DF){
    setRegisterPin(1, LOW); //desliga descida
    setRegisterPin(0, HIGH); //<<<<<<activa subida 
    writeRegisters();
    fimTempoRele0 = millis() + 15000;

  }
  if ((millis ()> fimTempoRele0) || ((results.value) == 0xE0E0D12E))
  {
    setRegisterPin(0, LOW); //<<<<<<<desliga subida

    writeRegisters();
  }
  //descer------ cozinha
  if ((results.value) == 0xE0E010EF){
    setRegisterPin(0, LOW); //<<<<<<<desliga rele de subir
    setRegisterPin(1, HIGH);   // liga relé de descer<--------
    writeRegisters();
    fimTempoRele1 = millis() + 15000;
  }
  if (( millis () > fimTempoRele1) || ((results.value) == 0xE0E0D12E))
  {
    setRegisterPin(1, LOW);
    writeRegisters();   
  }
  //-------------------------------------------------------------sala de jantar
  //subir
  if ((results.value) == 0xE0E0A05F){
    setRegisterPin(3, LOW); //desliga descida
    setRegisterPin(2, HIGH); //<<<<<<activa subida
    writeRegisters();
    fimTempoRele2 = millis() + 28000;

  }
  if ((millis ()> fimTempoRele2) || ((results.value) == 0xE0E0D12E))
  {
    setRegisterPin(2, LOW); //<<<<<<<desliga subida
    writeRegisters();
  }
  //descer------ jantar

  if ((results.value) == 0xE0E0906F){
    setRegisterPin(2, LOW); //<<<<<<<desliga rele de subir
    setRegisterPin(3, HIGH);   // liga relé de descer
    writeRegisters();
    fimTempoRele3 = millis() + 28000;
  }
  if ((millis () > fimTempoRele3) || ((results.value) == 0xE0E0D12E))
  {
    setRegisterPin(3, LOW);
    writeRegisters();
  }

  //-------------------------------------------------------------sala de estar
  //subir
  if ((results.value) == 0xE0E0609F){
    setRegisterPin(5, LOW); //desliga descida
    setRegisterPin(4, HIGH); //<<<<<<activa subida 
    writeRegisters();
    fimTempoRele4 = millis() + 28000;
  }
  if ((millis ()> fimTempoRele4) || ((results.value) == 0xE0E0D12E))
  {
    setRegisterPin(4, LOW); //<<<<<<<desliga subida
    writeRegisters();
  }
  //descer------
  if ((results.value) == 0xE0E050AF){
    setRegisterPin(4, LOW); //<<<<<<<desliga rele de subir
    setRegisterPin(5, HIGH);   // liga relé de descer
    writeRegisters();
    fimTempoRele5 = millis() + 28000;
  }
  if ((millis () > fimTempoRele5) || ((results.value) == 0xE0E0D12E))
  {
    setRegisterPin(5, LOW);
    writeRegisters();
  }

  //-------------------------------inicio quarto-Q1
  //subir

  if ((results.value) == 0xE0E030CF){
    setRegisterPin(7, LOW); //desliga descida
    setRegisterPin(6, HIGH); //<<<<<<activa subida 
    writeRegisters();
    fimTempoRele6 = millis() + 28000;
  }
  if ((millis ()> fimTempoRele6) || ((results.value) == 0xE0E0D12E))
  {
    setRegisterPin(6, LOW); //<<<<<<<desliga subida
    writeRegisters();
  }
  //descer------ Q1
  if ((results.value) == 0xE0E0D629){
    setRegisterPin(6, LOW); //<<<<<<<desliga rele de subir
    setRegisterPin(7, HIGH);   // liga relé de descer<----------------------
    writeRegisters();
    fimTempoRele7 = millis() + 28000;
  }
  if ((millis () > fimTempoRele7) || ((results.value) == 0xE0E0D12E))
  {
    setRegisterPin(7, LOW);
    writeRegisters();
  }

  //----------------------------------------------------------------------------------inicio quato 2
  //subir
  if ((results.value) == 0xE0E0B04F){
    digitalWrite(Pin7, LOW); //desliga descida
    digitalWrite(Pin6, HIGH); //<<<<<<activa subida 
    fimTempoRele8 = millis() + 28000;
  }
  if ((millis ()> fimTempoRele8) || ((results.value) == 0xE0E0D12E))
  {
    digitalWrite(Pin6, LOW); //desliga descida
  }
  //descer------ Q1
  if ((results.value) == 0xE0E08877){
    digitalWrite(Pin6,LOW);
    digitalWrite(Pin7, HIGH);   // liga relé de descer<----------------------
    fimTempoRele9 = millis() + 28000;
  }
  if ((millis () > fimTempoRele9) || ((results.value) == 0xE0E0D12E))
  {
    digitalWrite(Pin7, LOW);
  }
  //----------------------------------------------------------inicio quarto 3
  //subir
  if ((results.value) == 0xE0E0708F){
    digitalWrite(Pin4, LOW); //desliga descida
    digitalWrite(Pin5, HIGH); //<<<<<<activa subida 
    fimTempoRele10 = millis() + 28000;
  }
  if ((millis ()> fimTempoRele10) || ((results.value) == 0xE0E0D12E))
  {
    digitalWrite(Pin5, LOW); //desliga descida
  }
  //descer------ Q3
  if ((results.value) == 0xE0E0807F){
    digitalWrite(Pin5,LOW);
    digitalWrite(Pin4, HIGH);   // liga relé de descer<----------------------
    fimTempoRele11 = millis() + 28000;
  }
  if ((millis () > fimTempoRele11) || ((results.value) == 0xE0E0D12E))
  {
    digitalWrite(Pin4, LOW);
  }


}//end do loop


// functions to be called when an alarm triggers:
void MorningAlarm(){
  Serial.println("Alarm: - sob estores");     
  setRegisterPin(0, HIGH);
  writeRegisters();
  digitalWrite(Pin3, HIGH);
}

void EveningAlarm(){
  Serial.println("Alarm: - desce estores");

}
void WeeklyAlarm(){
  Serial.println("Alarm: - its Monday Morning");     
}

void ExplicitAlarm(){
  Serial.println("Alarm: - this triggers only at the given date and time");       
}

void Repeats(){
  Serial.println("15 second timer");         
}

void OnceOnly(){
  Serial.println("This timer only triggers once"); 
}

void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println();
}

void printDigits(int digits)
{
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Ajuda com shift register 74HC595!
« Responder #1 em: 30 de Novembro de 2011, 00:00 »
E só acontece nesse caso especifico?
Avr fanboy

Offline m2snd

  • Mini Robot
  • *
  • Mensagens: 65
Re: Ajuda com shift register 74HC595!
« Responder #2 em: 30 de Novembro de 2011, 02:27 »
Sim só...quando chamo o setRegisterPin(0,HIGH) noutros partes do código, por exemplo ao inicio, ele responde.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Ajuda com shift register t!
« Responder #3 em: 30 de Novembro de 2011, 14:18 »
Tens que explicar melhor isso, remover as partes de código que não interessam para o problema e colocar aí as que faltam (como a configuração dos pinos ou onde é que está definido o numOfRegisterPins). O que é que o digitalWrite(Pin3, HIGH) tem a ver com o SetRegisterPin()?? Um é um pino do Arduino e o outro é um pino no registo.

...

Ok, já percebi o teu problema. Mas assim à partida não vejo nada de mal, assumindo que está tudo bem ligado com o hw e que as definições e configuração dos pinos que não mostras também estão bem. Faz um teste simples, um sketch só com um teste para escrever valores para o registo.

Offline m2snd

  • Mini Robot
  • *
  • Mensagens: 65
Re: Ajuda com shift register 74HC595!
« Responder #4 em: 30 de Novembro de 2011, 18:02 »
OK, a parte do código que falta é esta.
Código: [Seleccione]
//infrared
#include <IRremote.h>
#include <Time.h>
#include <TimeAlarms.h>

int SER_Pin = 8;   //pin 14 on the 75HC595
int RCLK_Pin = 9;  //pin 12 on the 75HC595
int SRCLK_Pin = 10; //pin 11 on the 75HC595
int Pin7 = 7;
int Pin6 = 6;
int Pin5 = 5;
int Pin4 = 4;
int Pin3 = 3;
int Pin13 = 13;
int Pin2 = 2;
//infrared
int RECV_PIN = 11; //ligacao do INFRARED [1ºOUT pin11] 2ºGND 3ºVCC
//comando metronico código 5064(samsung TNT)
IRrecv irrecv(RECV_PIN);
decode_results results;


long fimTempoRele0;
long fimTempoRele1;
long fimTempoRele2;
long fimTempoRele3;
long fimTempoRele4;
long fimTempoRele5;
long fimTempoRele6;
long fimTempoRele7;
long fimTempoRele8;
long fimTempoRele9;
long fimTempoRele10;
long fimTempoRele11;
long fimTempoRele12;
long fimTempoRele13;

//CREDITOS http://bildr.org/2011/02/74hc595
//How many of the shift registers - change this
#define number_of_74hc595s 1

//do not touch
#define numOfRegisterPins number_of_74hc595s * 8

boolean registers[numOfRegisterPins];

void setup(){
  pinMode(SER_Pin, OUTPUT);
  pinMode(RCLK_Pin, OUTPUT);
  pinMode(SRCLK_Pin, OUTPUT);
  pinMode(Pin7, OUTPUT);
  pinMode(Pin6, OUTPUT);
  pinMode(Pin5, OUTPUT);
  pinMode(Pin4, OUTPUT);
  pinMode(Pin13, OUTPUT);
  pinMode(Pin2, OUTPUT);
  pinMode(Pin3, OUTPUT);
  pinMode(Pin4, OUTPUT);
  Serial.begin(9600);

Isto é parte de um código que tirei daqui http://bildr.org/2011/02/74hc595, para controlar os estores com comando remoto. Até aqui tudo bem porque tenho estado a utilizar com o remoto e funciona perfeitamente. Chamo qualquer um dos registo com o comando, eles todos funcionam, inclusivamente aqui nesta parte:
Código: [Seleccione]
//inicio do código COZINHA subir
  if ((results.value) == 0xE0E020DF){
    setRegisterPin(1, LOW); //desliga descida
    setRegisterPin(0, HIGH); //<<<<<<activa subida
    writeRegisters();
    fimTempoRele0 = millis() + 15000;

  }
Mais tarde lembrei-me de automatizar de forma a que a determinadas horas, os estores subam ou desçam. Para isso introduzi o TimeAlarme library para o efeito.

Acontece que na parte do código do TimeAlarme library, quando chamo a função para activar os pinos,
Código: [Seleccione]
// functions to be called when an alarm triggers:
void MorningAlarm(){
Serial.println("Alarm: - sob estores");
setRegisterPin(0, HIGH);
writeRegisters();
digitalWrite(Pin3, HIGH);
}

qualquer um dos pinos do registo dentro desta função não funcionam. Apenas piscam uma vez e permanecem desligados. o digitalWritePin3() é apenas para despiste. Este funciona e permanece ligado até ao final do millis().


Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Ajuda com shift register 74HC595!
« Responder #5 em: 01 de Dezembro de 2011, 02:25 »
Isso é uma interrupção?
Experimenta declarar o array onde guardas o estado das saidas como volatile e tenta outra vez, quase de certeza que é isso.
Avr fanboy