Durch Tastendrucke + 7 Segment Ports Schalten

Kani

Neues Mitglied
07. Jan. 2009
339
0
0
Spenge
Sprachen
Hallo, zum einstellen einer DMX Startadresse brauch ich ein Programm das folgendermaßen funktioniert:

DMX-Startadressen werden mit Dipschaltern eingestellt.

Schalter 1 - 2
Schalter 2 - 4
Schalter 3 - 8
Schalter 5 - 16
Schalter 6 - 32
Schalter 7 - 64
Schalter 8 - 128
Schalter 9 - 256
Schalter 10 - 512

Wenn ich jetzt mit dem Taster up auf die Zahl 6, durch die 7-Segment-Anzeige angezeigt gehe, sollte also Bit 4 und Bit 2 auf Ausgang stehen.
Dann erkennt der andere Controller (http://www.hoelscher-hi.de/hendrik/light/dmxstep.htm) welche Startadresse es ist. Damit spart man sich den Dipschalter und hat die coolen Anzeigen. xD

Wisst ihr, wie ich soeinen Algorhytmus am besten mit C schreibe?
Liebe Grüße,
Finn
 
Hallo Finn!

Ich kann dir zwar bei der Programmierung in C nicht weiterhelfen aber ich denke mal, dass es die Anderen auch nicht können.

Sorry, aber irgendwie steige ich durch deinen Beitrag nicht durch.
Das ging mir bei deinem letzten Beitrag auch schon so..... und vermutlich nicht nur mir. Vielleicht hat deswegen auch niemand darauf geantwortet?

Damit es dir diesmal nicht wieder so geht solltest du dir vielleicht mal überlegen, ob du nicht etwas mehr von dir und deinem Thema schreiben möchtest.

Es wäre also schön wenn wir hier erst einmal wüssten worum es geht, was du gern machen möchtest, welchen Wissensstand du hast, welche Hardware du benutzt.... oder benutzen wirst und was nun dein Problem ist.

Meistens bekommt man auch schnellere und bessere Hilfe, wenn man den vorläufig entwickelten Schaltplan und Programmcode hier schon mal einstellt.... auch wenn er Fehler hat und nicht funktioniert. Auf diese Weise bekommen aber alle einen schnellen Überblick und können dir ggf. auch helfen.


Tut mir ja leid für diese ernsten Zeilen von mir, aber so wie du das hier machst, kannst du bestimmt nicht auf Hilfe hoffen.
Selbst wenn einer der C-Fachleute dir gerne helfen würde, ohne etliche Zeilen an Nachfragen kann dir einfach keiner Helfen.

Denk einfach mal drüber nach...... ;)
Dann schreibe in einer ruhigen Stunde alles mal auf und poste auch gleich deine Schaltpläne und ggf. deinen vorläufigen Programmcode.
Du wirst sehen, dann bekommst du auch bestimmt etwas Hilfe.

Gruß,
Cassio
 
Hi Finn,

ich glaube,ich kann mir irgendwie zusammenreimen was du da vorhast :D
Das hängt wohl auch mit deinem LED-Beleuchtungskram zusammen. Oder
irre ich mich da ?

Du möchtest also die DIP-Schalter auf dem DMX-Board mit dem du deine
ersten Experimente gemacht hast ausbauen und statt dessen mit einem
ATmega die Pins des DMX-Boards ansteuern. Dann muß man die DMX-Adresse
nicht binär über den DIP-Schalter eingeben sondern kann die Adresse über
Taster up/down tasten und sie wird auf ner 3 stelligen 7-Segment-Anzeige
angezeigt.

Der ATmega muß also einen 9-Bit-Zähler (000-512) haben, der auf der Anzeige
ausgegeben wird, mit den Tasten hoch oder runtergezählt wird und auf
9 Pins binär an das DMX-Board weitergegeben wird.

In C kann ich dir das aber leider nicht basteln.
Aber die Beschreibung sollte (wenn ich es richtig erkannt habe) den anderen
schon bei der Lösung weiterhelfen :D

Gruß
Dino
 
