Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
FAQ zum Einsteigerkurs uC-Programmierung
habe nun die 4 Zahlen in ein Array eingebaut und mittels

digitalWrite(k, Decod[k - 2][Zahl[i - 9]]);

ausgeben lassen.
Im Prinzip geht es, aber der Aufbau der Zahlen in den einzelnen Segmenten braucht jetzt ca 1 Sekunde.
wenn ich delay deaktiviere ist es nur ein matschiges Anzeigebild
Hmmmm
mal drüber schlafen

Sven
Zitieren
Nein Zahl1, Zahl2, Zahl3, Zahl4 sind selbstständige Variablen, die vom Compiler aus gesehen nicht mal direkt hintereinander im Speicher sein müssen. Zahl[z] funktioniert also nicht und Zahl(z) schon mal gar nicht.

Man könnte Zahl1 bis 4 in einem Array von  4 Elementen speichern, dann kannst du per Zahl[i], wobei i=0...3 ist, darauf zugreifen.
Da der Compiler dafür sorgt das die 4 Zahlenwerte in einem Array auch logisch hintereinander im Speicher stehen, könnte man sich auch die Adresse des 0. Elements holen und dann den Zeiger inkrementieren. Und obwohl Zeiger eine tolle Sache sind, fange ich hier im Einstiegskurs damit gar nicht erst an, die bisherigen Verständnisprobleme von Kursteilnehmern schon mit Arrays zeigt, das das die richtige Entscheidung ist.

Edit: Mit dem Array haben wir uns jetzt überschnitten!
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
(24.01.2020, 23:31)Larry67 schrieb: Im Prinzip geht es, aber der Aufbau der Zahlen in den einzelnen Segmenten braucht jetzt ca 1 Sekunde.
wenn ich delay deaktiviere ist es nur ein matschiges Anzeigebild
Hmmmm
mal drüber schlafen

Delay so verwenden, das ungefähr 15-25 "Bilder" (also vollständige Anzeigen aller 4 Stellen) entstehen.
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
die einzelnen Segmente pro Stelle brauchen etwa 1 Sekunde zum Aufbau
es hat den Eindruck, als ob der Arduino nur mit einigen Kiloherz getaktet wird
Zitieren
Ja ja, immer ist die Hardware schuld! Am eigenen "hocheffizienten" Code liegt es nie!  Wink Big Grin

Gruß
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
Na dann war meine Idee wohl eine Sackgasse.
Ich weiß nicht warum aber mein Programm kann dann so nicht laufen, muss da von vorn überlegen

Sven
Zitieren
Sackgasse? Wenn es funktioniert - Zahlen werden doch angezeigt nach deinem Post oben - würde ich schauen wo die Performance-Probleme im Code liegen. Irgendwo eine Schleife die zu viele Durchgänge macht oder ähnliches in dieser Richtung.

Gruß Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
Hallo Kursteilnehmer,

ihr habt sicher bemerkt das der Richard so nett war und uns hier eine neue Spielecke in Forum eingerichtet hat! Danke Richard im Namen aller Kursteilnehmer.
Der Einstiegskurs Microcontrollerprogrammierung wird also ab sofort hier unter ATmega geführt. Das macht Sinn, denn unser Arduino Nano hat als Controller ja
einen ATmega... als CPU!

Alle Fragen zu ATmega oder Arduino mit ATmega kommen also hier rein!
Entweder als FAQ zum Kurs und wenn jemand eine Einzelbetreuung zu einem Projekt haben will, dann als eigener Thread. 
Auch Bastelprojekte mit diesen CPUs bitte hier rein.

Es gibt einige Kursteilnehmer die gern auch einen PIC an Stelle eines ATmegas/Arduino nehmen wollen. Kein Problem, Ihr seid im PIC Microchip-Bereich gut aufgehoben. Dabei ist es egal ob es um einen PIC10,12,16 oder 18F geht, also um die 8 Bit'er, um die dsPICs oder die PIC32-Serie! Auch Themen zu Programmiergeräte PicKit ....passen da gut rein.

