Guten Tag,
ich bitte um Hilfe:
um besser C zu verstehen, habe ich eine Testschaltung gemacht: ATmega88
kommuniziert mit MAX7219. Problem ist folgendes:
wenn die Ziffer 3 von 0 bis 7 ist, ist alles OK. Wenn aber 8 oder 9,
bekomme ich in Ziffer 4-7 statt zu erwartenden Ziffer nur "FFFF".
Hier ist C-Text von BCD-Funktion (ich denke, das Problem liegt hier):
Aber Compiler sagte, ich bin aus dem zulässigen Bereich.
Ich habe vieles ausprobiert, kapiere aber noch nicht...
Diese Variante gibt allerdings richtige Ergebnis:
Maxim B. schrieb:> wenn die Ziffer 3 von 0 bis 7 ist, ist alles OK. Wenn aber 8 oder 9,> bekomme ich in Ziffer 4-7 statt zu erwartenden Ziffer nur "FFFF".
Glaube ich dir nicht so recht. Das Problem sollte bei Ziffer 5 (wenn 8
oder 9) auftauchen, nicht bei Ziffer 3.
Grund:
1
b=(ziff5<<12)|(ziff6<<8)|(ziff7<<4)|(ziff8);
hier wird die rechte Seite in signed int gerechnet und dementsprechend
findet eine Sign-Extension statt beim Zuweisen an b.
@ Maxim Burtsev (Firma: BBO-Potsdam) (max182)
>Hier ist C-Text von BCD-Funktion (ich denke, das Problem liegt hier):
Das Problem liegt vor deiner Tastatur. 8-0
Schon mal was von Schleifen und Arrays gehört?
Mach lieber erstmal einen Test mit konstanten Daten, um zu prüfen ob
deine SPI-Ansteuerung OK ist. DANN kannst du dein bin2bcd Routine
testen.
@ Stefan Ernst (sternst)
> b = (ziff5<<12)|(ziff6<<8)|(ziff7<<4)|(ziff8);>hier wird die rechte Seite in signed int gerechnet
INT ist aber nicht long! Zumindest nicht auf deinem Compiler (avr gcc?)
>und dementsprechend findet eine Sign-Extension statt beim Zuweisen an b.
Nö. Eher so.
> b = ((long)ziff5<<12)|((long)ziff6<<8)|((long)ziff7<<4)|((long)ziff8);
Falk B. schrieb:> INT ist aber nicht long! Zumindest nicht auf deinem Compiler (avr gcc?)>>>und dementsprechend findet eine Sign-Extension statt beim Zuweisen an b.>> Nö. Eher so.>>> b = ((long)ziff5<<12)|((long)ziff6<<8)|((long)ziff7<<4)|((long)ziff8);
Wie kommst du darauf, dass die rechte Seite in long gerechnet würde?
Bei seinem Code wird sie in int gerechnet.
Danke an alle!
Mit SPI und mit MAX7219 gibt es kein Problem, das habe ich mit anderen
Tests festgestellt.
Auf die in MAX7219 eingebaute Möglichkeit, 7-segm- Decoder zu nutzen,
verzichte ich aus zwei Gründen: dort sind die Zeichen ab 10 bis 15
anders, keine "abcdef". Und ich wollte auch die Funktion fürs 7-segm.
testen.
Untere Programmbeispiel arbeitet korrekt, mir geht es hier vor allem um
die Erklärung, warum die Zeilen wie
falsche Ergebnis bringen (d.h. nicht was ich erwartete). Ich brauche
das zu klären, um ähnliche Probleme in anderen Programmen zu vermeiden.
Ich habe mit unsigned und mit signed ausprobiert, das war immer
gleiches; wenn in Ziffer 3 (Ziffer 0 auf MAX7219 ist die kleinste) 8
oder 9, dann vier höhere Ziffer zeigen "FFFF".
Vielen Dank!
P.S. Schleifen kenne ich. Aber daß das Pflicht ist, Schleifen zu
verwenden - das habe ich bisher nicht gewußt. Ich glaube, Compiler ist
selbst genug klug, um alles passend zu optimieren. Oder? Wenigstens, wie
ich versucht habe, eine Aufgabe mit Assembler und dann mit C zu machen -
kam überraschend vor, daß C-Variante schneller und mit weniger Hex-Code
war, als Assemblers :) Das hat mich für C noch mal überzeugt.
Übrigens, volle Code von Test-Programm: ich werde für Kritik sehr
dankbar.
@ Maxim Burtsev (Firma: BBO-Potsdam) (max182)
>anders, keine "abcdef". Und ich wollte auch die Funktion fürs 7-segm.>testen.>Untere Programmbeispiel arbeitet korrekt, mir geht es hier vor allem um>die Erklärung, warum die Zeilen wie>b = (ziff1<<28)|(ziff2<<24)|(ziff3<<20)|(ziff4<<16)|(ziff5<<12)|>(ziff6<<8)|(ziff7<<4)|(ziff8);
eben WEIL hier die Cast auf long fehlen!
Deshalt HIER so!
> falsche Ergebnis bringen (d.h. nicht was ich erwartete). Ich brauche>das zu klären, um ähnliche Probleme in anderen Programmen zu vermeiden.
Du musst ganz andere Dinge klären, u.a. ein paar Programmiergrundlagen.
>P.S. Schleifen kenne ich. Aber daß das Pflicht ist, Schleifen zu>verwenden - das habe ich bisher nicht gewußt.
Mensch bist du cooool!
> Ich glaube, Compiler ist>selbst genug klug, um alles passend zu optimieren. Oder?
Wirst du nach Programmzeilen bezahlt?
1
unsignedlongpreobras_bin10bcd3(unsignedlonga){
2
longb=0;
3
inti;
4
5
for(i=0;i<8,i++){
6
b>>=4;
7
b|=(a%10)<<28;
8
a/=10;
9
}
10
11
returnb;
12
}
>Wenigstens, wie>ich versucht habe, eine Aufgabe mit Assembler und dann mit C zu machen ->kam überraschend vor, daß C-Variante schneller und mit weniger Hex-Code>war, als Assemblers :) Das hat mich für C noch mal überzeugt.
Wenn das unser Moby hört!
Falk B. schrieb:> eben WEIL hier die Cast auf long fehlen!
Danke für die Erklärung!
> Deshalt HIER so!> Du musst ganz andere Dinge klären, u.a. ein paar Programmiergrundlagen.
Ich weiß das. Mit der Zeit erlerne ich auch das.
Viele Grüße!
@ Maxim Burtsev (Firma: BBO-Potsdam) (max182)
>8 mal % und 8 mal Dividieren...
Darauf ist der Code nicht optimiert, sondern auf minimale Schreibarbeit.
>Eigentlich wollte ich gerade Dividieren>ohne akute Notwendigkeit vermeiden: zu langsam.
Ach so? Wieviele Millionen Umwandlungen dieser Art willst du denn
machen, daß die Geschwindigkeit sooo wichtig ist?
https://www.mikrocontroller.net/articles/AVR-GCC-Codeoptimierung#Prinzipien_der_Optimierung
Und wie schnell ist dein Code bei der Umwandlung der Zahl 99999999?
Falk B. schrieb:> Ach so? Wieviele Millionen Umwandlungen dieser Art willst du denn> machen, daß die Geschwindigkeit sooo wichtig ist?>
In Test wohl nicht wichtig. Wenn aber Text woanders stehen wird, dann
wird schon wichtig.
Wenn ich schon etwas lerne, dann praxisorientiert. Für die Zukunft.
Schleifen sind natürlich eine schöne Sache.
Allerdings habe ich noch Problem damit.
Z.B. es gibt Massiv von Zähler. Mit jedem Zähler ist LED verbunden, wenn
Zähler bis 0 zählt, dann wird LED abgeschaltet. Es ist mir bisher nicht
gelungen, Befragung und Verändern von Zähler und Löschen von LED mit
einer Schleife zu machen.
Meine Lösung ist leider nur so:
Maxim B. schrieb:> unsigned char semisegment(unsigned char e)> {> switch(e) { case 0: e=0x7e; break;> case 1: e=0x30; break;> ...> case 15: e=0x47; break;> default: e=0; break;> }> return e;> }
Guck dir mal an, was man mit const Array machen kann. Das macht aus der
Funktion einen Einzeiler.
Irgendwie mit progmem. Aber ich kapiere das noch nicht ganz...
Ich habe zuerst das so gemacht, wie ich verstehe. Damit nicht alles
wegen einem klemmt. Das ist nicht optimal, klar - aber arbeitet.
Gleich habe ich noch ADC ausprobiert. Komisch - aber das arbeitet! :)
So mit kleinen Schritten möchte ich die Elementen eineignen, die für
größere Projekte notwendig sind. Und wenn das etwas nicht optimal wird -
dann werde ich weiter lernen. Oder auch so lassen - wenn MCU auch so
macht, was ich davon erwarte. :)
@ Maxim Burtsev (Firma: BBO-Potsdam) (max182)
>Wenn ich schon etwas lerne, dann praxisorientiert. Für die Zukunft.
Dann solltest du lernen, dass man die Daten der 8 Digits, die man
sowieso byteweise an den MAX7219 schickt, nicht vorher "aufwändig" in
einen 32 Bit Wert presst. Eher so. Damit spart man sich tonnenweise
Schieberei, was besonders auf kleinen Controllern CPU-Zeit kostet.
Ausserdem kann man die Daten deutlich einfacher weiterverarbeiten, ohne
sie über Schieberei und Maskierung wieder auseinandernehmen zu müssen.
>Schleifen sind natürlich eine schöne Sache.>Allerdings habe ich noch Problem damit.
Das musst du schnellstens ändern, die sind elementar.
>Z.B. es gibt Massiv von Zähler. Mit jedem Zähler ist LED verbunden, wenn>Zähler bis 0 zählt, dann wird LED abgeschaltet. Es ist mir bisher nicht>gelungen, Befragung und Verändern von Zähler und Löschen von LED mit>einer Schleife zu machen.
Das Zauberwort heißt Index.
1
voidledgasch(void){
2
inti;
3
4
for(i=0;i<16;i++){
5
if(tai_V[i]>0){
6
tai_V[i]--;
7
if(tai_V[i]==0){
8
resVL0;// hier muss auch was mit Index her, ANPASSEN
Falk B. schrieb:> was besonders auf kleinen Controllern CPU-Zeit kostet.
Modulo ist wesentlich langsamer als eine Subtraktion und ein Shift.
Das ist meine Erfahrung. Denn ich hatte vorher auch Modulo genutzt und
das hatte den 2313 ziemlich lahm gemacht. Auch der Code hatte sich
erheblich aufgebläht.
Der von mir gepostet Code läuft aktuell auf einem Attiny 2313, mit 3,7
MHz.
Entwicklungsumgebung Atmel Studio 6.2.
@ Maxim Burtsev (Firma: BBO-Potsdam) (max182)
> resVL0; // hier muss auch was mit Index her, ANPASSEN>Hier ist gerade das Problem. Weil:
Da kann man einfach eine Funktion draus machen.
Falk B. schrieb:> @ Maxim Burtsev (Firma: BBO-Potsdam) (max182)>>> resVL0; // hier muss auch was mit Index her, ANPASSEN>>Hier ist gerade das Problem. Weil:>> Da kann man einfach eine Funktion draus machen.
Ist eine Möglichkeit.
Man könnte das ganze auch in eine andere Richtung weitertreiben.
Mit dieser Vorgabe
> Z.B. es gibt Massiv von Zähler. Mit jedem Zähler ist LED verbunden,> wenn Zähler bis 0 zählt, dann wird LED abgeschaltet.
könnte man auch in diese Richtung weiterarbeiten, dass man einen Zähler
nicht einfach nur als eine unsigned int Variable auffasst, sondern als
ein Objekt welches aus
* Zählvariable
* Portdefinition
* Bit an diesem Port
besteht. Also ein
1
structbackCounter
2
{
3
unsignedintvalue;
4
volatileunsignedchar*port;
5
unsignedcharbitmask;
6
};
dann definiert man sich die benötigten Zähler
1
structbackCountercounter[]=
2
{
3
{0,&PORTC,1<<PC3},
4
{0,&PORTC,1<<PC2},
5
{0,&PORTC,1<<PC1}
6
};
und hat damit dann in so einem backCounter Objekt alles beisammen, so
dass eine einzige Decrement Funktion es bearbeiten kann
1
voiddecCounter(structbackCounter*cnt)
2
{
3
if(cnt->value>0)
4
cnt->value--;
5
if(cnt->value==0)
6
*(cnt->port)|=cnt->bitMask;
7
}
bzw. dann eben für alle Counter
1
...
2
for(i=0;i<sizeof(counter)/sizeof(*counter);++i){
3
if(counter[i].value>0)
4
counter[i].value--;
5
if(counter[i].value==0)
6
*(counter[i].port)|=counter[i].bitMask;
7
}
8
...
bzw. dann eben eine entsprechende Setzfunktion, die einen Counter auf
einen bestmmten Wert setzt und gleich auch noch die zugehörige LED
einschaltet
zugegeben, die Portzugriffe optimieren dann nicht mehr so gut. Aber so
schlimm ist das meistens dann auch wieder nicht.
Möglichkeiten gibt es viele und fast immer ist die Copy&Paste
Programmierung mit weiterkopieren eines Codes und ersetzen von ein paar
Konstanten die schlechteste davon.
Vielen Dank!
Mit Struct muß ich noch für mich klären. Variante mit Funktion verstehe
ich schon genug gut.Wird zwar etwas langsamer, als so. Aber ich denke,
für meine Aufgabe ist das nicht so kritisch. Es geht um Pegelmesser:
jeder LED leuchtet bei Überschreitung von Pegel, wird aber mit
Verzögerung gelöscht (für bessere Sichtbarkeit). Ich denke, so eine
Schema läßt sich stromsparender mit ATmega zu machen, als mit LM3915.
Ich habe LED gekauft, die schon bei 0,25 - 0,3 mA ziemlich hell sind. So
wird 2-Kanal-8 Pos.-Indikator bei mittlerem Pegel (die Hälfte LEDs
leuchtet) alles zusammen nicht über 3 mA bei 3,3 Volt fressen. So rechne
ich mindestens.
Maxim B. schrieb:> Vielen Dank!> Mit Struct muß ich noch für mich klären. Variante mit Funktion verstehe> ich schon genug gut.Wird zwar etwas langsamer, als so. Aber ich denke,> für meine Aufgabe ist das nicht so kritisch.
Für die meisten Aufgaben ist so etwas komplett unkritisch, wenn man
ein paar Taktzyklen herschenkt.
@Karl Heinz (kbuchegg) (Moderator)
>> Da kann man einfach eine Funktion draus machen.>Ist eine Möglichkeit.
Das ist die, welche dem OP im Moment am meisten hilft.
>könnte man auch in diese Richtung weiterarbeiten, dass man einen Zähler>nicht einfach nur als eine unsigned int Variable auffasst, sondern als>ein Objekt welches aus
DAS ist was für die höheren Semester. Der OP muss erst einmal die
Grundlagen lernen. Dann reden wir weiter.
Falk B. schrieb:> DAS ist was für die höheren Semester. Der OP muss erst einmal die> Grundlagen lernen. Dann reden wir weiter.
Da gebe ich dir recht.
Er könnte es allerdings auch als Ansporn sehen, sein C drastisch zu
verbessern, ehe er dann auch ein reales Projekt geht.
Und so schwer sind Strukturen dann auch wieder nicht zu verstehen.
@ Karl Heinz (kbuchegg) (Moderator)
>> DAS ist was für die höheren Semester. Der OP muss erst einmal die>> Grundlagen lernen. Dann reden wir weiter.>Da gebe ich dir recht.>Er könnte es allerdings auch als Ansporn sehen, sein C drastisch zu>verbessern, ehe er dann auch ein reales Projekt geht.
Sehe ich nicht so.
>Und so schwer sind Strukturen dann auch wieder nicht zu verstehen.
Ich würde nicht den 3. Schritt vor dem 1. machen wollen. Du bist da
schon ein gutes Stück betriebsblind, denn es geht nicht nur um structs
sondern auch Pointer und Adressen und die dazugehörigen
Dereferenzierungen und Schreibweisen. Das ist für den Anfänger schon
reichlich kryptisch!
>>DAS ist was für die höheren Semester.
Ja, so denke ich auch. Man kann nicht gleich nach 10 Stunden
Orgelunterricht schon Bachsche Fantasie und Fuge g-moll spielen. Manche
können das auch nach 5 Jahren kaum.
Ich denke, mit Programmieren ist das nicht viel anders. Das ist kein
Handwerk sondern Kunst.
@ Maxim Burtsev (Firma: BBO-Potsdam) (max182)
>Ja, so denke ich auch. Man kann nicht gleich nach 10 Stunden>Orgelunterricht schon Bachsche Fantasie und Fuge g-moll spielen. Manche>können das auch nach 5 Jahren kaum.
Wohll wahr.
>Ich denke, mit Programmieren ist das nicht viel anders. Das ist kein>Handwerk sondern Kunst.
Naja, wenn man mal GANZ oben Softwareentwicklung (aka Software Design)
macht, dann vielleicht. Aber in den Normalgegenden ist es "nur"
Handwerk.
@ Karl Heinz (kbuchegg) (Moderator)
>Ich seh schon.>Ich fahr wieder nach China. Die wollen noch was lernen.
Karl Heinz, dein Ansatz ist schlicht nicht soderlich pädagogisch. Du
bringst einem Erstklässler auch keinen Satz des Phytagoras bei . . .,
auch wenn der keine hohe Mathematik darstellt!
Merksatz:
Abraham sacht zu Bebraham: "Kann ich mal dein Cebra ham?". ;-)
Falk B. schrieb:> Naja, wenn man mal GANZ oben Softwareentwicklung (aka Software Design)> macht, dann vielleicht. Aber in den Normalgegenden ist es "nur"> Handwerk.
Musizieren ist auch oft so. Das ist Realität. Trotzdem - die Leute haben
von unseren Konzerten Spaß, sonst kämen sie nicht.
Auch MCU - wenn das Gerät macht, was davon erwartet wird - welcher
Musiker wird drin kucken, ob auf C alles nach besten Regeln stimmt? Das
ist eher das Problem von Künstler selbst, für eigene Selbstgefühl.
Stimmt, daß die Wahrscheinlichkeit von Fehler von Weise abhängig ist.
Wenn es aber um ganz einfache Dinge geht und sowieso viel Flash und Ram
frei bleibt...
Falk B. schrieb:> resVL0; // hier muss auch was mit Index her, ANPASSEN
Lieber Herr Brunner,
ich habe diese Hausarbeit gemacht.
Ergebnis: Ihre Variante ist 350 bytes kleiner. Aber um 3-5 mal
langsamer. D.h. alles hat Preis.
1
#define KPOR0 1100000 // Konst fuer Schwellen, ist gleich Referenz in uV
Falk B. schrieb:> https://www.mikrocontroller.net/articles/AVR-GCC-Codeoptimierung#Prinzipien_der_Optimierung>> https://www.mikrocontroller.net/articles/AVR-GCC-Codeoptimierung#Wie
Ich habe das gelesen...
Also, die Variante ohne Schleifen hat auch Recht fürs Leben?
Warum?
Alle Pins sind schon so besetzt, daß etwas darüber zu machen kaum
möglich erscheint (das ist Grund, warum SPI immer ein- und ausgeschaltet
wird: wenn SPI eingeschaltet, wird MISO als Eingang von Hardware
eingestellt, sonst ist das VL4-Ausgang. Variante mit TQFP auch - nur
zwei LED mehr, sonst alles gleich).
Es gibt keine ATmega x8 mit 1,5 kB Flash, mindestens 4, oder was ich
verwende (ATmega88) hat 8 kB. Ist Programm 1724 Bytes lang oder nur
1374, bleibt sowieso viel Flash unbenutzt. Aber die Variante mit 1724
Bytes ist spürbar schneller, und das ist absolut gratis! Hier ist
Geschwindigkeit nicht absolut erforderlich, wirkt aber positiv auf
Genauigkeit.
1
while(1)
2
{// Einmal in 400 mS mit Ind. MAX7219
3
adclinks=leselinks();
4
adcrechts=leserechts();
5
vyvod_led();// LED Einschalten nach Signal
6
if(FLAG_TIK==1)// Wenn Tik=1
7
{
8
ledgasch();// LED-Zaehler aktualisieren und die mit "0" loeschen
9
FLAG_TIK=0;
10
}
11
#if (max7219_spi) // Wenn Indikator eingeschlossen, dann einmal in 400 mS
12
13
if(FLAG_IND==1)// Wenn IND=1
14
{
15
CLKPR=0x80;// F_CPU=Max
16
CLKPR=K_CLKPR_MAX;
17
ind_max7219(adclinks,0);// ADC-links > indikator ab 0
18
ind_max7219(adcrechts,4);// ADC-rechts > indikator ab 4
19
FLAG_IND=0;
20
21
CLKPR=0x80;
22
CLKPR=K_CLKPR;// F_CPU=Norm
23
}
24
#endif
25
}
Programm macht nichts anderes als mit ADC 2 Eingänge ablesen und
bewerten. Einstimmung geht mit Programm, deshalb gibt es Funktionen für
MAX7219, aber die sind mit #if - #endif nach der Einstimmung aus dem
endgültigen Programm ausgeschlossen (Funktionen für MAX7219 brauchen
relativ viel Zeit). Danach wird das Programm noch um 510 Bytes kürzer,
was übrigens nichts ändert: Flash bleibt um mehrfaches über Bedarf.
In einem anderen Fall wird Schleife vielleicht praktischer, in diesem
Beispiel aber eher nicht (lieber noch mehr F_CPU absenken, um
Stromverbrauch zu reduzieren. Aber ich glaube, bei 500 kHz kann man
schon nicht mehr viel optimieren). Interessant, daß Compiler eigentlich
gleicher Meinung ist! :) Funktion
1
intlesenadc(void)// ADC lesen
2
{
3
ADCSRA|=(1<<ADSC);
4
while(ADCSRA&(1<<ADSC)){}
5
returnADCW;
6
}
macht er inline.
P.S. das ist immer noch nicht realisiert. Ich überlege noch, ob es nicht
besser wird, auf einer Leitplatte gleich 4 Spuren zu machen, und zwar
zusammen mit Vorverstärker und auch Stromversorgung. Es gibt Argumente
dafür und dagegen.
@ Maxim Burtsev (Firma: BBO-Potsdam) (max182)
>Also, die Variante ohne Schleifen hat auch Recht fürs Leben?
Hier nicht, allgemein schon, wenn man die maximale Geschwindigkeit
braucht.
>Es gibt keine ATmega x8 mit 1,5 kB Flash, mindestens 4, oder was ich>verwende (ATmega88) hat 8 kB. Ist Programm 1724 Bytes lang oder nur>1374, bleibt sowieso viel Flash unbenutzt. Aber die Variante mit 1724>Bytes ist spürbar schneller, und das ist absolut gratis!
Sürbar? Wer spürt denn das? Du? Wo? Im Simulator?
Deine CPU langeweilt sich bei der Aufgabe so oder so zu tode!
>Hier ist>Geschwindigkeit nicht absolut erforderlich, wirkt aber positiv auf>Genauigkeit.
Blödsinn.
> CLKPR = 0x80; // F_CPU=Max> CLKPR = K_CLKPR_MAX;> ind_max7219(adclinks,0); // ADC-links > indikator ab 0> ind_max7219(adcrechts,4); // ADC-rechts > indikator ab 4> FLAG_IND = 0;> CLKPR = 0x80;> CLKPR = K_CLKPR; // F_CPU=Norm
Warum stellst du hier den Prescaler für die CPU um? Das ist nicht
sonderlich sinnvoll, zumal die SPI selber einen Prescaler hat. Nutze den
Sleep Mode.
>relativ viel Zeit). Danach wird das Programm noch um 510 Bytes kürzer,>was übrigens nichts ändert: Flash bleibt um mehrfaches über Bedarf.
Du wirst es überleben. Oder nimm einen kleinen Attiny2313 und ein paar
Schieberegister als Porterweiterung, wenn es dich glücklich machen, den
Flash nahzu zu 100% auszunutzen.
>In einem anderen Fall wird Schleife vielleicht praktischer,
Meistens. Denn damit hat man weniger Schreibarbeit und es ist deutlich
übersichtlicher.
> in diesem>Beispiel aber eher nicht (lieber noch mehr F_CPU absenken, um>Stromverbrauch zu reduzieren.
Das macht man anders, siehe oben.
Maxim B. schrieb:> P.S. das ist immer noch nicht realisiert. Ich überlege noch, ob es nicht> besser wird, auf einer Leitplatte gleich 4 Spuren zu machen, und zwar> zusammen mit Vorverstärker und auch Stromversorgung.
Hallo Maxim
Mir ist ehrlich gesagt nicht ganz klar WAS Du eigentlich machen willst.
Willst Du nur einmal ausprobieren, ob Du so ein VU Meter zum laufen
bekommst ?
Oder willst Du eher ein bisschen programmieren ?
Oder einfach nur ein bisschen spielen ?
Oder willst Du eigentlich ein VU-Meter irgendwo einsetzen ?
Dann könnte Dir das Forum vielleicht auch etwas zielgerichteter helfen.
Und Du müsstest nicht viel Geld für eine Platine ausgeben, die nachher
nicht das macht, was Du eigentlich wolltest.
Viele Grüße
Andreas
Falk B. schrieb:>> CLKPR = 0x80; // F_CPU=Max>> CLKPR = K_CLKPR_MAX;>> ind_max7219(adclinks,0); // ADC-links > indikator ab 0>> ind_max7219(adcrechts,4); // ADC-rechts > indikator ab 4>> FLAG_IND = 0;>>> CLKPR = 0x80;>> CLKPR = K_CLKPR; // F_CPU=Norm>> Warum stellst du hier den Prescaler für die CPU um? Das ist nicht> sonderlich sinnvoll, zumal die SPI selber einen Prescaler hat. Nutze den> Sleep Mode.
Weil dadurch nicht nur SPI beschleunigt wird, sondern auch alle
Funktionen, die für BCD u.ä. verantwortlich sind.
Was spricht dagegen? Das brauche ich nur für Abstimmung (weil Vref große
Toleranz hat). Nach Abstimmung wird alles für Indikator raus.
>Oder nimm einen kleinen Attiny2313
Der hat doch kein ADC?
@ Maxim Burtsev (Firma: BBO-Potsdam) (max182)
>>Oder nimm einen kleinen Attiny2313>Der hat doch kein ADC?
Stimmt, hab ich übersehen. Es gibt aber andere Tinys mit ADC.
Solches krampfhafte Sparen von Flash, RAM oder sonstigen Resourcen lohnt
sich nur bei (Groß)serienproduktion. Bei Einzelstücken oder Kleinserien
sind die Kosten für die Hardware meist nebensächlich.
Andreas H. schrieb:> Oder willst Du eigentlich ein VU-Meter irgendwo einsetzen ?
das möchte ich, klar. Ich brauche Schema fünfmal.
Alles, was ich mache, hat immer mehrere Ziele gleichzeitig in Visier.
Natürlich möchte ich auch etwas damit erlernen (schon etwas in dieser
Richtung gegangen, vielen Dank an alle für eure geduldige Erklärungen!).
Wozu ich so etwas brauche? Ich habe einmal bei dem Mitschnitt etwas
erlebt: jemand hat Mikrofonkabel zertreten. Ich habe das leider zu spät
erkannt. So ein Indikator könnte mir damals helfen. Da das eine
Nebenaufgabe ist, wäre es natürlich blöd, dafür zu viel Strom ausgeben -
solange alles von Akku laufen soll.
Entschuldigung - ich möchte hier keinen provozieren. Aber wirklich: ich
verstehe nicht, warum ich Schleife machen muß, solange das nur alles
verlangsamt und Flash auch ohne Schleifen genug bleibt?
Wissen, wie man eine Schleife macht - das möchte ich (und hier hat man
mir erklärt, was ich selber nicht finden konnte: wie man das mit Pins
macht, innerhalb einer Schleife). Verwenden - hier ist zu überlegen.
Gerade in dem Artikel, den mir Herr Brunner gegeben hat, steht:
optimieren kann man für Größe oder für Geschwindigkeit, je nachdem was
man braucht.
Viele Grüße,
@ Maxim Burtsev (Firma: BBO-Potsdam) (max182)
>verstehe nicht, warum ich Schleife machen muß,
Muss nicht, aber es ist meistens günstiger. Sagte ich bereits.
>solange das nur alles>verlangsamt und Flash auch ohne Schleifen genug bleibt?
Denn damit hat man weniger Schreibarbeit und es ist deutlich
übersichtlicher.
Tinys haben bis 20 Pin. ich wollte eine Einheit, die gleich zwei Spuren
bedient. Für jede Spur eigene Schema - das wäre zu viel bei 10 oder 12
Spuren. Alles muß noch in eine Gehäuse vernünftiger Größe passen. So
etwa 300 x 180, damit alle Buchsen bequem liegen und alle LED zu sehen
sind, aber noch zu tragen wäre.
Falk B. schrieb:> Denn damit hat man weniger Schreibarbeit und es ist deutlich> übersichtlicher.
Ja, das stimmt. Viel übersichtlicher. Schließlich kann ich F_CPU bis auf
1 MHz einstellen und Differenz ausgleichen (ADC braucht ungefähr gleiche
Zeit unabhängig von CPU-Freq.), Preis dafür wäre 0,5 mA, das wäre noch
zu verdauen.
Schön, wenn man viele Varianten hat, daß man wählen kann!
Was Sleep betrift: ich habe schon über ADC Noise Reduction Mode gedacht.
Das wird wohl die Richtung für weitere Programmentwicklung. Noch ein
paar hundert uA sparen :) Ob das dem Wandler für negative Spannung nicht
merkbar stört? Was ich in keinem Fall möchte: Subfrequenzen in
Speiseleitungen, die in Klang durchsickern können.
Für Spannungwandler plane ich ATtiny261A - und das mache ich eher mit
Assembler. Oder doch C? :) Das wird ein einfacher Ersatz für 74HC-Serie,
ein IC-Körper statt 6 oder 7.
Andreas H. schrieb:> Und Du müsstest nicht viel Geld für eine Platine ausgeben, die nachher> nicht das macht, was Du eigentlich wolltest.
So viel Geld ist das nicht. Eine Fotoplatine 160x100 für 2,2€, 1 oder 2
Folien, ein bißchen Tinten, ein Löffel NaOH, etwas FeCl3... Etwas
Meckern von meiner Frau vielleicht noch :)
Maxim B. schrieb:>> Und Du müsstest nicht viel Geld für eine Platine ausgeben, die nachher>> nicht das macht, was Du eigentlich wolltest.> So viel Geld ist das nicht. Eine Fotoplatine 160x100 für 2,2€, 1 oder 2> Folien, ein bißchen Tinten, ein Löffel NaOH, etwas FeCl3... Etwas> Meckern von meiner Frau vielleicht noch :)Maxim B. schrieb:>> Oder willst Du eigentlich ein VU-Meter irgendwo einsetzen ?> das möchte ich, klar. Ich brauche Schema fünfmal.
Dann wäre das evtl. eher etwas für Dich. Und macht auch weniger Ärger
mit Deiner Frau ;-)
https://www.itead.cc/open-pcb/pcb-prototyping/2layer-green-pcb-5cm-x-10cm-max.html?___SID=U
Die angegebene Größe ist die Maximalgröße. Die Platine darf also auch
kleiner sein. Andere Maximalgrößen gibt es natürlich auch (z.B. 10cm x
10 cm)
Maxim B. schrieb:> Wozu ich so etwas brauche? Ich habe einmal bei dem Mitschnitt etwas> erlebt: jemand hat Mikrofonkabel zertreten. Ich habe das leider zu spät> erkannt. So ein Indikator könnte mir damals helfen.
Ich verstehe Dein Problem. Aber ist das, was Du vorhast dann eine Lösung
?
Wenn Du gerade am spielen bist, dann kannst Du vermutlich nicht laufend
auf die Anzeige schauen.
Wenn gerade nicht gespielt wird, dann zeigt das VU-Meter nichts an. Auch
kein kaputtes Kabel.
Was für Mikrofone benutzt Du denn? Bei Mikros mit Phantomsspeisung
könntest Du probieren den Abschlusswiderstand zu messen und ggf. EINE
Led einschalten, wenn der Widerstand weg (also Kabel ab) ist.
Das lenkt beim spielen nicht ab (ausser das Mikro ist ab) und geht auch,
wenn gerade nicht gespielt wird.
> Da das eine> Nebenaufgabe ist, wäre es natürlich blöd, dafür zu viel Strom ausgeben -> solange alles von Akku laufen soll.
Aber der Stromverbrauch Deiner Schaltung (die Du gepostet hattest) ist
doch nicht das was der Prozessor verbraucht. Am meisten Strom
verbrauchen Deine LEDs oder? Und die müssen On-Stage schon etwas heller
sein. Sonst siehst Du sie nicht mehr richtig.
Meinst Du nicht, dass Du da an der falschen Stelle Strom sparen willst?
Maxim B. schrieb:> Entschuldigung - ich möchte hier keinen provozieren. Aber wirklich: ich> verstehe nicht, warum ich Schleife machen muß, solange das nur alles> verlangsamt und Flash auch ohne Schleifen genug bleibt?>
Du provozierst keinen (denke ich). Wenn Du nicht fagst bekommst Du auch
keine Antworten. Also frag ;-)
Du musst keine Schleifen nehmen. Es ist das Deine Entscheidung.
Allerdings bieten Schleifen sooo viel Vorteile, dass man sie sehr gerne
benutzt.
Der Code ist viel einfacher lesbar. Vergleiche doch z.B. Deinen Code mit
dem Code den Falk oder Karl-Heinz gepostet haben. Ihr Code ist kürzer
(was nicht notwendigerweise besser sein muss) und es wird auch sehr
schnell klar, wie sich die Variablen von Schritt zu Schritt (also pro
Schleifendurchlauf) verändern.
DU (und nur Du) siehst das bei Deinem Code vieleicht noch auf Anhieb.
Aber andere Leute müssen da Zeile für Zeile genau hinsehen.
Auch deswegen, weil sie vermuten werden "Es gibt bestimmt einen
speziellen Grund, warum er keine Schleife genommen hat".
Und wenn Du in 5 Jahren noch einmal in Dein Programm reinschaust, dann
freust Du Dich auch, wenn Du ihn noch verstehst ;-)
Wenn Du Dich erst mal an Schleifen gewöhnt hast (und das geht sehr
schnell), dann "denkst" Du auch beim Programmentwurf in diese Richtung.
Es ist nur ein Konstrukt der Dir (und anderen) das Verstehen des
Programms vereinfacht. Mehr nicht ;-)
> Wissen, wie man eine Schleife macht - das möchte ich (und hier hat man> mir erklärt, was ich selber nicht finden konnte: wie man das mit Pins> macht, innerhalb einer Schleife). Verwenden - hier ist zu überlegen.>
Probiere es einfach aus.
> Gerade in dem Artikel, den mir Herr Brunner gegeben hat, steht:> optimieren kann man für Größe oder für Geschwindigkeit, je nachdem was> man braucht.
Ist das nicht erst dann interessant, wenn Du entweder Platz oder
Geschwindigkeitsprobleme hast?
Dein Prozessor (AT8 ?) macht typ. 8 Millionen Anweisungen pro Sekunde
(!!!). Nutzt Du da wirklich schon alles aus? Ich vermute nicht.
Und Platz im Flash ist doch auch noch reichlich, oder?
Es ist ein sehr beliebter Fehler, die Leistungsfähigkeit von Prozessoren
zu unterschätzen. So ein kleiner AT8 schafft schon gut was weg.
Vieleicht solltest Du das Programm erst einmal "im Groben" fertig machen
und dann (!) schauen, ob es irgendwo zu eng wird? (Klappt oft :-D )
Viele Grüße
Andreas