Yeah Dino, so meine ich das. xD

Ich beschreib das das nächste mal genauer. Schaltplan hab ich teilweise im Link, andererseits gibt es sonst zu dem Schaltplan nicht viel zu sagen. Stromversorgung, 2 Taster, 3 7segmentanzeigen.
 
Also jetzt noch mal die Erläuterung.

Es handelt sich um eine Platine zur Steurung von Motoren über DMX.
Mehr dazu hier!

Eine DMX-Erklärung gibt es hier:
http://www.hoelscher-hi.de/hendrik/light/ressources/AN012.pdf Interessant hier auch das Archive. (rxd.zip->C->test.aps) Ist es das nicht?
http://www.hoelscher-hi.de/hendrik/light/ressources/an013.pdf Hier das Archive zu dieser Application Note!
Soviel dazu.

http://www.hoelscher-hi.de/hendrik/light/dmxmodul/dmx_sch.gif
Mittels des 10Fach-Dipschalters wird die DMX-Startadresse eingestellt. Ab hier fangen die Kanäle des Transceivers zu zählen.
Beispiel:
Kanäle: 1 2 3 4 5 6 7 8 9 10
Geräte: Gerät 1 FreiGerät 2

Die Anzahl der DMX-Kanäle kommt auf die Funktion an. Es gibt Geräte die z.B. bis zu 16 Kanäle haben. (Z.B. für Pan (Motor für Drehung), Tilt (Motor für Neigung), Goborad (Musterrad) und Farbrad...etc...)
Es muss dazwischen keiner frei sein. Das war nur ein Beispiel. Wenn man zwei Startadressen übereinander legt, kommt an den entsprechenden Kanälen dann natürlich der gleiche Wert an.

Der Atmega brauch, wie Dino schon gesagt hat, einen 9-Bit-Zähler (000-512). Ich suche morgen mal, ob ich schon etwas fertiges finde.

Die Startadresse soll jetzt, mittels einem Up und einem Down Taster, eingestellt und über die 7-Segment-Anzeigen angezeigt werden.

Ich hoffe, dass es diesmal genau genug ist.

Liebe Grüße,
Finn
 
Ich habe deinen Thread nicht sofort gesehen, kann dir aber grundsätzlich bei deinem C-Code helfen.

Eins habe ich nicht verstanden: Wieso einen 9Bit Zähler? Ich dachte du brauchst 10 Ausgänge?
Edit: Oh habs jetzt erst gesehen.(habs kapiert)


Sollen wir dir nur den Code schreiben?(gerne)
Sollen wir dir die Sachen Beibringen die du dafür brauchst?(gerne)
 
Ich baue unteranderem für Freunde diese Transceiver. ;-) Also ein bissie Ahnung habe ich schon. Habe auch schon ein bisschen erfahrung mit C. Machen das unter anderem in der Schule. Grundbegriffe, Schleifen, Struktur....
Nur im Moment so, dass wir zb ein C Programm schreiben, dass durch Eingabe von Werkstoff, Leiter-Länge und Durchschnitt den Leiterwiderstand berechnen lassen usw.
Über AVR Mikrocontroller (speziell ATMEGA 8515) kenne ich mich auch aus. Das AVR-GCC Tutorial auf mikrocontroller.net habe ich auch schon durch.
LEDs blinken lassen lässt sich auch machen.
Nur grob zu meinem Wissensstand.

Am liebsten wäre es mir, wenn wir zusammen den Code erarbeiten würden, damit ich ihn verstehe und dabei auch was lerne und spätere Benutzer auch etwas davon haben. Damit alle wieder "SUFU" schreien können. ( xD )
Liebe Grüße,
Finn
 
Ich wollte dich nicht kränken, blöderweise habe ich etwas zu spät gesehen dass du schon ein erfahrener Benutzer bist.