Wer Probleme hat den Arduino-Code auf einen PIC zu transformieren, bitte melden und keine Scheu haben. Wir versuchen dann Side-by-Side zeitnah eine "Übersetzung" 
von ATmega - C auf PIC - C vorzunehmen.

Wer andere bekannte und viel genutzte Plattformen nutzen möchte, also die Espressif-Controller ESP8266, ESP32 ..... oder gar die STM32-Boards oder Teensy, der meldet sich einfach bei mir. Dann finden wir dafür auch einen Platz. Es ist nur Käse jetzt am Anfang bereits zig Rubriken für alle um Umlauf befindlichen Controller anzulegen!

Auch für FPGAs machen wir erstmal keine Unterschiede, denn letztendlich läuft es am Anfang doch nur darauf hinaus: Verlog oder VHDL.

Die nächste Lektion des Einsteigerkurses Microcontrollerprogrammnierung wird es ganz normal in gut zwei Wochen geben und natürlich auch eine Musterlösung zur Hausaufgabe und zum Zusatz.
Ich denke jetzt kommen alle gut mit der Zeit aus und niemand wird mehr zurückgelassen. Unser virtueller Kursraum ist nach Lektion 3 immer noch gut gefühlt, auch wenn einige mich nicht über das Forum sondern per Mail ansprechen.
Bis jetzt hat sich aber noch keiner gemeldet, der wegen der Komplexität des Stoffs das Handtuch geworfen hat! Ich bin stolz auf Euch!

Grüße und "keep coding"
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
Hallo die Runde,

für mich ist ein nicht selbst geschriebener Code oft sehr schwer zu verstehen (nach wenigen Tagen schon der Eigene :-) ), trotzdem möchte ich meine Version der Uhr zeigen.
Der Punkt an Segment 2 blinkt im Sekundentakt und zeigt damit die Funktion an. Die Uhrzeit wird mit den beiden Tastern gestellt. Auf die
Entprellung konnte ich hierbei verzichten. Die Uhrzeit läuft mit unterschiedlichen Geschwindigkeiten hoch, je nachdem welcher Taster gedrückt wird.
Die Uhrzeit lässt sich so gut einstellen. Die Multiplexzeit (die Zeit in der jedes Segment bestromt wird) wird nicht mit einem delay verzögert sondern
wird mit einer  for Schleife 70 mal wiederholt. Durch die Controllergeschwindigkeit ergibt sich hierdurch eine nicht genau bekannte Verzögerung der Segmente.
Vorteil für mich war das jedesmal die Taster mit abgefragt werden. Ich versuche eine Verzögerung mit delay zu vermeiden da ich große Probleme mit der Tasterabfrage
hatte.

Wie sieht's eigentlich mit der Genauigkeit aus? Ein Quarz kann ich nicht entdecken.


Code:
#define TASTER1 15
#define TASTER2 16


//            A  B  C  D  E  F  G  DP
int LED[8] = {2, 3, 4, 5, 6, 7, 8, 9};

int SEGMENTNUMMER [4] = {13 , 12, 11, 10}; //Kathoden Segmente


int SEGMENTCODE[10][8] = {

 {1, 1, 1, 1, 1, 1, 0, 0}, //0
 {0, 1, 1, 0, 0, 0, 0, 0}, //1
 {1, 1, 0, 1, 1, 0, 1, 0}, //2
 {1, 1, 1, 1, 0, 0, 1, 0}, //3
 {0, 1, 1, 0, 0, 1, 1, 0}, //4
 {1, 0, 1, 1, 0, 1, 1, 0}, //5
 {1, 0, 1, 1, 1, 1, 1, 0}, //6
 {1, 1, 1, 0, 0, 0, 0, 0}, //7
 {1, 1, 1, 1, 1, 1, 1, 0}, //8
 {1, 1, 1, 1, 0, 1, 1, 0}, //9

};



int ZAHL = 0;
int EINER;
int ZEHNER;
int HUNDERTER;
int TAUSENDER;
int SEKUNDENZAEHLER;
int BLINKEN = LOW;
int MULTIPLEX = 70; // Schaltzeit pro Segment



unsigned long STELLZEIT = 0;

unsigned long SEKUNDE = 0;
unsigned long SEKUNDENZEICHEN = 0;



