Forum: Mikrocontroller und Digitale Elektronik Arduino 74HC165 Code


von Nicolas L. (nicolas_l41)


Lesenswert?

Kann mal jemand bitte über den Code schauen ob Fehler vorhanden sind ?
Er soll alle Pins des Ausgangsregisters Einschalten
1
int SER_Pin = A5;   //pin 14 on the 75HC595
2
int RCLK_Pin = A4;  //pin 12 on the 75HC595
3
int SRCLK_Pin = A3; //pin 11 on the 75HC595
4
5
//How many of the shift registers - change this
6
#define number_of_74hc595s 2 
7
8
//do not touch
9
#define numOfRegisterPins number_of_74hc595s * 8
10
11
boolean registers[numOfRegisterPins];
12
13
void setup(){
14
  pinMode(SER_Pin, OUTPUT);
15
  pinMode(RCLK_Pin, OUTPUT);
16
  pinMode(SRCLK_Pin, OUTPUT);
17
18
  //reset all register pins
19
  clearRegisters();
20
  writeRegisters();
21
}               
22
23
//set all register pins to LOW
24
void clearRegisters(){
25
  for(int i = numOfRegisterPins - 1; i >=  0; i--){
26
     registers[i] = LOW;
27
  }
28
} 
29
30
//Set and display registers
31
//Only call AFTER all values are set how you would like (slow otherwise)
32
void writeRegisters(){
33
34
  digitalWrite(RCLK_Pin, LOW);
35
36
  for(int i = numOfRegisterPins - 1; i >=  0; i--){
37
    digitalWrite(SRCLK_Pin, LOW);
38
39
    int val = registers[i];
40
41
    digitalWrite(SER_Pin, val);
42
    digitalWrite(SRCLK_Pin, HIGH);
43
44
  }
45
  digitalWrite(RCLK_Pin, HIGH);
46
47
}
48
49
//set an individual pin HIGH or LOW
50
void setRegisterPin(int index, int value){
51
  registers[index] = value;
52
}
53
54
void loop(){
55
56
  setRegisterPin(0, HIGH);
57
  setRegisterPin(1, HIGH);
58
  setRegisterPin(4, HIGH);
59
  setRegisterPin(5, HIGH);
60
  setRegisterPin(7, HIGH);
61
  setRegisterPin(8, HIGH);
62
  setRegisterPin(9, HIGH);
63
  setRegisterPin(10, HIGH);
64
  setRegisterPin(11, HIGH);  
65
  setRegisterPin(12, HIGH);
66
  setRegisterPin(13, HIGH);
67
  setRegisterPin(14, HIGH);
68
  setRegisterPin(15, HIGH);
69
70
71
72
  writeRegisters();  //MUST BE CALLED TO DISPLAY CHANGES
73
  //Only call once after the values are set how you need.
74
}


Danke, Nico

: Verschoben durch User
von Wolfgang M. (procrash)


Lesenswert?

Was willst du denn genau machen. Hab zufälligerweise letztens auch mit 
nem 74HC165 rumgespielt und bei mir geht alle einwandfrei...

von holger (Gast)


Lesenswert?

>Kann mal jemand bitte über den Code schauen ob Fehler vorhanden sind ?

Was geht denn nicht?

von A.H. (Gast)


Lesenswert?

Was nicht stimmt:

> "Arduino 74HC165 Code"

Das ist ein PISO.

Code: 75HC595

Das ist ein SIPO.

Außerdem:
1
#define number_of_74hc595s 2

aber im Text:

>...des Ausgangsregisters...

Bei so wenigen Infos über die Beschaltung verdächtigt man halt gleich 
das Offensichtliche. :-)

von Nicolas L. (nicolas_l41)


Lesenswert?

Das Register funktioniert nicht.
Am 1. Register sind alle Ausgänge immer auf LOW
Am 2. Register sind alle Ausgänge immer auf HIGH
egal was ich Einprogrammiere

@A.H.: Fehler meinerseits, es sind natürlich 2 Register

Geplant ist ein Aquariencomputer und über diese Register soll die 
Nachtbeleuchtung (LEDs) gesteuert werden.

von Karl H. (kbuchegg)


Lesenswert?

> int SER_Pin = A5;

Bist du sicher, dass man am Arduino die Pins so addressiert?

Ansonsten: Verlangsame das Ganze halt mal ordentlich, hänge ein paar LED 
zusätzlich an die Ausgänge an und sieh dir damit an, wie, was und in 
welcher Reihenfolge dein Programm die Ausgansgpins schaltet. Sagt ja 
keiner, dass du bei deinen ersten Versuchen gleich volle Pulle auf die 
SR ausgeben musst.

von Nicolas L. (nicolas_l41)


Lesenswert?

Karl Heinz Buchegger schrieb:
>> int SER_Pin = A5;
>
> Bist du sicher, dass man am Arduino die Pins so addressiert?
>
> Ansonsten: Verlangsame das Ganze halt mal ordentlich, hänge ein paar LED
> zusätzlich an die Ausgänge an und sieh dir damit an, wie, was und in
> welcher Reihenfolge dein Programm die Ausgansgpins schaltet. Sagt ja
> keiner, dass du bei deinen ersten Versuchen gleich volle Pulle auf die
> SR ausgeben musst.

Ja die Register möchte ich ja mit den Analogen Pins ansteuern, da die 
digitalen bereits belegt sind. Beim 74hc164 den ich als Eingangsregister 
verwende funktioiert das ganze auch auf diese weise.

von Karl H. (kbuchegg)


Lesenswert?

Nicolas L. schrieb:
> Karl Heinz Buchegger schrieb:
>>> int SER_Pin = A5;
>>
>> Bist du sicher, dass man am Arduino die Pins so addressiert?
>>
>> Ansonsten: Verlangsame das Ganze halt mal ordentlich, hänge ein paar LED
>> zusätzlich an die Ausgänge an und sieh dir damit an, wie, was und in
>> welcher Reihenfolge dein Programm die Ausgansgpins schaltet. Sagt ja
>> keiner, dass du bei deinen ersten Versuchen gleich volle Pulle auf die
>> SR ausgeben musst.
>
> Ja die Register möchte ich ja mit den Analogen Pins ansteuern, da die
> digitalen bereits belegt sind.

Ja, macht ja nix. Deswegen kannst du ja trotzdem ein paar LED anhängen, 
mit denen du visualisierst, was dein Code mit den Pins macht.

von Peter D. (peda)


Lesenswert?

Nicolas L. schrieb:
> Das Register funktioniert nicht.

Naja, wir wissen ja nicht, was Du wann aufrufst.
Ist es zuviel verlangt, eine Mainloop zu posten?

Fehler fallen mir nicht auf. Was sagt denn der Simulator dazu?

Das ganze ist auch ein rechtes SRAM-Grab.
Du verwendest int (signed 16Bit), wo unsigned char ausreichen würde.
Und boolean ist ein char, d.h. nicht 16 Bit (2Byte), sondern 16 Byte.
C kann nämlich nicht indiziert Bits adressieren.

Du definierst daher 22 Byte, wo 2 Byte völlig ausreichend sind (1000% 
Verschwendung).


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.