www.mikrocontroller.net

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


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tf1973 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich würde es mit I2C Bausteinen oder Schieberegistern
realisieren...

Thomas

Autor: A.K. (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Eckhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: andreas (Gast)
Datum:
Angehängte Dateien:

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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jan (Gast)
Datum:

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

Gruss, Jan

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

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

Autor: alfsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 )

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: alfsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ? :-)

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rahul (Gast)
Datum:

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

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das gibt's auch in Hardware. ULN-irgendwas.

Autor: >.......> (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: don hendi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian Heyn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian Heyn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau einfach mal nach restore in der hilfe

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian Heyn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na klar
http://www.mikrocontroller.net/articles/Porterweit...

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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

#include <io.h>

#define HC595_SC PA0  // Schiebetakt
#define HC595_RC PA1  // Registertakt
#define HC595_DI PA2  // Dateneingang


void shift32( unsigned char bit_nr ) // bit_nr = 0 ... 32
{
  unsigned char i;

  DDRA  |= 1<<HC595_SC^1<<HC595_RC^1<<HC595_DI;    // als Ausgänge

  PORTA &= ~(1<<HC595_SC^1<<HC595_RC^1<<HC595_DI); // alles auf Low

  for( i = 32; i; i-- ){        // Schleife 32 mal rausschieben

    if( i == bit_nr )
      PORTA |= 1<<HC595_DI;     // DI = 1

    PORTA |= 1<<HC595_SC;       // SC = 1
    PORTA &= ~(1<<HC595_SC);    // SC = 0
  }

  PORTA |= 1<<HC595_RC;         // RC = 1
  PORTA &= ~(1<<HC595_RC);      // RC = 0
}


Peter

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte ich das in
http://www.mikrocontroller.net/forum/read-1-358095...
nicht schon lange geschrieben (vielleicht in die andere Richtung)?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.