Projekt Fußtreter

OP #2615493
Lesenswert?

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
Lesenswert?

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.
(Firma: JDCC) #2615959
Lesenswert?

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.
OP #2616420
Lesenswert?

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 :)
OP #2616513
Lesenswert?

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?
OP #2616745
Lesenswert?

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...
OP #2616814
Lesenswert?

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.
OP #2617510
Lesenswert?

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
Lesenswert?

> 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.
OP #2617528
Lesenswert?

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
Lesenswert?

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
void my_delay_ms(unsigned int ms)
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.
OP #2617549
Lesenswert?

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 #2617604
Lesenswert?

1
void warten_ms(unsigned int ms)
2
{
3
  while(ms--)
4
    _delay_ms(1);
5
}
6

7
void blinken(int anzahl, unsigned int ms)
8
{
9
  int i; // lokale Variable
10
  for ( i=0; i<anzahl; i++ ) {
11
    PORTC |=  (1 << 5);  // Schalte LED EIN
12
    warten_ms(ms);  
13
    PORTC &= ~(1 << 5);  // Schalte LED AUS
14
    warten_ms(ms);  
15
  }
16
}

Aufrufe:
1
blinken(10, 50); // 10x schnell Zeitbedarf: 10 * 2 * 50 ms = 1,0s
2
blinken(4, 200); //  4x langsam Zeitbedarf: 4 * 2 * 200 ms = 1,6s
Gast #2617872
Lesenswert?

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....
OP #2623762
Lesenswert?

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
Lesenswert?

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...
Gast #2636254
Lesenswert?

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
Angehängte Dateien:
#2636279
Lesenswert?

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
OP #2637445
Lesenswert?

kann ich das nicht irgendwie einfacher schreiben?
1
            if ( i == 1 ) { _segment_1; }                  // nach Bankanzeige A/B zeige wieder den Kanal der editiert wird
2
            if ( i == 2 ) { _segment_2; }                  //
3
            if ( i == 3 ) { _segment_3; }                  //
4
            if ( i == 4 ) { _segment_4; }                  //
5
            if ( i == 5 ) { _segment_5; }                  //
6
            if ( i == 6 ) { _segment_6; }                  //
7
            if ( i == 7 ) { _segment_7; }                  //
8
            if ( i == 8 ) { _segment_8; }                  //

die einzelnen segmente sind via define festgelegt:
1
    #define _segment_1   outPorts1(0,0b00000110)            //
2
    #define _segment_2   outPorts1(0,0b01011011)            //
3
    #define _segment_3   outPorts1(0,0b01001111)            //
4
    #define _segment_4   outPorts1(0,0b01100110)            //
5
    #define _segment_5   outPorts1(0,0b01101101)            //
6
    #define _segment_6   outPorts1(0,0b01111101)            //
7
    #define _segment_7   outPorts1(0,0b00000111)            //
8
    #define _segment_8   outPorts1(0,0b01111111)            //

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]; ?
#2637470
Lesenswert?

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
const uint8_t BCDto7Seg[] PROGMEM = { 0b00000110, 0b01011011, 0b01001111, ... };
2

3
outPorts1(0, pgm_read_byte (&BCDto7Seg[i-1]));

du kannst das Array auch ohne PROGMEM anlegen, dann werden die Byte's im 
RAM vorgehalten.

Sascha
OP #2637482
Lesenswert?

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
OP #2637516
Lesenswert?

ich hatte es so probiert, aber ich glaub das komma im ouPort stört.
1
int _segment_[] = { outPorts1(0,0b00000110), 
2
                    outPorts1(0,0b01011011), 
3
                    outPorts1(0,0b01001111), 
4
                    outPorts1(0,0b01100110), 
5
                    outPorts1(0,0b01101101), 
6
                    outPorts1(0,0b01111101), 
7
                    outPorts1(0,0b00000111), 
8
                    outPorts1(0,0b01111111) };
9

10
            
11
_segment_[i-1];
#2637520
Lesenswert?

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
#2637528
Lesenswert?

Sven Weinmann schrieb:
> ich hatte es so probiert, aber ich glaub das komma im ouPort stört.
>
>
1
> int _segment_[] = { outPorts1(0,0b00000110),
2
>                     outPorts1(0,0b01011011),
3
>                     outPorts1(0,0b01001111),
4
>                     outPorts1(0,0b01100110),
5
>                     outPorts1(0,0b01101101),
6
>                     outPorts1(0,0b01111101),
7
>                     outPorts1(0,0b00000111),
8
>                     outPorts1(0,0b01111111) };
9
> 
10
> 
11
> _segment_[i-1];

was soll die Funktion outPorts1() im Array????
Ins Array gehören NUR die Werte!
1
uint8 _segment_[] = { 0b00000110,
2
                      0b01011011,
3
                      0b01001111,
4
                      0b01100110,
5
                      0b01101101,
6
                      0b01111101,
7
                      0b00000111,
8
                      0b01111111};
9

10

11
outPorts1(0,_segment_[i-1]);

Sascha
OP #2637529
Lesenswert?

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.
OP #2637690
Lesenswert?

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)
Gast #2639076
Lesenswert?

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.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren