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