Hallo Community, dies ist mein erster Beitrag und ich hoffe ihr könnt mir weiterhelfen. Ich programmiere seit einiger Zeit in der Schule mit einem myAVR board MK2 mit einem Atmega 8. Die projekte in der schule sind.. naja.. dumm und grundlegende C programmierung lernen wir dort auch nicht, also lernt man das eben selbst... also was macht der herr? er spielt gitarre, hat 8 fußeffekte und will diese in ein board bauen mit 4 tasters, die doppelt belegt werden können (1-4 und 5-8) desweiteren wird angezeigt welche effekte an sind (8LED´s) und eine weitere led gibt an, dass wir uns im programmiermodus befinden. eine 7 segmentanzeige soll zusätzlich signalisieren, in welchem slot ich bin (1-8) oder ein p anzeigen für programmiermodus. nun wer mein board kennt weiß, dass ich 3 ports habe mit 6 pins. diese sind nun voll belegt, also habe ich zwei erweiterungen bestellt mit je 2 kompletten ports. macht nach adam riese: 7x 6 pins -> 42. theoretisch genug um alles anzuschließen. (so werde ich mal beginnen) nun wird der ein oder andere sagen omg zu überladen. also ging mir gerade durch den kopf z.b. den bereich 7 segmentanzeige auszugliedern und einen eigenen µC dafür zu programmieren, der nur variablen verarbeiten soll. nun zu meiner fragestunde: - die 7 segmentanzeige besitzt 10 anschlüsse 2 cathoden der rest annoden. - kann man einen microcontroller so programmieren, dass er von einem anderen microcontroller variablen übergeben bekommt? damit meine ich z.b. i = 1-8 nun soll ne 5 angezeigt werden, also sendet der atmega 8 ein i = 5 an den µC der 7 segmentanzeige. geht so etwas? oder wie kann ich am sinnvollsten diesen µC "versorgen", dass er mir etwas anzeigt. eine andere frage ist die: welchen µC kann man dafür nehmen, was muss er können für diese eine aufgabe und vorallem kann ich diesen dann auch irgendwie programmieren? vll mit meinem board indem ich den mega8 ausbaue? hoffentlich kann mir wer weiterhelfen:) danke sven
Gast
#2615508
Also , die Ausgabe auf eine 7SEG Anzeihge ist nicht so aufwendig. Denke nicht das es notwendig ist, dafür einen extra uCotroller zu nehmen. Wenn du es doch so realisieren möchtest. Verbinde die uController über den I2C Bus. Dieser Bus ist extra dafür gedacht, IC's auf einer Leiterplatte miteinander zu verbinden.
wenn ich die beiden controller dann vebrinde, dann verarbeitet der zweite das, was ich vom ersten sende? bzw muss man dann senden und empfangen oder kann er dann einfach die variablen verarbeiten?
Unter Verwendung dreier 74HC573 könnte man das mit einem Controller und 12 I/Os umsetzen.
Gast
#2615945
mit attiny2313 plus ein schieberegister und taster matrix locker machbar
Das Problem mit den -zig Kästchen kenne ich ... Blöderweise sind es üble Stolperfallen (Kabel etc.). Wenn ich mir das heute noch mal antun würde, würde ich die Bedienung in die Gitarre einbauenm, Display auf den Amp (eigentlich sollte man aber hören welcher Effekt gerade an ist). Alles per Funk.
Joachim Drechsel schrieb: > Alles per Funk. Wer Funk kennt nimmt Kabel. :-) Gruss Harald
Harald Wilhelms schrieb: > Joachim Drechsel schrieb: > >> Alles per Funk. > > Wer Funk kennt nimmt Kabel. :-) > Gruss > Harald Wer mit Kabel schon auf die Fre.. geflogen ist spielt akustisch oder (notfalls) mit Funk :-)
moin moin:) also ich bin irgendwie nicht wieter gekommen. zunächst zu den funk aussagen: ich glaube ich werde da falsch verstanden. ich entwickle einen fußschalter, der 8 effekte kombiniert speichern kann. ich weiß nicht wer auf die idee käme seine klampfe mit elektronik zu spicken um dann von dort aus schalten zu können. mit fast 20 jahren musikerfahrung habe ich sowas noch nie gesehen.... zum topic werde ich gleich noch was schreiben :)
Jeder wie er will ...
öh ich steh gerade vor nem kleinen problem.... wie kann ich denn "checken" ob ein pin 1 oder 0 führt?
Sven Weinmann schrieb: > wie kann ich denn "checken" ob ein pin 1 oder 0 führt? AVR-GCC-Tutorial: Zugriff auf IO-Ports Gruß Oliver
hi danke! habs mit maskieren gemacht. aber ich steh gerade an einem punkt an dem ich nicht wirklich glauben kann was ich da lese: "Error 1 out.elf section `.text' will not fit in region `text'" "Error 2 region `text' overflowed by 3242 bytes" und jetzt??? kann doch ned sein, dass ich durch ein kleines programm und zwi unterprogramme den speicher voll hab??? ich hab ein kleines lauflicht eben programmiert als unterprogramm, da steht in jeder zweiten zeile ein delay befehl drin. sobald ich delay nutze wird der speicher vom board eng.... gibts elegantere lösungen?
also da steht 174 von 8192 bytes belegt, aber der blaue balken in avr quick prog ist fast 100%...
1. delay nur mit konstanten, nicht mit variablen 2. timer benutzen 3. wie willst du denn die signale der effekte routen?
speichern im eeprom, auslesen ausm eeprom gespeicherte werte via optokoppler auf das git signal entweder drauf oder nicht draufgeben. muss halt ein doppelkoppler sein, da ich + und - vom git signal habe und noch nicht weiß, welches davon was "transportiert"^^
mal so eine ganz doofe frage: warum leuchtet die 7 segmentanzeige bei unterer codierung korrekt hell und "glimmt unterschiedlich hell" bei der oberen? die obere, pinweise die ports anzusprechen ist m.E. sinnvoller, es sei denn man jat ein ganzes bit zur verfügung nur für die anzeige.... -> http://www.visual-design.biz/code.html irgendwie versteh ich das nicht. mit dem oberen setze ich doch genauso die pins die ich nicht benötige auf 0 die anderen auf 1 wie bei dem unteren auch...
fixed!!!
Aufgabe: Abfrage, taster 2s gedrückt? wie baue ich eine solche If anweisung? ich mein if ( bit_is_clear ( pinc,2 )) is klar. oder bit_is_set.... aber wie frage ich "dauert der tastendruck n-sekunden ? warum will ich das? wird der programmierbutton 2 < X < 4 s gedrückt soll der programmiermodus angehen.
was kann man denn tun wenn der flash speicher voll ist??? kann man den erweitern?? ich meine ich hab ja erst ca 1/10 von meinem programm geschrieben, kann ja nicht angehn dass der dann zu klein wird.
Gast
#2617494
Sven Weinmann schrieb: > was kann man denn tun wenn der flash speicher voll ist??? kann man den > erweitern?? > > ich meine ich hab ja erst ca 1/10 von meinem programm geschrieben, kann > ja nicht angehn dass der dann zu klein wird. anderen (größeren) Controller nehmen, Programm aufhübschen.
ok ich hab einen atmel atmega 8A-PU ich hab das AVR-Board MK2 von myAVR. wie finde ich denn nun einen chip, der einen wesentlich größeren speicher hat, aber die gleiche pinbelegung/programmierbarkeit hat, wie der atmel atmega 8 den ich hab denn ich kann nur so einen chip programmieren, da das USB interface auf dem board integriert ist. wie sucht man sich denn einen chip aus?? der atmega 8 kann ja schon sagen wir für einen einsteiger ne ganze menge, aber der speicherplatz ist definitiv zu klein. da sind im flash nur ebbes an die 8000byte platz dat is arg wenig, da ich u.A. mit delay arbeite, was schon ne menge platz schluckt
Gast
#2617521
> dat is arg wenig, da ich u.A. mit delay arbeite, was schon ne menge > platz schluckt Vor allem wenn man es falsch benutzt, also wenn man die Optimierung beim Kompilieren ausgeschaltet hat oder keine Konstanten als Funktionsargumente übergibt! Prüfe mal, ob das bei deinem Programm der Fall ist.
hm nun habe ich bei optimisation -OS eingestellt optimize for size. nurn steht da mit allen delay funktionen: ca 6kb von 8kb aber er schreibt nur 190byte in den flash?? zudem frage ich nochmal kurz nach: lieber _delay_ms (50) oder int blinkzeit = 50; _delay_ms(blinkzeit); und das n mal benutzt?
Gast
#2617537
Variablen als Funktionsargumente für das _delay_ms() sind ein NO-GO. Darauf weisen die Doku der avr-libc und das AVR-GCC-Tutorial und geschätzte 1 Million Posts hier im Forum hin. Du kannst dir Verzögerungen mit variablen Werten mit einer Funktion basteln:
1 | |
2 | |
3 | |
4 | |
5 | |
Durch die zusätzliche Ausführungzeit der while-Schleife und runterzählen von ms, werden die Zeiten allerdings propotional zu ms länger, so dass su hier ggf. ein Feintuning machen musst.
Gast
#2617539
> nurn steht da mit allen delay funktionen:
Was steht da?
Gast
#2617543
Mist, nimm statt > while(--ms) > // FALSCH: erst runterzählen, dann prüfen. Knallt bei Aufruf mit ms=0 while(ms--) // erst prüfen, dann runterzählen
im quick prog steht nun oben: 6844 von 8192kb und unten steht das: Prozessor: ATmega8 schreibe 1354 Bytes in Flash-Memory ... <------ ... erfolgreich (2.13 s) schreibe 0 Bytes in EEPROM-Memory ... ... erfolgreich (0.10 s) OK
was ich mti meinen delaysachen hab sieht so aus:
z.b.
if ((bit_is_clear (PIND,3)) && (PORTC & 1 << 5) && (prog == 1))
{
blink_time = 50; // n-mal schnell blinken
blinken (10);
blink_time = 200; // n-mal langsam blinken
blinken (4);
PORTC &= ~(1 << 5); // Schalte Prog. LED dauerhaft AUS
.
.
.
}
das ist ein gewünschtes siganl, wwelches ist als bestätigung für einen
vorgang haben möchte: blinke 10mal mit 50ms T/P verhältnis und dann 4mal
mit 200ms T/P verhältnis.
T/P = Takt/Pause
wie realisiere ich denn das dann einfacher? ich muss dem delay in meinem
unterprogramm doch zwei werte übergeben..
int blink_time;
void blinken ( int a)
{
for ( zaehlwert=0; zaehlwert<a; zaehlwert++ )
{
PORTC |= (1 << 5); // Schalte LED EIN
_delay_ms (blink_time); // für x ms
PORTC &= ~(1 << 5); // Schalte LED AUS
_delay_ms (blink_time); // für x ms
}
}
Gast
#2617595
Steht da 6844 von 8192kb frei oder 6844 von 8192kb benutzt
Gast
#2617599
Ohne alles gelesen zu haben:
>delay_ms (blink_time);
böse.
1 | |
2 | |
3 | |
4 | |
5 | |
Gast
#2617604
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
Aufrufe:
1 | |
2 | |
Gast
#2617872
wow das ist mal top! die size des programms auf ein minimum zusammengeschrumpft. danke dafür! kannst du mir auch einen tip geben wie ich abfrage, wie lang ein taster gedrückt wird? die aufgabe die ich mir da gestellt habe ist nämlich folgende: taster x sekunden gedrückt -> programmiermodus an da finde ich nämlich gar keinen ansatz zu....
Sven Weinmann schrieb: > da finde ich nämlich gar keinen ansatz zu.... 32 Sechzehntel :-))) Du könntest einen Timer laufen lassen der zB die 10tel sec hochzählt solange die Taste gedrückt ist (so ähnlich wie die Entprellung). Taste aus = Zähler auf 0. Erreicht der Zähler einen bestimmten Wert, dann auslösen.
ach gott wie doof.... natürlich... stein des anstoßes direkt ins gesicht^^
so ein kleines UPDATE: ich hab alle Expanderkarten nun erfolgreich angesprochen. Hat mich bischen Kraft gekostet aber es funktioniert. ich habe mein programm nun komplett neu strukturiert und im moment kümmer ich mich nur um den bereich => normalmodus (programmiermodus AUS) d.h. ich lade mir derzeit die angewählten effekte aus variablen, welche später durch "auslesen" aus dem EEPROM gefüllt werden sollen. hier mal ein kleines anschauungsbeispiel: http://visual-design.biz/fortschritt01.mov rechts sind 8 rote LED´s, welche die einzelnen Effekte (1-8) anzeigen, davor eine reihe zweifach leuchtender LED`s Grün = Bank 1-4 Rot = Bank 5-8 und die 7 segmentanzeige zeigt zusätzlich noch die aktuelle anwahl. was tue ich also später? ich stöpsel mein projekt an meine gitarre -> das board wird geladen und stellt sich automatisch auf kanal 1 von da an kann man mit den 4 tastern bis zu 8 kanäle anwählen und programmieren wie man es will. (an jedem optokoppler ist dann ein effekt angeschlossen) so zumindest die theorie^^
Gast
#2636224
Ja das Projekt Fußschalter geht gut vorran! das programmieren des EEPROMS und das Auslesen funktioniert mit jedem taster, mit jeder anzeige etc! das ist top! jetzt muss ich nurnoch rausfinden, wie die optokoppler funktionieren, da die leider anders sind, als ich es mir erhofft hatte. gibt es optokoppler als "umschalter?" die, die ich hab schalten einfach nur durch... ich bräuchte allerdings nen umschalter...
Sven schrieb: > gibt es optokoppler als "umschalter?" nein > die, die ich hab schalten einfach nur durch... ich bräuchte allerdings > nen umschalter... dann must du zwei verwenden, die am Eingang invertiert angesteuert werden! Was schalten die Optokoppler bei dir? Sascha
Gast
#2636254
nuja ich hab mal vor, dass der optokoppler das gitarrensignal entweder durchschleifen, oder eben auf den effekt splitten ob das so funktioniert weiß ich noch nicht.... sollte eig so aussehen wie im angehangenen bild. ob das signalverlustfrei ist oder ob das überhaupt funktioniert weiß ich noch nicht. ich könnte natürlich auch relais ansteuern, um eine galvanische trennung zu erreichen, ich dacht nru die optokoppler müssten das doch auch schaffen
also ein Audiosignal einfach so mit Optokopplern zu schalten kannst du vergessen. Die meisten Optokoppler schalten nur Gleichspannung und würden dein Signal damit gleichrichten. Es gibt welche für Wechselspannung, aber die funktionieren für so kleine Spannungen auch nicht. Es gibt jedoch Analogschalter oder spezielle Audioschalter oder Multiplexer. Sascha
Gast
#2636282
das ist ja mist. was sind denn spezielle audioschalter? wäre cool wenn ich wüsste nach was ich suchen muss^^
Gast
#2636301
Sven schrieb: > meinst du sowas: das sieht gar nicht schlecht aus - damit könntest du mit einem IC schon mal 3 deiner Effekte wahlweise in den Signalweg schalten. Die Ansteuerung - I2C ist natürlich etwas anders als von Dir geplant. Sascha
kann ich das nicht irgendwie einfacher schreiben?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
die einzelnen segmente sind via define festgelegt:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
i ist eine int zahl, welche eig nur 1-8 werden kann kann man das nicht mit nem array machen? sodass nachher nur sowas das steht wie: _segment_[i-1]; ?
Harald Wilhelms schrieb: > Joachim Drechsel schrieb: > >> Alles per Funk. > > Wer Funk kennt nimmt Kabel. :-) > Gruss > Harald Aber sonst gehts noch :) Grüße
OT also erfahrungsgemäß ist kabel vom klang her geiler, funk bewegungsfreier OTende
Sven Weinmann schrieb: > kann ich das nicht irgendwie einfacher schreiben? > kann man das nicht mit nem array machen? > sodass nachher nur sowas das steht wie: > > _segment_[i-1]; ? na klar, siehe auch: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Byte_lesen
1 | |
2 | |
3 | |
du kannst das Array auch ohne PROGMEM anlegen, dann werden die Byte's im RAM vorgehalten. Sascha
mom stop. die #define anweisungen sind feste zuweisungen für bestimmte fällt. im ram mach ich garnichts der ist ja flüchtig. will ja nicht jedesmal neu laden wenn jemand den strom wegnimmt. ich bruach im prinzip eni array oder so, welches ich mit i-1 auslese, ein array beginnt ja mit 0
ich hatte es so probiert, aber ich glaub das komma im ouPort stört.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
Sven Weinmann schrieb: > mom stop. die #define anweisungen sind feste zuweisungen für bestimmte > fällt. ?? schreibst du im Program "_segment_1", erstzt das der Compiler durch "outPorts1(0,0b00000110)" > im ram mach ich garnichts der ist ja flüchtig. will ja nicht jedesmal > neu laden wenn jemand den strom wegnimmt. wenn du ein Array mit Konstanten definierst sorgt der Compiler dafür das die Werte nach einem Reset dort drinstehen > ich bruach im prinzip eni array oder so, welches ich mit i-1 auslese, > ein array beginnt ja mit 0 s.o., das Array enthält die Bitmuster für die 7-Segmentausgänge, bei Dir derzeit in den Define's. Die Ausgabe erfolgt offenbar mit der Funktion outPorts1(), der du nun das entsprechende Element aus den Array übergibst. Sascha
Sven Weinmann schrieb: > ich hatte es so probiert, aber ich glaub das komma im ouPort stört. > >
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
was soll die Funktion outPorts1() im Array???? Ins Array gehören NUR die Werte!
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
Sascha
richtig, hat i irgend einen wert zw 1 und 8 soll das bitmuster an outPorts übergeben werden. soltle doch eig so gehe wie ich das eben gepostet hab, zumindest sagt mird as mein schlaues buch, welches vor mir liegt... aber irgendwie tuts das nicht. liegt es an den kommas? dass die defines alles was "definiert" wurde vor dem compilieren ersetzen weiß ich, daher würde mich auch heir interesseiren wie das mit den kommas ist den das komma nach: outPorts1(0,... <-- ist ein muss sein:( --- ou damn it. ja du hast recht. sry das war wirklich unnötig.... hatte gedacht, dass ich den kompletten wert hier reinpacken kann.
sooo.. nun hab ich zu meinem code noch ne kleine frage: kann man diesen ausdruck vereinfachen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
was wird getan? wenn taster an PIN D3 gedrückt wird und j einen wert kleiner oder größer als 4 hat soll jeweils ein pin ge/umgeschaltet werden. kann man diesen ausdruck nicht auch kürzer schreiben, weil ich hab ihn 4 mal und es wird leicht unübersichtlich. (die anderen fälle sind dementsprechend pin d4, d5, d6; j wird dann dementsprechen 1-8)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Sascha
hey sascha! das hab ich mri auch schon überlegt gehabt. aber für den fall, dass i dann größer 4 ist kann man nicht mehr umschalten :)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
so sollte es passen Sascha
Gast
#2639076
Hey sascha! ja das funktioniert. waren zwar zwei klammern die fehlten, aber irgendwas muss ich ja auch noch tun^^ ich hatte das schonmal so ähnlich, aber imemrnoch mti der doppelten aussage "askieren und dann den status ändern" das invertieren hab ich garnicht bedacht. macht die sache extrem viel einfacher! danke!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
