Hallo erstmal! Ich frag mal hier im forum die ganzen schlauen leute, denn ich komm einfach nicht weiter! Ich arbeite an meinem Berufsabschlussprojekt (drehzahlmesser) und komm einfach nicht auf den richtigen Lösungsansatz. Standkunkt ist: Ich habe einen Mega16, welcher mich wunderbar die werte 1-27 (ich habe iene LED-Kette mit 27 LEDs, deswegen die ungerade Zahl) ausgibt, jedoch oist diese Binär und ich benötige sie auf "bool" - ich nehme zumindest an, dass diese Ausgabeweise so heisst. Ich habe mal ein Logikdiagramm erstellt, wie ich das decodiert haben muss: | Binär | Ausgabe | ---------------------------------------------- |0000_0000|0000_0000_0000_0000_0000_0000_0001| -> 01 |0000_0001|0000_0000_0000_0000_0000_0000_0011| -> 02 |0000_0010|0000_0000_0000_0000_0000_0000_0111| -> 03 |0000_0011|0000_0000_0000_0000_0000_0000_1111| -> 04 |0000_0100|0000_0000_0000_0000_0000_0001_1111| -> 05 |0000_0101|0000_0000_0000_0000_0000_0011_1111| -> 06 |0000_0110|0000_0000_0000_0000_0000_0111_1111| -> 07 |0000_0111|0000_0000_0000_0000_0000_1111_1111| -> 08 |0000_1000|0000_0000_0000_0000_0001_1111_1111| -> 09 |0000_1001|0000_0000_0000_0000_0011_1111_1111| -> 10 |0000_1010|0000_0000_0000_0000_0111_1111_1111| -> 11 |0000_1011|0000_0000_0000_0000_1111_1111_1111| -> 12 |0000_1100|0000_0000_0000_0001_1111_1111_1111| -> 13 |0000_1101|0000_0000_0000_0011_1111_1111_1111| -> 14 |0000_1110|0000_0000_0000_0111_1111_1111_1111| -> 15 |0000_1111|0000_0000_0000_1111_1111_1111_1111| -> 16 |0001_0000|0000_0000_0001_1111_1111_1111_1111| -> 17 |0001_0001|0000_0000_0011_1111_1111_1111_1111| -> 18 |0001_0010|0000_0000_0111_1111_1111_1111_1111| -> 19 |0001_0011|0000_0000_1111_1111_1111_1111_1111| -> 20 |0001_0100|0000_0001_1111_1111_1111_1111_1111| -> 21 |0001_0101|0000_0011_1111_1111_1111_1111_1111| -> 22 |0001_0110|0000_0111_1111_1111_1111_1111_1111| -> 23 |0001_0111|0000_1111_1111_1111_1111_1111_1111| -> 24 |0001_1000|0001_1111_1111_1111_1111_1111_1111| -> 25 |0001_1001|0011_1111_1111_1111_1111_1111_1111| -> 26 |0001_1010|0111_1111_1111_1111_1111_1111_1111| -> 27 ---------------------------------------------- gibt es einen solchen baustein /bausteine die mir das so dekodieren? Wenn ja, wie heisst dieser /diese? Ich wäre euch echt dankbar, wenn ihr mir helfen könnt! Falls noch informationen benötigt werden stehe ich gern zur Verfügung! Grüsse Andreas
Also ich würde es mit I2C Bausteinen oder Schieberegistern realisieren... Thomas
Gibt es. Heisst Mega16 + Porterweiterung mit 4 kaskadierten Schieberegistern. Normalen HC16x oder entsprechenden LED-Treibern.
aber schieberegister schieben doch die werte durch und warten nicht bis die nächte 1 kommt oder? ich hab ehrlich gesagt noch nie etwas mit schieberegistern gemacht. Ich verwende bereits einen mega16 für mein restliches programm, kann man 2 mega16 zusammenschalten? dann wüsste ich wie ich es mach, denn der hat ja 32 ausgänge... Grüsse Andy
Hallo, es gibt decoder bausteine, 3 auf 8 bzw 4 auf 16 zum beispiel 74xx154 soltle gehen, da nimmst Du dann halt 2 Stück von. Dann brauchts Du wohl noch irgendwas dahinter was den strom der Leds treiben kann. Eckhard
prinzipiell kannst du das mit dem ATMEGA16 realisieren. Genug Pins dafür hat er. Deine Lösung steht schon da. Du hast eine Tabelle mit 27 Einträgen. In jedem steht die zugehörige Kodierung (deine 27 Bit) Diese Bits teilst du jetzt auf die PORTs auf, da du beim AVR immer nur 8Bit je Port setzen kannst. Bsp. 1. 8Bit PortA,2. 8Bit PortB, etc. Du solltest die LEDs nicht direkt an die Portpins anschliessen da bei dieser Anzahl wahrscheinlich der maximal zulässige Strom überschritten wird. Alternative wäre ein Schieberegister, da würdest du weniger Portpins verbrauchen.
ich lade schnell das programm vom einen rechenr auf den anderen, das dauert paar minuten, dann seht ich das ganze programm. Ich hab schon 95% des Mega16 belegt. Ich muss neben der LED-ausgabe noch ein 16x2 LCD display ansteuern. Programm folgt sofort... Andreas
hier ist das programm... ich weiss dass es ein bischen hingetrickst ist ;-) aber es funktioniert nun soweit
Willst du mit dem Programmausdruck Tapeten dekorieren? Zumindest grafisch macht das ja was her. Freilich kann ich mit nicht vorstellen, dass Bascom keine Tabellen hat.
Wenn man Schieberegister benutzt, sollte es ziemlich einfach sein, die geforderte Funktion zu realisieren, indem man einen Pin setzt (Daten) und entsprechend viele Takte (1-27 oder so) an das Schieberegister überträgt. Sobald sich der auszugebene Wert ändert, löscht man die Schiebersgister und schreibt den neuen Wert hinein. Das sollte ein Fünfzeiler sein...
mein kollege erzählte mir gerade was von Latch-schieberegistern die die auszugebende werte speichern und dann auf einmal ausgeben. Das wäre ja genau das was ich benötige. Doch wie schreibe ich das in das schieberegister, das mir auch das richtige ausgegeben wird? ich habe ja bis jetzt nur binärzahlen... Andreas
Und wieder ein Problem mit der Darstellung von Zahlen. Deine Binärzahlen (0b00000000 bis 0b00011010) sind nichts anderes als eine andere Darstellungsform der Dezimalzahlen von 0 bis 26. Prinzipiell geht das so: (1) setze Daten-Pin (2) gib einen Takt aus (3) ist der Zähler = 0? (4) verlasse Schleife (5) ziehe 1 vom Zähler ab (6) springe zu (2) Das sollte sich auch in BASCOM umsetzen lassen...
Wie schon mehrfach gesagt: Mach dir eine Tabelle. Deinen Wert nimmst du als Index in die Tabelle und der Tabelleneintrag sagt dir welche Bits zu setzen sind.
@Karl-Heinz: Hab ich da was übersehen, oder wieso "schreien" hier alle nach einer Tabelle? Es geht doch einfach um die Anzahl eingeschalteter LEDs, die zwischen 1 und 27 (linear) variieren kann. Dafür braucht man IMHO keine Tabelle. Das Listing habe ich bis jetzt erfolgreich nicht beachtet.
Da hast du natürlich recht. Das 'Muster' kein ganz einfach erzeugt werden. Ich nehm für sowas gerne Tabellen, da ich dann eine gewisse Flexibilität im auszugebenden Muster habe. Ist für den gegenständlichen Fall wahrscheinlich Overkill, aber wie sagen die Amerikaner: old habit
@Andreas: Quote:""Ich verwende bereits einen mega16 für mein restliches programm, kann man 2 mega16 zusammenschalten? dann wüsste ich wie ich es mach, denn der hat ja 32 ausgänge."" Das gesamte Projekt passt komplett in einen ATMega8. Die Lösung: Multiplex. Die LEDs in 4 Gruppen zu je 8 LEDs zusammenfassen, die Gruppen jeweils über BC337 nacheinander durchschalten, die jeweilige Einzel-LED durch Auflegen des entsprechenden Bitmusters einschalten. Nimmt man noch den LCD dazu, macht das 13 Portpins bei 32 LEDs. Suche mal hier im Forum nach Multiplex / Zeitmultiplex oder auch 7-Segment-Anzeige, da wird sowas auch gemacht. Und das 30 Kilometer lange Select Case-Teil ist wohl auch eleganter zu lösen. Gruss Jadeclaw.
@ Jadeclaw Also zum 30-Km-langen-case-dings; ich würde es ja gern anders machen, doch die werte verlaufen nicht linear. Ichmesse die zeit zwischen den impulsen und nicht von ansteigender bis ansteigender flanke (wenn ich das könnte wär alles einfach, doch der mega16 will irgendwie nicht) also ich mess a, nicht b /\ /\ / \ / \ / \ / \ _/ \___________/ \_________ <----a----> <---------b--------> wie meinst du das genau mit multiplexen? ich brauch die werte relativ schnell auf der anzeige, ist das möglich? Andreas
Die eine oder andere Tabelle empfiehlt sich, um den oben gezeigten Code so umzuformulieren, dass er den Mega16 nicht zu 95% auslastet.
meine variante: nimm: 74hc595 , (8bit schiebe+latch), 4x , gibt 32 bit, du nimmst 27 davon. am avr 3 pins: clk, data, latch für die hc595. an den pins ca 300 ohm + led , 27 mal. tabelle is wohl ein witz... zb so: (pseudo-code): r=wert for i=1 bis 27 if r>0 : data-pin =1 else data-pin =0 clk-pin 1x hi-lo (= 1 takt) r=r-1 next i latch-pin 1x hi-lo (ergebnis auf leds laden ) das wars...
noch kürzer: r=wert+1 data-pin=1 do clk-pin 1x hi-lo (= 1 takt) r=r-1 while r>0 latch-pin 1x hi-lo (ergebnis auf leds laden )
okay ich besorg mir mal das datenblatt für den 74hc595 und les das mit mal durch. Ich muss gestehn dass ich noch nie was mit tabellen gemacht hab, doch heut mittag werd ich mir das mal bei Bascom durchlesen... grüsse Andreas
*rahul: im prinzip ja, aber.... wo setzt du led=off , die nullen? du schiebst nur 1er rein, sonst wäre extra clr-signal nötig - oder ? :-)
> noch kürzer: > > r=wert+1 > data-pin=1 > do > clk-pin 1x hi-lo (= 1 takt) > r=r-1 > while r>0 Dann brauchst du aber noch eine 2-te Schleife die dir vorher die entsprechende Anzahl an 0-en ausgibt, falls du das Schieberegister nicht hardwaremaessig auf 0 zurücksetzen kannst.
ja, dazu bräuchte man dann wirklich noch den Reset-Pin. Hatte ich vergessen. Schuldigung.
1 Portpin (+Resetbeschaltung) und 3x 4017er dekadischer Zähler nehmen ... dann muss für den Wert 22 eben der eine Pin 22 mal getoggelt...
Gibt auch n Multiplexer-Demultiplexer IC mit dem ich mal das parallele 4-stellige BCD-Wort + Konfigurationsdaten eines 1969er Digitalvoltmeters mit Nixieröhren durch den Druckerport in einen PC geschoben habe, das war eine Datenleitung und natürlich 5 Adressleitungen... war auf jeden Fall nach 1996 :-) Hendi
Wei bekomm ich denn in eine Tabelle 2 werte gleichzeitig? ich hab hier n beispiel: dim i as byte dim x(16) as byte retore Value_table do for i = 1 t0 16 portb = X(i) waitms 250 next loop end Value_table ' 0 1 2 3 4 5 6 7 data &h40, &h79, &h24, &h30, &h19, &h12, &h02, &h78 ' 8 9 A B C D E F data &h00, &h10, &h08, &h03, &h46, &h21, &h06, &h0E Das ist die ansteuerung von einer 7-segment anzeige. Wie kann ich nun sagen dass wenn ich von wert 8 die daten haben möchte der mir nicht nur einen wert geben kann (also x) sondern auch noch n zweiten (y) ist das überhaupt realisierbar? Grüsse Andreas
Wenn Du einen 16Bit Wert haben willst, mache die Tabelle 16bittig. Wenn Du 2 8Bit Werte haben willst, mache die Tabelle 2-dimensional (geht sowas in Basic ?). Ich kann Dir nur zeigen, wie das in C geht. Peter
ich schreib leider mein programm ist bascom. ich hab leider auch keien erfahrung mit tabellen - ist mein erster versuch mit tabellen :-[ Grüsse Andreas
klar bascom kann so einiges was ihr dem nicht zumutet ich würde so vorgehen: 27 ausgänge entsprechen 4 ports 0: 'port1, port2,port3,port4 data &b0000000,&b0000000,&b0000000,&b0000001 1: 'port1, port2,port3,port4 data &b0000000,&b0000000,&b0000000,&b0000011 usw. dann in deiner routine Case 6401 To 9995 Drehzahl = 0900 Test = "01" ' Porta = &B1111_1110 restore 0 =========== wenn du dann irgendwo in deiner ausgabe einfach read x 'hier liesst du das erste byte ein vom restored label ein 'jetzt musst du das byte irgendwie ausgeben read x 'hier liesst du das zweite byte ein vom restored label ein usw wie du die daten ausgibst wiss ich nicht wollte dir nur zeigen wie du mit tabellen arbeiten kannst
Deien Idee find ich klasse! doch nur hab ich nicht alle 4 ports vom mega16 frei :-( aaaber, wenn ich das irgendwie in ein scheiberegister (74HC595) reinbekomm wäre das die eleganteste lösung, oder was meinst du? Grüsse Andreas
Na klar http://www.mikrocontroller.net/articles/Porterweiterung_mit_SPI 4 stück davon, an den hardware spi vom atmega und los gehts.liesst du halt die 4 werte mit einmal ein read a read b read c read d dann gibst du sie aus ich glaube mit spiout oder so den m32 tauschst du gegen nen m32 und dann klappts auch mitm speicherplatz. wird das beste sein. allein die tabelle wird dich ca 108 bytes kosten. wird dann also eng
@Sebastian, "den m32 tauschst du gegen nen m32 und dann klappts auch mitm speicherplatz. wird das beste sein. allein die tabelle wird dich ca 108 bytes kosten. wird dann also eng" Leute, Leute. Ich hab ja nichts gegen Tabellen, aber bitte dann auch dort, wo es was bringt. Nur um 0 ... 32 Einsen rauszuschieben ist ne Tabelle definitiv Overkill. Anbei mal, wie so ne Schiebeschleife in C aussieht (ich kann kein Basic). Tut mir ja leid, daß die komplette Routine leider nur 18 Worte (36 Byte) verbraucht. Dem Mega32 wird dann der Magen knurren, weil er so leer ist.
1 | #include <io.h> |
2 | |
3 | #define HC595_SC PA0 // Schiebetakt
|
4 | #define HC595_RC PA1 // Registertakt
|
5 | #define HC595_DI PA2 // Dateneingang
|
6 | |
7 | |
8 | void shift32( unsigned char bit_nr ) // bit_nr = 0 ... 32 |
9 | {
|
10 | unsigned char i; |
11 | |
12 | DDRA |= 1<<HC595_SC^1<<HC595_RC^1<<HC595_DI; // als Ausgänge |
13 | |
14 | PORTA &= ~(1<<HC595_SC^1<<HC595_RC^1<<HC595_DI); // alles auf Low |
15 | |
16 | for( i = 32; i; i-- ){ // Schleife 32 mal rausschieben |
17 | |
18 | if( i == bit_nr ) |
19 | PORTA |= 1<<HC595_DI; // DI = 1 |
20 | |
21 | PORTA |= 1<<HC595_SC; // SC = 1 |
22 | PORTA &= ~(1<<HC595_SC); // SC = 0 |
23 | }
|
24 | |
25 | PORTA |= 1<<HC595_RC; // RC = 1 |
26 | PORTA &= ~(1<<HC595_RC); // RC = 0 |
27 | }
|
Peter
ich kann kein c... und dein mega32 kann ich auch nicht verwenden, da man den extra kaufen müsste und das wäre nicht so klasse. das mit den einsen und nullen geht ja sicehrlich mit der For-Next schliefe (die wo in C "...for( i = 32; i; i-- ){..." so aussieht) doch wie das dann einzeln geht zerbrech ich mir mal jetzt den kopf ;-) Andreas
Hatte ich das in http://www.mikrocontroller.net/forum/read-1-358095.html#358130 nicht schon lange geschrieben (vielleicht in die andere Richtung)?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.