Auf alle fälle: Hast du dir schon Gedanken über die Anschaltung der 7 Segmentanzeige gemacht?
Üblicherweise schaltet man in solchen Fällen die Segmente, die leuchten sollen, mit einem PORT gegen Masse während man mit einem anderen PORT, Transistoren Steuert welche die Versorgungsspannung für die einzelnen 7Segs freigeben. Dabei wird ständig zwischen den 7Segmentanzeigen gewechselt, und zwar so schnell dass man es mit dem Auge nicht wahrnehmen kann.
Edit) So meine ich:
attachment.php



Für den Zählwert auf 7 Segmentumwandler würde ich ein Array anlegen, in welchem gespeichert ist welches Segment bei welcher Ziffer leuchtet.
Dann brauchst du nur noch soetwas schreiben:
Code:
  PORTB=count[8];//7Seg zeigt eine 8
 

Anhänge

  • Beispiel.GIF
    Beispiel.GIF
    7,6 KB · Aufrufe: 66
Keine Angst, so leicht kränkt man mich nicht. :p

Joa, ohne Multiplexen hätte ich ja auch sonst kaum noch Ports frei.
Ich zeichne heute Nachmittag mal einen Schaltplan dafür auf.
Die 3 Segment-Anzeigen sammt zahlen hätte ich so benannt.
A_0, A_1, A_2,....B_0, B_1,.... Die Buchstaben für die 7-Segment-Anzeige und die Zahl für die auf der jeweiligen 7-Segment-Anzeige stehenden Zahl. Später brauch ich dann noch Tastenentprellung usw. Aber erstmal um die Hauptaufgabe kümmern.
 
Keine Angst, so leicht kränkt man mich nicht. :p

Joa, ohne Multiplexen hätte ich ja auch sonst kaum noch Ports frei.

Später brauch ich dann noch Tastenentprellung usw. Aber erstmal um die Hauptaufgabe kümmern.

Jetzt hab ich dich aber schon wieder unterschätzt. Das du weißt was Multiplexen ist, ist natürlich umso besser.

Zum Tastenentprellen hab ich mir vorgestellt, dass dein Programm sobald es eine Tastflanke feststellt für ein Paar Schleifendurchgänge keine Taster überprüft.

Du solltest natürlich noch etwas einbauen damit man nicht 256 mal drücken muss damit man von 0 auf den Kanal 256 kommt.
 
Ja. Also es gibt Geräte da hat man einen Taster für die Hunderter, Zehner und Einer.
Dann zählt der pro Tastendruck einen hoch bis Neun und fängt wieder bei Null an.

Andere Geräte, werden mit dem Zählen immer schneller, desto länger man drück. Das wäre persönlich meine "Lieblingsvariante".

Ich habe ja gesagt, dass ich das AVR-GCC Tutorial auf mikrocontroller.net
komplett durch habe. Ich konnte mir natürlich nicht alles sofort ohne Anwendung merken, aber ich weiß wo ich nachschlagen muss. ;-)
Wie kann ich jetzt zb. schonmal die Zahlen-Kürzel (wie im vorherigen Beitrag) anlegen und dann mit Variablen zu arbeiten.
In dem Tut wird es so gemacht: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#.28Tasten-.29Entprellung

Liebe Grüße,
Finn
 
Ähm mit "Du solltest natürlich noch etwas einbauen damit man nicht 256 mal drücken muss damit man von 0 auf den Kanal 256 kommt." hab ich etwas softwaremäßiges gemeint. In etwa so, dass wenn man eine Sekunde lang auf die Taste drückt im Schnelldurchlauf hochgezählt wird.

Hast du schon über einen Inkrementalgeber nachgedacht?
 
Die ersten 3 Zeilen ;-)

Ja. Also es gibt Geräte da hat man einen Taster für die Hunderter, Zehner und Einer.
Dann zählt der pro Tastendruck einen hoch bis Neun und fängt wieder bei Null an.

Andere Geräte, werden mit dem Zählen immer schneller, desto länger man drück. Das wäre persönlich meine "Lieblingsvariante".

Inkrementalgeber wäre eine Maßnahme. Aber eher nicht so gerne.
 
So, ich hab da mal den Schaltplan angehangen. (Diesmal auch "Dino-Freundlich") xD
Am besten gebe ich die Zustände auf den gleichen Pins aus, auf denen ich sie auch auf dem anderen Mikrocontroller empfange. Also PC0-7, PE1 und PE2.
Hiernochmal zum nachsehen:
http://www.hoelscher-hi.de/hendrik/light/dmxmodul/dmx_sch.gif
 

Anhänge

  • DMX-Startadressengeber Kopie.png
    DMX-Startadressengeber Kopie.png
    132,5 KB · Aufrufe: 29
Aha, ich sehe du willst eine Hardware-Entprellung machen. PortB und D sind dann für die 9 Ausgänge reserviert.


Hast du schon ein paar Zeilen geschrieben?
 
Nein noch nicht. Also erstmal geht es darum, dass ich weiß, wie man die verschiedenen Zustände (A_0, A_1....) wie oben beschrieben definiert. Also das der Mikrocontroller weiß, dass wenn dort A_1 steht: Ok, die Pins an und die aus.

Ist eine Programm-Tastenentprellung denn leichter zu realsieren?
 
Ich hoffe ich hab verstanden was ich meine.

Irgendeiner dieser Codefetzen hilft dir sicher weiter:

Zuerst würde ich mir eine Wahrheitstabelle für die 7Segmentanzeige anlegen:
Code:
unsigned char array[] = {	0b00000000,//0
			0b00000000,//1
			0b00000000,//2
			0b00000000,//3
			0b00000000,//4
			0b00000000,//5
			0b00000000,//6
			0b00000000,//7
			0b00000000,//8
			0b00000000};//9


Fange danach doch einfach mit einer Hauptschleife an:
Code:
int main(void)
{
  /*
  Variablen Definieren.
  z.b. auch das Array
  */ 

  while(1)
  {
    /*
    hier villeicht eine Funktion aufrufen, die sicherstellt 
    dass die Schleifendurchläufe nicht zu kurz werden.
    Die Transistoren sollen nicht zu oft schalten.
    */ 

     /*
    Taster Abfragen.
    */

    /*
    Zeit sich um die 7Seg-Anzeige zu kümmern
    */ 
  }
  return 0;
}


Ich kann dir verraten, dass du ein paar Variablen brauchen wirst.
1) Dein Programm muss sich merken welche ziffer deiner 3 7Seg-Anzeigen es gerade Anzeigt.
unsigned char Ziffer=0;

2)Dein Programm muss sich merken welchen Welchen Zählwert es gerade ausgibt. Da dafür aber ein byte nicht reicht;
int Zaehlwert=0;

3) Du brauchst für die Flankenerkennung beider Taster jeweils einen Merker. Das Programm muss sich daran erinnern können ob der Taster bei dem letzten Schleifendurchlauf gedrückt war.
unsigned char letzteTastenposition1,letzteTastenposition2;

3)Wenn du erreichen willst, dass der Zähler umso schneller zählt je länger die Taste gedrückt wird, musst du dir selber was einfallen lassen. Das dürfte dir aber nicht schwer fallen wenn du mal den anderen Teil am laufen hast.


Dass das Ausgeben des Zählwertes zur DMX Anlage ein Kinderspiel ist dürfte dir sicher schon aufgefallen sein.
Code:
PORTB=   Zaehlwert & 0x00FF;
PORTD=  (Zaehlwert & 0x01FF)>>8;

Bezüglich dem Tastenentprellen per Software: Jeder wie er mag.

Wenn dein Programm dann ganz professionell wirken soll kannst du noch einen Taster einbauen der den aktuellen Zählwert in den EEPROM speichert, beim einschalten ladet sich das Programm dann eben diesen Wert.
 
Ich schaue gleich mal, ob ich die Grundstruktur mit Text (bzw Code) füllen kann.
Kann man das nicht so einstellen, dass er den aktuellen Wert automatisch ins EEPROM Speichert?
 
Nein das musst du schon explizit so programmieren.

Was mich interessieren würde:
Schreib mal eine Funktion die dir den Zählwert(also einen int) in 3 Ziffern von 0 bis 9 umwandelt.
Tipps: Es hilft ungemein dass Computer immer abrunden.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)