void setup() {

 Serial.begin(9600);

 for (int i = 0; i < 8; i++) {
   pinMode(LED[i], OUTPUT);
 }

 for (int i = 0; i < 4; i++) {
   pinMode(SEGMENTNUMMER[i], OUTPUT);
 }

 pinMode(TASTER1, INPUT_PULLUP);
 pinMode(TASTER2, INPUT_PULLUP);

}



void TASTERABFRAGE () {

//stellen schnell

 if (digitalRead(TASTER1) == LOW)
 {
   if ((millis() - STELLZEIT) > 10)
   {
     STELLZEIT = millis();
     ZAHL++;
   }
 }
//stellen langsam

 if (digitalRead(TASTER2) == LOW)
 {
   if ((millis() - STELLZEIT) > 700)
   {
     STELLZEIT = millis();
     ZAHL++;
   }
 }
}

void siebenseg_einer(int EINER) {

 for (int i = 0; i < 8; i++) {

   digitalWrite(LED[i], SEGMENTCODE[EINER][i]);
 }
}

void siebenseg_zehner(int ZEHNER) {

 for (int i = 0; i < 8; i++) {

   digitalWrite(LED[i], SEGMENTCODE[ZEHNER][i]);
 }
}

void siebenseg_hunderter(int HUNDERTER) {

 for (int i = 0; i < 8; i++) {

   digitalWrite(LED[i], SEGMENTCODE[HUNDERTER][i]);
 }
}

void siebenseg_tausender(int TAUSENDER) {

 for (int i = 0; i < 8; i++) {

   digitalWrite(LED[i], SEGMENTCODE[TAUSENDER][i]);
 }
}


void uhr () {

 //Blinken Sekundenpunkt
 if ((millis() - SEKUNDENZEICHEN) > 1000 ) {
   SEKUNDENZEICHEN = millis();
   if (BLINKEN == LOW) {
     BLINKEN = HIGH;
   } else {
     BLINKEN = LOW;
   }
 }

 // Überlaufzähler Uhrzeit
   
 if ((millis () - SEKUNDE) >= 1000) {
   SEKUNDE = millis();
   SEKUNDENZAEHLER++;
 }

 if (SEKUNDENZAEHLER > 59) {
   ZAHL++;
   SEKUNDENZAEHLER = 0;
 }


 if (ZAHL > 59) {
   ZAHL = 0;
   HUNDERTER++;
 }

 if (HUNDERTER > 9) {
   HUNDERTER = 0;
   TAUSENDER++;
 }

 if (TAUSENDER == 2)
   if (HUNDERTER > 3) {
     HUNDERTER = 0;
     TAUSENDER = 0;
   }




}

void loop() {





 EINER = ZAHL % 10;
 ZEHNER = ZAHL % 100 / 10;

 uhr();

//Segment 4
 for (int i = 0; i < MULTIPLEX; i++) {
   digitalWrite(SEGMENTNUMMER[0], HIGH);
   siebenseg_einer(EINER);
   TASTERABFRAGE();
 }
 digitalWrite(SEGMENTNUMMER[0], LOW);

//Segment 3
 for (int i = 0; i < MULTIPLEX; i++) {
   digitalWrite(SEGMENTNUMMER[1], HIGH);
   siebenseg_zehner(ZEHNER);
   TASTERABFRAGE();
 }
 digitalWrite(SEGMENTNUMMER[1], LOW);


//Segement 2
 for (int i = 0; i < MULTIPLEX; i++) {
   digitalWrite(SEGMENTNUMMER[2], HIGH);
   siebenseg_hunderter(HUNDERTER);
   TASTERABFRAGE();
   digitalWrite(LED[7], BLINKEN); //Sekundenpunkt blinken
 }
 digitalWrite(SEGMENTNUMMER[2], LOW);



//Segment 1
 for (int i = 0; i < MULTIPLEX; i++) {
   digitalWrite(SEGMENTNUMMER[3], HIGH);
   siebenseg_tausender(TAUSENDER);
   TASTERABFRAGE();
 }
 digitalWrite(SEGMENTNUMMER[3], LOW);



}
sicheres Auftreten bei völliger Ahnungslosigkeit
Zitieren
Danke, Frank, ich war nicht soweit, bin immer noch bei der Ampel Sad
Gruß,
Ivan
Zitieren
(31.01.2020, 22:24)Tubefan schrieb: Hallo die Runde,

