5 eingänge 27 Ausgänge?

Gast #338174
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
Gast #338177
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
Gast #338178
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
Gast #338179
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.
Gast #338181
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
Gast #338184
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...
Gast #338185
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
Gast #338186
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...
Gast #338188
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.
#338190
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.
Gast #338192
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
Gast #338194
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...
Gast #338196
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
Gast #338202
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
Gast #338203
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
Gast #338204
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
Gast #338206
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
Gast #338208
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
Gast #338209
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
Gast #338210
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
Gast #338211
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren