Forum: Mikrocontroller und Digitale Elektronik 5 eingänge 27 Ausgänge?


von Andreas (Gast)


Lesenswert?

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

von tf1973 (Gast)


Lesenswert?

Also ich würde es mit I2C Bausteinen oder Schieberegistern
realisieren...

Thomas

von A.K. (Gast)


Lesenswert?

Gibt es. Heisst Mega16 + Porterweiterung mit 4 kaskadierten
Schieberegistern. Normalen HC16x oder entsprechenden LED-Treibern.

von Andreas (Gast)


Lesenswert?

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

von Eckhard (Gast)


Lesenswert?

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

von Wolfram (Gast)


Lesenswert?

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.

von A.K. (Gast)


Lesenswert?


von Andreas (Gast)


Lesenswert?

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

von andreas (Gast)


Angehängte Dateien:

Lesenswert?

hier ist das programm... ich weiss dass es ein bischen hingetrickst ist
;-) aber es funktioniert nun soweit

von A.K. (Gast)


Lesenswert?

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.

von Rahul (Gast)


Lesenswert?

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...

von Andreas (Gast)


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

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...

von Karl heinz B. (kbucheg)


Lesenswert?

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.

von Rahul (Gast)


Lesenswert?

@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.

von Karl heinz B. (kbucheg)


Lesenswert?

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

von Jadeclaw D. (jadeclaw)


Lesenswert?

@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.

von Jan (Gast)


Lesenswert?

Vielleicht hilft Dir das weiter:
http://focus.ti.com/lit/ds/symlink/sn74hc573a-q1.pdf

Gruss, Jan

von Andreas (Gast)


Lesenswert?

@ 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

von A.K. (Gast)


Lesenswert?

Die eine oder andere Tabelle empfiehlt sich, um den oben gezeigten Code
so umzuformulieren, dass er den Mega16 nicht zu 95% auslastet.

von alfsch (Gast)


Lesenswert?

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...

von Rahul (Gast)


Lesenswert?

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 )

von Andreas (Gast)


Lesenswert?

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

von alfsch (Gast)


Lesenswert?

*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 ? :-)

von Karl heinz B. (kbucheg)


Lesenswert?

> 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.

von Rahul (Gast)


Lesenswert?

ja, dazu bräuchte man dann wirklich noch den Reset-Pin.
Hatte ich vergessen. Schuldigung.

von Unbekannter (Gast)


Lesenswert?

Das gibt's auch in Hardware. ULN-irgendwas.

von >.......> (Gast)


Lesenswert?

1 Portpin (+Resetbeschaltung)
 und 3x 4017er dekadischer Zähler nehmen ... dann muss für den Wert 22
eben der eine Pin 22 mal getoggelt...

von don hendi (Gast)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

ich schreib leider mein programm ist bascom. ich hab leider auch keien
erfahrung mit tabellen - ist mein erster versuch mit tabellen
:-[

Grüsse Andreas

von Sebastian Heyn (Gast)


Lesenswert?

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

von Sebastian Heyn (Gast)


Lesenswert?

schau einfach mal nach restore in der hilfe

von Andreas (Gast)


Lesenswert?

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

von Sebastian Heyn (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Lesenswert?

@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

von Andreas (Gast)


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.