für mich ist ein nicht selbst geschriebener Code oft sehr schwer zu verstehen (nach wenigen Tagen schon der Eigene :-) ), trotzdem möchte ich meine Version der Uhr zeigen.

Hallo und Danke für deine Version! Den Code habe ich noch nicht ausprobiert, aber

(31.01.2020, 22:24)Tubefan schrieb: Auf die Entprellung konnte ich hierbei verzichten.

Wo denn? Ich lese deinen Code so:


 if (digitalRead(TASTER1) == LOW)
 {
   if ((millis() - STELLZEIT) > 10)
   {
      STELLZEIT = millis();

..

Durch die Verzögerung entprellst Du auch! Wenn dein Controller LOW, also Taster gedrückt erkennt, rauscht er bei erstem erkannten LOW-Pegel durch die if, denn
die zweite Bedingung ist dann ja quasi "immer" erfüllt, da die Variable STELLZEIT noch eine alte Zeit, zum Beispiel aus vorherigen Tastendruck (sogar von einem anderen Taster, da gleiche Varible!), enthält und die Differenz dann praktisch immer über die 10ms kommt. Erst beim nächsten Durchlauf durch diese Codepassage werden alle anderen LOWs und auch prellende Pegel innerhalb dieser "Totzeit" ignoriert und somit vernachlässigt, wenn der Controller diese Pegelhopser sowieso nicht in anderweitigen Codeteilen einfach verpasst. Mission "Softwareentprellung" erfüllt.


Wenn Du nun die ganzen 4 Segmentfunktionen siebenseg_tausender, siebenseg_hunderter, ... in eine Funktion void siebenseg(int zahl) packst, hast Du ein Stück Code was Du bei den nächsten Aufgaben in den anderen Lektionen gleich weiterverwenden kannst. Thumbs_up Big Grin


(31.01.2020, 22:24)Tubefan schrieb: Wie sieht's eigentlich mit der Genauigkeit aus? Ein Quarz kann ich nicht entdecken.

Bei den meisten Arduino-Nano Boards liegt der Quarz (SMD) oder Resonator über D5-D6. Zur weiteren Erhöhung der Genauigkeit könntest Du jetzt eines dieser preiswerten DCF77-Module mit TTL Ausgang nehmen und einmal pro Stunde, Tag, Woche,... die Zeit synchronisieren! Das Wissen hast Du mit Lektion 3 jetzt schon dafür! Mache das ruhig mal, das DCF77 Protokoll ist sehr sehr leicht zu verstehen und umzusetzen. Das ist ein sehr effektives Training!

(31.01.2020, 23:12)navi schrieb: Danke, Frank, ich war nicht soweit, bin immer noch bei der Ampel Sad

Ein Zeitproblem oder ist es die Komplexität? Bei letzteren bitte mal schreiben wo genau der "Groschen hängt", dann versuchen wir das gemeinsam zu lösen.

Gruß Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
Hallo Bernhard,

zu deinen Lösungen habe ich folgende Frage :
wozu steht && ! in der Zeile und was bewirkt es?

if ((digitalRead(TASTER_ABWAERTS_PIN) == LOW) && !bFlankenwechselTasterAb) {


Sven
Zitieren
Hallo Sven,

&& ist ein logisches UND.
! eine Negierung, sprich aus ein TRUE wird FALSE und aus FALSE ein TRUE.

!bFlankenwechselTasterAb , ist bFlankenwechselTasterAb gleich FALSE, wird !bFlankenwechselTasterAb zu TRUE.
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
meine Idee zur multiplexausgabe ist scheinbar zu verschachtelt gewesen und führte zum Ausbremsen des Arduino.
Möglicherweise darf man nicht zu komplex die Anweisungen schreiben.

anbei mein testprogramm



void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  for (int P = 2; P < 13; P++) {                   //Segmente Pins
    pinMode(P , OUTPUT);                           // Ausgang schalten
    pinMode(13, INPUT_PULLUP);                // Tasten Pins
    pinMode(14, INPUT_PULLUP);
  }
}

void loop() {
  int Zahl [4] {0, 2, 7, 3};                          // Beispielzahl
  int Decod [7] [10] {                                // decodierung der Zahlen
    {0, 1, 0, 0, 1, 0, 0, 0, 0, 0,},
    {0, 0, 0, 0, 0, 1, 1, 0, 0, 0,},
    {0, 0, 1, 0, 0, 0, 0, 0, 0, 0,},
    {0, 1, 0, 0, 1, 0, 0, 1, 0, 0,},
    {0, 1, 0, 1, 1, 1, 0, 1, 0, 1,},
    {0, 1, 1, 1, 0, 0, 0, 1, 0, 0,},
    {1, 1, 0, 0, 0, 0, 0, 1, 0, 0,},
  };
  for (int i = 9; i < 13; i++) {                   // Stellen 1 bis 4
    digitalWrite(i, 1);                                // einschalten
    {
      for (int k = 2; k < 9; k++) {              //Segmente ohne Punkt

        digitalWrite(k, Decod[k - 2][Zahl[i - 9]]);                     // diese Anweisung scheint zu Komplex

        delay (100);                                   // verzögerung
      }
      digitalWrite(i, LOW);                         // aktive Stelle aus
    }
  }

}
Zitieren
hallo Bernhard,

warum negiertest du in deinen Anweisungen die Werte aus dem Zahlen Feld?
wenn das Feld Zahlen anders rum beschrieben währe, währe das doch unnötig oder?

Die Pin´s als Feld zu definieren , ja, kann nicht immer schaltungstechnisch elegant gelöst werden, verstehe ich.

Das Aufsplitten in Einer, Zehner ...... umgeht wohl das zu sehr verschachteln in einer Anweisung, deshalb bremst sich der Arduino sich so nicht aus.

for (int i=0;i<4;i++)
pinMode(ModulPins[i],OUTPUT);

for (int i=0;i<4;i++)
digitalWrite(ModulPins[i],HIGH)


das untere for hätte man sich nicht sparen können??

ich muss das verstehen deshalb frage ich

Sven
Zitieren
(07.02.2020, 21:24)Larry67 schrieb: hallo Bernhard,

warum negiertest du in deinen Anweisungen die  Werte aus dem Zahlen Feld?
wenn das Feld Zahlen anders rum beschrieben währe, währe das doch unnötig oder?

Ja dann wäre es unnötig, in der Definition steht aber:

// Definition für Zahlen 0 bis 9, wobei true = Segment an und false = Segment aus
bool Zahlen[10][8] = {
 { true,true,true,true,true,true,false,false } ,      // = 0
 { false,true,true,false,false,false,false,false } ,  // = 1
 { true,true,false,true,true,false,true,false }  ,    // = 2

und so weiter.

?mage

Damit ist klar, da wo true ist, leuchtet das Segment, bei false ist es aus. So stellt man sich das ja auch vor. Schalter an, leuchtet. Schalter aus, leuchtet nicht.

Die Negierung weiter unten ist notwendig, da in der eigentlichen Schaltung (Anzeige mit gemeinsamer Anode) der Pin aber auf LOW gesetzt werden muss um zu "leuchten", bei HIGH (also Anodenpotential) bleibt das Segment aus!  Ich hoffe das haben andere Nachbauer erkannt?!

Wählt man einen anderen Anzeigentyp, reicht es aus einfach die Negierung "!" wegzunehmen, die Zahlendefinition kann unberührt bleiben was sonst nicht der Fall ist! Man kann den Code also für beide Anzeigentypen nur durch zufügen/weglassen der Negierung nutzen, ohne auch nur etwas in der Zahlendefinition zu ändern! Damit hat man beim Wechsel der Anzeige von gem. Anode auf gem. Kathode viel weniger am Code zu verändern.

(07.02.2020, 21:24)Larry67 schrieb: Das Aufsplitten in Einer, Zehner ......  umgeht wohl das zu sehr verschachteln in einer Anweisung, deshalb bremst sich der Arduino sich so nicht aus.

Also erst mal das delay(100); in deinem Code oben ist eine (die?) Bremse! Auf jeden Fall ist der Prozessor dadurch ausgebremst um überhaupt etwas flackerfrei darstellen zu können! In deinem Code braucht er ja fast eine Sekunde für eine Anzeigenstelle!
Durch deine Felder und Datenrepräsentation (Decod [7] [10], was soll darin was sein) steige ich jetzt so schnell erst einmal nicht durch! Ich denke deine Gedanken zu deinem Code musst Du uns noch mitteilen, auch warum Du eine vierstellige Zahl  so kompliziert als int Zahl [4] {0, 2, 7, 3};  datentechnisch darstellst. Die Hausaufgabe lautete anders, nämlich der Funktion void siebenseg(int zahl) eine(!) Zahl zu übergeben!

Warum machst Du so eine "komplexe" Indizierung?  for (int i = 9; i < 13; i++) {                   // Stellen 1 bis 4  

Sollen die ersten 0-7 Elemente in Decod [7] [10] die Segmente einer Ziffer und von 9-12 die Stelle in der 4-fach Anzeige sein?  Das Feld geht aber doch in die eine Dimension nur bis 7, in die andere bis 10, warum bildest Du dann erst Indizes außerhalb der erlaubten Grenzen (bis 12)??? Beim Feldzugriff rechnest Du dann wieder um ....  so schleichen sich Fehler ein! Ich verstehe deinen Code, deine Datenrepräsentation und Indizierung jedenfalls nicht so auf Anhieb!


(07.02.2020, 21:24)Larry67 schrieb: ....
for (int i=0;i<4;i++)
    pinMode(ModulPins[i],OUTPUT);

 for (int i=0;i<4;i++)
    digitalWrite(ModulPins[i],HIGH)
....


das untere   for  hätte man sich nicht sparen können??

Nein die zweite for braucht man! Damit geht man sicher und schaltet alle 4 Anzeigenmodule (Stellen) in der setup aus wenn man ein HIGH sendet! Ein low auf dem Multiplex-I/O und damit am pnp-Schalttransistor würde die Anzeigenstelle ja durchschalten, bei allen 4 Ausgängen auf LOW würden also alle Anzeigen gleichzeitig an dem Datenbus hängen.
Wenn dann noch alle 7 Segmente auf allen 4 Modulen leuchten würden, würde das ohne weiteren Treiber die I/Os eines Arduinos auf Dauer überlasten!  Also in Setup() gleich für klare Verhältnisse sorgen und alle Pegel auf einen definierten Zustand schicken, dafür ist diese Einrichtungsfunktion ja geschaffen!

Je nach dem welchen Anzeigentyp (gem. Anode oder Kathode) und welche Schalttransistoren NPN oder PNP ihr einsetzt
müsst Ihr schauen wie die Schaltlogik ist, invertiert oder nicht-invertiert!

Gruß
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
das negieren später ist klar , die Definition

// Definition für Zahlen 0 bis 9, wobei true = Segement an und false = Segement aus

hab ich wohl überlesen .

das delay bei mir dient dem bremsen, damit ich optisch sehen kann, ob die einzelnen stellen richtig arbeiten.


Warum machst Du so eine "komplexe" Indizierung? for (int i = 9; i < 13; i++) { // Stellen 1 bis 4

Pin 9 bis 12 sind die Stellenansteuerung tausender, hunderter, zehner, einer

Durch deine Felder und Datenrepräsentation (Decod [7] [10], was soll darin was sein)

ein Decoder 7 Segmente, ohne Punkt , 10 Ziffern

Sollen die ersten 0-7 Elemente die Segmente einer Anzeige sein und von 8-12 die Stelle in der 4-fach Anzeige sein?
Wenn ja, dann musst Du jede Ziffer ja 4mal im Speicher halten 4x0, 4x1, 4x2, ..... 4x9 ...

for (int i = 9; i < 13; i++) { // Stellen 1 bis 4
digitalWrite(i, 1); // einschalten
{
for (int k = 2; k < 9; k++) { //Segmente ohne Punkt
digitalWrite(k, Decod[k - 2][Zahl[i - 9]]);

Die erste Schleife for (int i = 9; i < 13; i++)
zählt die 4 Stellen der Anzeige wobei i auch der Anschlußpin ist

digitalWrite(i, 1); schaltet eine Stelle aktiv,


for (int k = 2; k < 9; k++) Schleife für die 7 Segmente pro Anzeigestelle

digitalWrite(k, Decod[k - 2][Zahl[i - 9]]); schaltet die einzelnen Segmente ein k ist Segment A -G , Decod holt sich die Info ob Segment an oder aus ist.


digitalWrite(i, LOW); schaltet die Stelle wieder aus
dann gehts von vorn los für die nächste Anzeigestelle

deine Programmpassage :

for (int i=0;i<4;i++)
pinMode(ModulPins[i],OUTPUT);

for (int i=0;i<4;i++)
digitalWrite(ModulPins[i],HIGH)

meine Idee :

for (int i=0;i<4;i++)
pinMode(ModulPins[i],OUTPUT);
digitalWrite(ModulPins[i],HIGH);

so meine ich das

hoffe so etwas verständlicher zu sein

Sven
P.S. kompliziert ist es, sowas in Worte zu fassen
Zitieren
(07.02.2020, 23:16)Larry67 schrieb: deine Programmpassage :

for (int i=0;i<4;i++)
   pinMode(ModulPins[i],OUTPUT);

for (int i=0;i<4;i++)
   digitalWrite(ModulPins[i],HIGH)

meine Idee :

for (int i=0;i<4;i++)
   pinMode(ModulPins[i],OUTPUT);
    digitalWrite(ModulPins[i],HIGH);


so meine ich das

Nee, da fehlt dann die Klammer,  das for würde nur auf pinMode wirken!
Also entweder in zwei for Schleifen, oder so:

for (int i=0;i<4;i++) {
   pinMode(ModulPins[i],OUTPUT);
   digitalWrite(ModulPins[i],HIGH);
}

Das würde jetzt mit einer for-Schleife gehen!

(07.02.2020, 23:16)Larry67 schrieb: P.S.   kompliziert ist es, sowas in Worte zu fassen

In der Tat. Bei deiner Indizierung und dem Feldzugriff samt Feldinhalt steige ich im Moment noch nicht durch, werde das noch ein paar mal lesen müssen.

Gruß Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
jaaaaa, die geschweifte Klammer hab ich vergessen, nur mitgedacht


for (int i=0;i<4;i++) {
pinMode(ModulPins[i],OUTPUT);
digitalWrite(ModulPins[i],HIGH);
}

so dachte ich es mir


digitalWrite(k, Decod[k - 2][Zahl[i - 9]]);


k ist das Segment A - G Decod[k - 2] eigendlich Decod[0] aber da k bei 2 anfängt muss k-2 um auf 0 zu kommen

K zählt hoch bis Decod[7] aber da k= 9 ist mussss [k-2]

zweiter Bereich für mein 2 dimensionales Feld namens Decod:

[Zahl[i - 9]] greift auf mein Feld namens Zahl zu, i ist die Pin Nr für die einzelnen 7Segmentanzeigen beginnend mit Pin 9

[i - 9] bedeutet dass beim ersten Segment ( pin 9) das nullte Element aus dem Feld ZAHL ausgelesen wird

wird i=10 kommt durch [i - 9] das erste Element aus dem Feld Zahl drann u.s.w.

ist das schwer zu beschreiben
Zitieren
Das Programm kannst du doch keinem vorsetzen wenn du es nichtmal selbst erklären kannst! Schmeiß mal die zwei Schleifen weg, dann definiere Ein- und Ausgänge einmalig richtig programmweit! Und dann nur ūber eindeutige Indexe zugreifen! Ist doch Scheiße wenn es eigentlich Decod[0] sein soll, du dann mal ein k rein nimmst und damit es passt noch zwei subtrahierst.  Da blickt kein Mensch durch, du wahrscheinlich auch nicht richtig!

Otto.
Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Einsteigerkurs Microcontrollerprogrammierung Bernhard45 13 10.049 23.05.2020, 23:55
Letzter Beitrag: Bernhard45

Gehe zu: