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
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?
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.
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 :)
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?
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...
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.
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
> 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?
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
voidmy_delay_ms(unsignedintms)
2
{
3
while(--ms)
4
_delay_ms(1);
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.
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
}
}
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.
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^^
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
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
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
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
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
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
if((bit_is_clear(PIND,3))&&(j<=4))// Programmmodus Taste A gerdückt udn j <= 4
2
{
3
j=1;// dann j = 1
4
if(buildPort&1<<0){buildPort&=~(1<<0);warten_ms(200);}// wenn dann Pin 0 = 1 => Pin 0 = 0
5
else{buildPort|=(1<<0);warten_ms(200);}// wenn dann Pin 0 = 0 => Pin 0 = 1
6
}
7
8
if((bit_is_clear(PIND,3))&&(j>4))// Programmmodus Taste A gerdückt udn j > 4
9
{
10
j=5;// dann j = 5
11
if(buildPort&1<<4){buildPort&=~(1<<4);warten_ms(200);}// wenn dann Pin 0 = 1 => Pin 4 = 0
12
else{buildPort|=(1<<4);warten_ms(200);}// wenn dann Pin 0 = 0 => Pin 4 = 1
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)
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!