Ein herzliches Hallo an alle und einen guten Start in die neue Woche,
@Franz-Peter
Zitat von MicroBahner
Nachteil des ShiftOut ist halt, dass es nur immer einzelne Bytes schieben kann. Die SPI-Library erlaubt auch ein ganzes Array in einem Rutsch rauszuschieben. Ausserdem ist SPI viel schneller. In der Zeit, in der ShiftOut ein einziges Bit! schiebt, sind über SPI bei vollem Tempo seine ganzen 96 Bits draussen.
Vielen Dank für die Erläuterung
Zitat von MicroBahner
Allerdings erwartet SPI beim gleichzeitigen raus- und reinschieben eben gleich viele Bits fürs Empfangen wie fürs Senden. Das ist hier ja nicht gegeben, da müsste man 'dummy-Register' einbauen oder auf 2x schieben, was ja auch nicht so toll ist .
Die von dir erwähnten dummy-Register brauche ich die auch wenn ich über SPI nur sende?
[code="MicroBahner"]es gibt viele Wege.....[/code]
Das merke ich langsam auch das es komplizierter wird als ich dachte, aber ich hab ja Zeit es muss nicht sofort fertig sein und wird es wohl auch nicht.
@Günther
Zitat von mgcss
Die Programmierung mit ShiftOut ist super einfach - allerdings braucht man dann noch die Funktionen zum setzen und Löschen einzelner Bits (bitSet() und bitClear() ). Als Variablen zum Speichern der Werte nimmst Du in dem Fall also statt des Bit-Arrays ganze Byte Werte und setzt die einzelnen Bits mit bitSet() und bitClear(). Anschließend werden die Bytes dann mit shiftOut ins Schieberegister geschrieben.
Könntest du mir erklären was du meinst mit ganzen Byte werten anstelle von dem Bit-Array :
Ich glaube deswegen wird auch an meinem Code (Siehe unten) vom Kompiler gemeckert(siehe weiter unten).
Dein Link hat mir sehr geholfen insbesondere das Code Beispiel. Ich finde es einfacher neue (für mich neu) Befehle (ist das der richtige Begriff für Shiftout etc?) anhand eines Beispiels zu lernen und zu verstehen, davon gerne mehr wenn du noch Nützliche Links hast.
Nach einem stressigen Wochenende (Freundin hatte frei, Gartenarbeit und die Leber wollte auch mal wieder belastet werden ) bin ich in der letzten Stunde dazu gekommen einen Code zu schreiben bei dem der Kompiler meckert leider bisher ohne der ISP schnittstelle, die sich sehr interessant anhört
Zitat von MicroBahner
Nachteil des ShiftOut ist halt, dass es nur immer einzelne Bytes schieben kann. Die SPI-Library erlaubt auch ein ganzes Array in einem Rutsch rauszuschieben. Ausserdem ist SPI viel schneller. In der Zeit, in der ShiftOut ein einziges Bit! schiebt, sind über SPI bei vollem Tempo seine ganzen 96 Bits draussen.
@Bodo
Vielen Dankk für das posten deines Codes. Er sieht interessant aus und so ganz anders wie meiner. Naja deiner Funktionert und meiner noch nicht :/
Eine Frage habe ich aber dazu in der loop, wird durch
Zitat von Bodo
potVal_0 = analogRead(potPin_0);
ein Wert zwischen 0 und 255 als potVal_0 bezeichnet, der dann später
Zitat von Bodo
shiftVal_A = SegmentAnzeige(potVal_0);
irgendwas mit der Segmentanzeige macht und als shiftVal_A umbenannt wird. Dieses shiftVal_A wird dann später an die Schieberegister übergeben. Wir verhält sich währenddessen der eingelesene Wert von dem Poti, weil der ja zwischen 0 und 255 liegen kann und die 0 entspricht einem LOW also Segmentanzeige zeigt nichts an und 1=HIGH die Segementanzeige zeigt etwas an was ist mit den Werten >1, also einer 128 oder einer 12?
Vielleicht ein dämliche Frage, aber mit Potis habe ich bisher nichts gemacht.
Deiner Website gefällt mir sehr gut, werde ich mir nach dem schlafen mal genauers ansehen.
@Uli
Zitat von spielbahn
ordentlicher Drahtverhau...
Das will ich gerade vermeiden zu produzieren und dann an meiner Modellbahn zu haben. Aber wenn du Lust und die Zeit hast kannst du es mir bitte erläutern wie die alternative aussehen könnte :
[quote="spielbahn]Wäre es da nicht sinnvoller, über Digitalisierung nachzudenken?[/quote]
Ich weiß nicht ob das vom Verdratungsaufwand weniger ist wie ein Arduino mit Schieberegistern auf Leiterplatten die ich mir von einem Kumpel fräsen lassen werde. Und vom Kostenpunkt betrachtet hatte mich die Digitalisierung bisher eher abgeschreckt wie begeistert :/ (http://www.conrad.de/ce/de/product/24855...0150927223730:s ein jeder dieser Decoder würde 4 Weichen steuern bedeutet ich würde Minimum 6 von diesen brauchen weil ich 24 Weichen habe. Folglich würden Kosten von über 140€ entstehen und ich hätte noch nichts mit dem ich die ansteuern kann, da finde ich die alternative mit dem Arduino momentan noch ansprechender.)
@Clemens
Diese Art der Verdrahtung ist für mich neu. Werde ich mir mal zum Merken aufschreiben.
@Alle
Vielen Dank für die vielen Kommentare in so kurzer Zeit.
Hoffentlich bleibt das so
Im Folgenden der Code:
Zu Begin die Definition des Arrays sowie der Ports des µC.
In void Loop wird in meinem Code jeder Taster nach einander abgefragt, wen einer der Taster gedrückt ist und erkannt wurde, wird durch bitWrite das jeweilige Bit im Array auf HIGH gesetzt.
In der Funktion Fuellenw wird mittels shiftout das Array in das Schieberegister verschoben (soweit die Theorie, hier meckert der Kompiler). Nach dem Füllen wird 250ms das HIGH im Schieberegister gelassen, damit der Weichenantrieb schalten kann, danach wird dieses wieder aus LOW gesetzt mittels der Funktion Leerenw. Die beiden digitalWrite mit LED1 und LED2 sind bitte vorerst zu Ignorieren sie dienen mir Gedanklich als Platzhalter für den Platz des zweiten Schieberegisters für die LED Rückmeldung.
(Falls nach der Datei verlangt wird werde ich sie Hochladen und zum download freigeben.)
[code]/* Peters Versuch Nummer 1
*
*/
//Muster für die Ausgabe
byte Arrayweiche[] = {0,0,0,0,0,0,0,0} ; //Variable geändert durch Taster von LOW auf HIGH
//byte ArrayLED[] = {0,0,0,0,0,0,0,0};
/*
* Arrayweiche von links betrachtet
* Stelle 1 = Weiche 1 Gerade aus
* Stelle 2 = Weiche 1 abbiegen
* Stelle 3 = Weiche 2 Gerade aus
* Stelle 4 = Weiche 2 abbiegen
* Stelle 5 = Weiche 3 Gerade aus
* Stelle 6 = Weiche 3 abbiegen
* Stelle 7 = Weiche 4 Gerade aus
* Stelle 8 = Weiche 4 abbiegen
*/
//Taster
int TST1=9; //Gerade aus Weiche 1
int TST2=10; //abbiegen von Weiche 1
//LED
int LED1=2; //Rueckmeldung 1 noch ohne Schieberegister
int LED2=3; //Rueckmeldung 2 noch ohne Schieberegister
//Schieberegister Weichenantrieb
int shiftPinw = 4; //Pin verbunden mit SH_CP des 74HC595 (clockpin)
int storePinw = 3; //Pin verbunden mit ST_CP des 74HC595 (latchpin)
int dataPinw = 2; //Pin verbunden mit DS des 74HC595 (datapin)
//Schieberegister LED Rückeldung
int shiftPinl = 7; //Pin verbunden mit SH_CP des 74HC595
int storePinl = 6; //Pin verbunden mit ST_CP des 74HC595
int dataPinl = 5; //Pin verbunden mit DS des 74HC595
void setup() {
//Taster definition mit internen Pull Up
//TST1
pinMode(TST1,INPUT);
digitalWrite(TST1,HIGH);
//TST2
pinMode(TST2,INPUT);
digitalWrite(TST2,HIGH);
//LED
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
//Schieberegister Weiche
pinMode(shiftPinw,OUTPUT);
pinMode(storePinw,OUTPUT);
pinMode(dataPinw,OUTPUT);
//Schieberegister LED
pinMode(shiftPinl,OUTPUT);
pinMode(storePinl,OUTPUT);
pinMode(dataPinl,OUTPUT);
}
void loop() {
//Taster 1 wird abgefragt und Funktion Taster 1 wird ausgeführt
if(!digitalRead(TST1)){
delay(50);
if(!digitalRead(TST1)){
bitWrite(Arrayweiche,7,HIGH); //Gerade aus von Weiche 1 auf HIGH Stellen, also bit 7, da von Links gezählt wird
Fuellenw(); // schreibt Variable in Schieberegister
delay(250); //Impuls zum schalten der Weiche
Leerenw(); // setzt alles auf LOW
digitalWrite(LED1,HIGH); //Rückmeldungs LED
digitalWrite(LED2,LOW); //Rückmeldungs LED
}
}
//Taster 2 wird abgefragt und Funktion Taster 2 wird ausgeführt
if(!digitalRead(TST2)){
delay(50);
if(!digitalRead(TST2)){
bitWrite(Arrayweiche,6,HIGH); //abbiegen von Weiche 1, also bit 6 da links gezählt
Fuellenw(); // schreibt Variable in Schieberegister
delay(250); //Impuls zum schalten der Weiche
Leerenw(); // setzt alles auf LOW
digitalWrite(LED1,LOW); //Rückmeldungs LED
digitalWrite(LED2,HIGH); //Rückmeldungs LED
}
}
//weitere Taster hier einfügen.
}
void Fuellenw() {
digitalWrite(storePinw,LOW);
shiftOut(dataPinw,shiftPinw,MSBFIRST,Arrayweiche); //shiftet von rechts nach links
digitalWrite(storePinw,HIGH);
}
void Leerenw() //setzt alles Variablen auf LOW, damit keine Dauerspannung an dem Weichenantrieb anliegt.
{
bitClear(Arrayweiche,0); //Setzt Bit 0 auf 0
bitClear(Arrayweiche,1);
bitClear(Arrayweiche,2);
bitClear(Arrayweiche,3);
bitClear(Arrayweiche,4);
bitClear(Arrayweiche,5);
bitClear(Arrayweiche,6);
bitClear(Arrayweiche,7);
digitalWrite(storePinw,LOW);
shiftOut(dataPinw,shiftPinw,MSBFIRST,Arrayweiche); //shiftet von rechts nach links
digitalWrite(storePinw,HIGH);
}
[/code]
Und das gemeckere vom Kompiler:
Vermutlich nur Anfänger Fehler oder irgendetwas total Falsch gemacht, hoffe Ihr könnt mich darauf hinweisen was es ist.
(Falls nach der Datei verlangt wird werde ich sie Hochladen und zum download freigeben.)
[code]Arduino: 1.6.5 (Windows 7), Platine: "Arduino/Genuino Uno"
In file included from _0_Programm_Modellbahn_Array.ino.ino:7:0:
_0_Programm_Modellbahn_Array.ino.ino: In function 'void loop()':
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:104:37: error: invalid operands of types 'byte [8] {aka unsigned char [8]}' and 'long unsigned int' to binary 'operator|'
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
^
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:106:52: note: in expansion of macro 'bitSet'
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
^
_0_Programm_Modellbahn_Array.ino.ino:73:6: note: in expansion of macro 'bitWrite'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:104:37: error: in evaluation of 'operator|=(byte [8] {aka unsigned char [8]}, long unsigned int)'
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
^
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:106:52: note: in expansion of macro 'bitSet'
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
^
_0_Programm_Modellbahn_Array.ino.ino:73:6: note: in expansion of macro 'bitWrite'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: invalid operands of types 'byte [8] {aka unsigned char [8]}' and 'long unsigned int' to binary 'operator&'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:106:73: note: in expansion of macro 'bitClear'
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
^
_0_Programm_Modellbahn_Array.ino.ino:73:6: note: in expansion of macro 'bitWrite'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: in evaluation of 'operator&=(byte [8] {aka unsigned char [8]}, long unsigned int)'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:106:73: note: in expansion of macro 'bitClear'
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
^
_0_Programm_Modellbahn_Array.ino.ino:73:6: note: in expansion of macro 'bitWrite'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:104:37: error: invalid operands of types 'byte [8] {aka unsigned char [8]}' and 'long unsigned int' to binary 'operator|'
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
^
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:106:52: note: in expansion of macro 'bitSet'
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
^
_0_Programm_Modellbahn_Array.ino.ino:87:5: note: in expansion of macro 'bitWrite'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:104:37: error: in evaluation of 'operator|=(byte [8] {aka unsigned char [8]}, long unsigned int)'
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
^
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:106:52: note: in expansion of macro 'bitSet'
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
^
_0_Programm_Modellbahn_Array.ino.ino:87:5: note: in expansion of macro 'bitWrite'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: invalid operands of types 'byte [8] {aka unsigned char [8]}' and 'long unsigned int' to binary 'operator&'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:106:73: note: in expansion of macro 'bitClear'
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
^
_0_Programm_Modellbahn_Array.ino.ino:87:5: note: in expansion of macro 'bitWrite'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: in evaluation of 'operator&=(byte [8] {aka unsigned char [8]}, long unsigned int)'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:106:73: note: in expansion of macro 'bitClear'
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
^
_0_Programm_Modellbahn_Array.ino.ino:87:5: note: in expansion of macro 'bitWrite'
_0_Programm_Modellbahn_Array.ino.ino: In function 'void Fuellenw()':
_0_Programm_Modellbahn_Array.ino:103: error: invalid conversion from 'byte* {aka unsigned char*}' to 'uint8_t {aka unsigned char}' [-fpermissive]
In file included from _0_Programm_Modellbahn_Array.ino.ino:7:0:
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:139:6: error: initializing argument 4 of 'void shiftOut(uint8_t, uint8_t, uint8_t, uint8_t)' [-fpermissive]
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);
^
_0_Programm_Modellbahn_Array.ino.ino: In function 'void Leerenw()':
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: invalid operands of types 'byte [8] {aka unsigned char [8]}' and 'long unsigned int' to binary 'operator&'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:112:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: in evaluation of 'operator&=(byte [8] {aka unsigned char [8]}, long unsigned int)'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:112:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: invalid operands of types 'byte [8] {aka unsigned char [8]}' and 'long unsigned int' to binary 'operator&'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:113:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: in evaluation of 'operator&=(byte [8] {aka unsigned char [8]}, long unsigned int)'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:113:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: invalid operands of types 'byte [8] {aka unsigned char [8]}' and 'long unsigned int' to binary 'operator&'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:114:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: in evaluation of 'operator&=(byte [8] {aka unsigned char [8]}, long unsigned int)'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:114:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: invalid operands of types 'byte [8] {aka unsigned char [8]}' and 'long unsigned int' to binary 'operator&'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:115:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: in evaluation of 'operator&=(byte [8] {aka unsigned char [8]}, long unsigned int)'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:115:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: invalid operands of types 'byte [8] {aka unsigned char [8]}' and 'long unsigned int' to binary 'operator&'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:116:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: in evaluation of 'operator&=(byte [8] {aka unsigned char [8]}, long unsigned int)'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:116:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: invalid operands of types 'byte [8] {aka unsigned char [8]}' and 'long unsigned int' to binary 'operator&'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:117:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: in evaluation of 'operator&=(byte [8] {aka unsigned char [8]}, long unsigned int)'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:117:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: invalid operands of types 'byte [8] {aka unsigned char [8]}' and 'long unsigned int' to binary 'operator&'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:118:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: in evaluation of 'operator&=(byte [8] {aka unsigned char [8]}, long unsigned int)'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:118:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: invalid operands of types 'byte [8] {aka unsigned char [8]}' and 'long unsigned int' to binary 'operator&'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:119:3: note: in expansion of macro 'bitClear'
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:105:39: error: in evaluation of 'operator&=(byte [8] {aka unsigned char [8]}, long unsigned int)'
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
^
_0_Programm_Modellbahn_Array.ino.ino:119:3: note: in expansion of macro 'bitClear'
_0_Programm_Modellbahn_Array.ino:123: error: invalid conversion from 'byte* {aka unsigned char*}' to 'uint8_t {aka unsigned char}' [-fpermissive]
In file included from _0_Programm_Modellbahn_Array.ino.ino:7:0:
C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/Arduino.h:139:6: error: initializing argument 4 of 'void shiftOut(uint8_t, uint8_t, uint8_t, uint8_t)' [-fpermissive]
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);
^
invalid conversion from 'byte* {aka unsigned char*}' to 'uint8_t {aka unsigned char}' [-fpermissive][/code]
Freue mich schon auf die nächsten Antworten!