Forum: Mikrocontroller und Digitale Elektronik Projekt Fußtreter


von Sven W. (sickone4)


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

von Decius (Gast)


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.

von Sven W. (sickone4)


Lesenswert?

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?

von Sandro S. (sandro)


Lesenswert?

Unter Verwendung dreier 74HC573 könnte man das mit einem Controller und 
12 I/Os umsetzen.

von tinyfan (Gast)


Lesenswert?

mit attiny2313 plus ein schieberegister und taster matrix locker machbar

von Joachim D. (Firma: JDCC) (scheppertreiber)


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.

von Harald W. (wilhelms)


Lesenswert?

Joachim Drechsel schrieb:

> Alles per Funk.

Wer Funk kennt nimmt Kabel. :-)
Gruss
Harald

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

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 :-)

von Sven W. (sickone4)


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 :)

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Jeder wie er will ...

von Sven W. (sickone4)


Lesenswert?

öh ich steh gerade vor nem kleinen problem....


wie kann ich denn "checken" ob ein pin 1 oder 0 führt?

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Sven W. (sickone4)


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?

von Sven W. (sickone4)


Lesenswert?

also da steht 174 von 8192 bytes belegt, aber der blaue balken in avr 
quick prog ist fast 100%...

von Hans M. (hansilein)


Lesenswert?

1. delay nur mit konstanten, nicht mit variablen
2. timer benutzen
3. wie willst du denn die signale der effekte routen?

von Sven W. (sickone4)


Lesenswert?

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"^^

von Sven W. (sickone4)


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

von Sven W. (sickone4)


Lesenswert?

fixed!!!

von Sven W. (sickone4)


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.

von Sven W. (sickone4)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

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.

von Sven W. (sickone4)


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

von Krapao (Gast)


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.

von Sven W. (sickone4)


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?

von Krapao (Gast)


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.

von Krapao (Gast)


Lesenswert?

> nurn steht da mit allen delay funktionen:

Was steht da?

von Krapao (Gast)


Lesenswert?

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

von Sven W. (sickone4)


Lesenswert?

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

von Sven W. (sickone4)


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

von Krapao (Gast)


Lesenswert?

Steht da

6844 von 8192kb frei

oder

6844 von 8192kb benutzt

von Diplomtroll (Gast)


Lesenswert?

Ohne alles gelesen zu haben:
>delay_ms (blink_time);
böse.
1
void my_delay(int d)
2
{
3
  while(d--)
4
    _delay_ms(1);
5
}

von Krapao (Gast)


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

von Sven Weinmann (Gast)


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

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

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.

von Sven W. (sickone4)


Lesenswert?

ach gott wie doof.... natürlich... stein des anstoßes direkt ins 
gesicht^^

von Sven W. (sickone4)


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

von Sven (Gast)


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

von Sascha W. (sascha-w)


Lesenswert?

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

von Sven (Gast)


Angehängte Dateien:

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

von Sascha W. (sascha-w)


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

von Sven (Gast)


Lesenswert?

das ist ja mist.

was sind denn spezielle audioschalter?

wäre cool wenn ich wüsste nach was ich suchen muss^^

von Sven (Gast)


Lesenswert?


von Sascha W. (sascha-w)


Lesenswert?

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

von Sven W. (sickone4)


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]; ?

von Bernd F. (metallfunk)


Lesenswert?

Harald Wilhelms schrieb:
> Joachim Drechsel schrieb:
>
>> Alles per Funk.
>
> Wer Funk kennt nimmt Kabel. :-)
> Gruss
> Harald

Aber sonst gehts noch :)

Grüße

von Sven W. (sickone4)


Lesenswert?

OT also erfahrungsgemäß ist kabel vom klang her geiler, funk 
bewegungsfreier OTende

von Sascha W. (sascha-w)


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

von Sven W. (sickone4)


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

von Sven W. (sickone4)


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];

von Sascha W. (sascha-w)


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

von Sascha W. (sascha-w)


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

von Sven W. (sickone4)


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.

von Sven W. (sickone4)


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)

von Sascha W. (sascha-w)


Lesenswert?

1
if ((bit_is_clear ( PIND,3)) && ( j <= 4))
2
 {   
3
    j = 1;
4
    buildPort ^= (1<<0);
5
 } else
6
    j = 5;
7
    buildPort ^= (1<<4);
8
 }
9
warten_ms(200);

Sascha

von Sven W. (sickone4)


Lesenswert?

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 :)

von Sascha W. (sascha-w)


Lesenswert?

1
if (bit_is_clear ( PIND,3)
2
  {
3
    if ( j <= 4) 
4
      {   
5
        j = 1;
6
        buildPort ^= (1<<0);
7
      } else  //wenn j>4
8
        j = 5;
9
        buildPort ^= (1<<4);
10
      }
11
    warten_ms(200);
12
  }

so sollte es passen

Sascha

von Sven (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.