Jump to content

Anfangs probleme beim programmieren in C


Can128
 Share

Recommended Posts

Hallo zusammen ich schon wieder :-[

Also kurz gesagt ich habe CB_ SDCC_ Skeleton zum laufen gebracht auf dem LCD erscheint "Hallo wo warst du so lange?" und ich sagte "ich hatte AIN DOUT Probleme du Hammel"

dann auf dem LCD "Dann fang endlich an schatz"  ;D

ich habe mit Googel Übersetzer die mios Funktionen übersetz die in Skeleton main.c

sind.

was ich hier nicht verstehe ist.

Ein beispiel:

/////////////////////////////////////////////////////////////////////////////

// This function is called by MIOS when an button has been toggled

// pin_value is 1 when button released, and 0 when button pressed

// Diese Funktion wird aufgerufen, wenn ein von MIOS-Taste wurde toggled

// Pin_value ist 1, wenn Taste freigegeben, und 0, wenn Taste gedrückt

/////////////////////////////////////////////////////////////////////////////

void DIN_NotifyToggle(unsigned char pin, unsigned char pin_value) __wparam

{

}

Wie wird diese Funktion angewendet.

Diese Funktion erwartet 2 Parameter (unsigned char pin, unsigned char pin_value)

__wparam= (Warum dies auserhalb der klammer ist versteh ich nicht)

Die variablen einer Funktion sind normalerweise mit klammern abgekapselt.

wo bekomme ich die variablen (unsigned char pin, unsigned char pin_value) her

oder werden diese variablen automatisch zugewiesen?

ich steh etwas im dunklen und mein schatz wartet auf mich.

Bin für jede Hilfe  Dankbar!!!

Link to comment
Share on other sites

Diese Funktion wird von MIOS aufgerufen sobald eine Taste gedrück/losgelassen wurde.

pin hält die Nummer des Buttons und pin_value den Status (0 = knopf gedrückt, 1 = knopf losgelassen). __wparam ist der Wert der in diesem Moment im WREG (= working register = Arbeitsregister) liegt. Um den mußt Du Dich nicht kümmern.

Die Funktion wird üblicherweise nicht von Dir selber sondern von MIOS aufgerufen. Du würdest also nur einen Handler schreiben, der anhand der Parameter entscheidet, was zu tun ist.

Link to comment
Share on other sites

Dem nach müsste dies funktionieren

void DIN_NotifyToggle(unsigned char pin, unsigned char pin_value) __wparam

{

  if(pin||pin_value)

  {

    MIOS_LCD_Clear();

    MIOS_LCD_CursorSet(0x00);

    MIOS_LCD_PrintCString("Hello Niels!");

  }

}

Es funktioniert auch danke..! so versteh ich wie es funktioniert.

das wahr der erste schritt freue mich  :-*

Link to comment
Share on other sites

if(pin||pin_value)
Was genau soll das denn tun? Ist ein bissel wenig sinnvoll so auf den ersten Blick, da es eigentlich immer true ergibt außer wenn pin == 0 (nur der erste button) und pin_value == 0 (button gedrückt). Sinniger wäre bspw:
if (pin_value != 1) // button gedrückt
{
    MIOS_LCD_CursorSet(0x00);
    MIOS_LCD_PrintCString("Pin: ");
    MIOS_LCD_PrintBCD3(pin);
}[/code]

Link to comment
Share on other sites

Hallo Nils

if(pin||pin_value)

Habe ich nur zum schnellen testen Reingeschrieben.

Mir geht’s darum erst mal die wichtigsten MiosC Funktionen kennen zu lernen.

und wie sie angewendet werden.

Erst danach fange ich an die Applikation zuschreiben.

Dein sinn volle code hat mir schon weitergeholfen

denn ich habe nach eine möglischkeit gesucht um unsigned char in string umzuwandeln

damit ich ein zahl am LCD anzeigen kann.Aber ich sehe  es gibt eine Funktion  die dies erledigt  MIOS_LCD_PrintBCD3(pin);.

als nächstes würde ich gerne ein led einschalten.wenn eine MidiMsg empfangen wird. in Skeleton main.c sehe ich keine Funktion für Dout mal sehen ob ich mit Dout was machen kann.

Die Nacht ist noch lang

  :D

Link to comment
Share on other sites

:D Kann jetz paar Led ein ausschalten dank Torstens beispiel es klappt.

Nur mit AIN hab ich probleme.

void AIN_NotifyChange(unsigned char pin, unsigned int pin_value) __wparam

{

    if(pin||pin_value)

    {

      MIOS_LCD_Clear();

      MIOS_LCD_CursorSet(0x00);

      MIOS_LCD_PrintCString("AIN Reagiert"); 

       

      MIOS_MIDI_TxBufferPut(0x90); // Note Event at channel #1

      MIOS_MIDI_TxBufferPut(pin);  // just forward the pin number (0..127)

      MIOS_MIDI_TxBufferPut(pin_value );

    } 

}

Es Tut sich leider nichts.Muss ich noch etwas  in die

void Init(void) __wparam

{

}

Funktion reinschreiben ?

Link to comment
Share on other sites

ich wollte nicht nur Midi senden sonder das die

Funktion void AIN_NotifyChange auf irgend etwas reagiert.

MIOS_MIDI_TxBufferPut()

ich dachte mit diese funktion wird Midi gesendet.

Es wird ja in MidiOx die NoteON/Off und andere werte korekt angezeigt.

MIOS_MIDI_BeginStream()

MIOS_MIDI_EndStream()

Hast du ein beispiel für die beiden funktionen?

Die Funktion void AIN_NotifyChange()  reagiert ja über habt nicht.

LCD müste "AIN Reagiert" anzeigen.

ich denke da muss noch was initzialisiert werden aber was  ::)

Bei DIN ist,s 

// debouncing value for DINs

  MIOS_SRIO_DebounceSet(10);

Ein beispiel für AIN hab ich nicht gefunden  :'(

Link to comment
Share on other sites

Halt hab was gefunden  :o also doch es muss was in initzialisiert werden

werde gleich mal aus probieren

void Init(void) __wparam

{

  // initialize the AIN driver

  MIOS_AIN_NumberSet(8);  // 8 pots are connected

  MIOS_AIN_UnMuxed();      // the AINX4 modules are *not* used

  MIOS_AIN_DeadbandSet(7); // should be 7 when 7bit resolution is used

}

Link to comment
Share on other sites

Die Funktion void AIN_NotifyChange reagiert jetz auf schieberegler.

Nur der pin_value wert wird 4 x von 0-255 gesendet.

Es ist so als ob ich 4 schieberegler in einem hätte.

hab einiges probiert aber ich kriegs nicht hin :(.

void Init(void) __wparam

{

  // set shift register update frequency

  MIOS_SRIO_UpdateFrqSet(1); // ms

  // we need to set at least one IO shift register pair

  MIOS_SRIO_NumberSet(16); // for 128 pins

  // debouncing value for DINs

  MIOS_SRIO_DebounceSet(10);

  // initialize the AIN driver

  MIOS_AIN_NumberSet(1);  // 8 pots are connected

  MIOS_AIN_Muxed();      // the AINX4 modules are *not* used

  MIOS_AIN_DeadbandSet(7);

}

void AIN_NotifyChange(unsigned char pin, unsigned int pin_value) __wparam

{

    MIOS_LCD_Clear();

    MIOS_LCD_CursorSet(0x00);

    MIOS_LCD_PrintCString("Pin:");

    MIOS_LCD_PrintBCD1(pin);

    MIOS_LCD_CursorSet(0x07);

    MIOS_LCD_PrintCString("PinV: ");

    MIOS_LCD_PrintBCD3(pin_value);

 

  MIOS_MIDI_TxBufferPut(0xB0); // Note Event at channel #1

  MIOS_MIDI_TxBufferPut(pin);  //

  MIOS_MIDI_TxBufferPut(pin_value);

 

  //////////////////

/*

  // unsigned char value;

  // scale 7bit value between min and max boundary

  value = Scale_7bit(MIOS_AIN_Pin7bitGet(pin), // converted to 7bit

                    pot_event_map[pin][2],    // min value

                    pot_event_map[pin][3]);  // max value

  // send scaled CC value

  MIOS_MIDI_TxBufferPut(pot_event_map[pin][0]); // first value from table

  MIOS_MIDI_TxBufferPut(pot_event_map[pin][1]); // second value from table

  MIOS_MIDI_TxBufferPut(value);

*/

}

Link to comment
Share on other sites

Habe viele varianten probiert damit der schieberegler von 0-127 sendet.

Aber keine richtige lösung gefunden.

Ab und zu fehlt eine zahl wie die 1,10,19.

00000006957156 ms | [b0 00 16] Channel 1: CC Bank Select value: 22

00000006957161 ms | [b0 00 15] Channel 1: CC Bank Select value: 21

00000006957168 ms | [b0 00 14] Channel 1: CC Bank Select value: 20

00000006957174 ms | [b0 00 12] Channel 1: CC Bank Select value: 18

00000006957181 ms | [b0 00 11] Channel 1: CC Bank Select value: 17

00000006957187 ms | [b0 00 10] Channel 1: CC Bank Select value: 16

00000006957193 ms | [b0 00 0F] Channel 1: CC Bank Select value: 15

00000006957200 ms | [b0 00 0E] Channel 1: CC Bank Select value: 14

00000006957207 ms | [b0 00 0D] Channel 1: CC Bank Select value: 13

00000006957214 ms | [b0 00 0C] Channel 1: CC Bank Select value: 12

00000006957222 ms | [b0 00 0B] Channel 1: CC Bank Select value: 11

00000006957228 ms | [b0 00 09] Channel 1: CC Bank Select value: 9

00000006957236 ms | [b0 00 08] Channel 1: CC Bank Select value: 8

00000006957244 ms | [b0 00 07] Channel 1: CC Bank Select value: 7

00000006957251 ms | [b0 00 06] Channel 1: CC Bank Select value: 6

00000006957262 ms | [b0 00 05] Channel 1: CC Bank Select value: 5

00000006957279 ms | [b0 00 04] Channel 1: CC Bank Select value: 4

00000006957297 ms | [b0 00 03] Channel 1: CC Bank Select value: 3

00000006957315 ms | [b0 00 02] Channel 1: CC Bank Select value: 2

00000006957331 ms | [b0 00 00] Channel 1: CC Bank Select value: 0

Hier der code:

    unsigned char value;
void AIN_NotifyChange(unsigned char pin, unsigned int pin_value) __wparam
{

/*
  // scale 7bit value between min and max boundary
  value = Scale_7bit(MIOS_AIN_Pin7bitGet(pin), // converted to 7bit
                       0,
                     254);
*/
  // a pot has been moved, send CC# at channel 1
  MIOS_MIDI_TxBufferPut(0xb0); // CC at channel 1
  MIOS_MIDI_TxBufferPut(pin);  // pin number corresponds to CC number
  MIOS_MIDI_TxBufferPut(MIOS_AIN_Pin7bitGet(pin));

    MIOS_LCD_Clear();
    MIOS_LCD_CursorSet(0x00);
    MIOS_LCD_PrintCString("Pin:");
    MIOS_LCD_PrintBCD1(pin);

    MIOS_LCD_CursorSet(0x07);
    MIOS_LCD_PrintCString("PinV: ");
    MIOS_LCD_PrintBCD3(MIOS_AIN_Pin7bitGet(pin));
}

Ich weiss nicht weiter  :(

Link to comment
Share on other sites

Dieses Verhalten koennte mit der automatischen Jitter-Unterdrueckung zusammenhaengen. Mit MIOS_AIN_DeadbandSet(7) wird das Deadband so gelegt, dass nur bei Werteaenderungen im 7bit Bereich die AIN_NotifyChange() Funktion aufgerufen wird. Wenn der Schieberegler jedoch schlecht entstoert ist (klemm mal das Metallgehaeuse auf Masse), oder von schlechter Qualitaet ist, kann es passieren, dass die gemessene Position mal zwischen zwei 7bit Werten (also bspw. zwischen 0x00 und 0x01) schwankt. Und hier vermeidet MIOS, dass dadurch staendig neue MIDI Events generiert werden.

Neben der Entstoerung probiere mal folgendes aus: setze das Deadband auf den Wert 5, spaeter auf 3, 1, und schliesslich auf 0. AIN_NotifyChange() sollte nun wesentlich haeufiger aufgerufen werden. Wenn bereits bei 5 und 3 sporadisch Werte gesendet werden, obwohl Du den Schieberegler nicht beruehrst (dann kann auch von der Position der anderen Schieberegler abhaengen!), dann ist es eindeutig ein Jitterproblem.

Das Deadband kannst Du entweder in der Applikation aendern (und anschliessend die Applikation neu aufladen), oder waehrend der Laufzeit im Debug Fenster von MIOS Studio

Gruss,

        Thorsten.

Link to comment
Share on other sites

Hallo Thorsten

Danke erst mal ich dahte es hängt mit den code zusammen

weil der schieberegler alleine ab und zu gesendet hat hatte ich das gehäuse mit an minus gelötet.danach hat nur gesendet wenn ich es bewegt habe.

Deadband auf 5

00000011279365 ms | [b0 00 00] Channel 1: CC Bank Select value: 0

00000011279423 ms | [b0 00 01] Channel 1: CC Bank Select value: 1

00000011279471 ms | [b0 00 02] Channel 1: CC Bank Select value: 2

00000011279528 ms | [b0 00 03] Channel 1: CC Bank Select value: 3

00000011279607 ms | [b0 00 03] Channel 1: CC Bank Select value: 3

00000011279710 ms | [b0 00 04] Channel 1: CC Bank Select value: 4

00000011279791 ms | [b0 00 05] Channel 1: CC Bank Select value: 5

00000011279840 ms | [b0 00 06] Channel 1: CC Bank Select value: 6

00000011279876 ms | [b0 00 06] Channel 1: CC Bank Select value: 6

00000011279905 ms | [b0 00 07] Channel 1: CC Bank Select value: 7

00000011279935 ms | [b0 00 08] Channel 1: CC Bank Select value: 8

Deadband auf 3

00000011439618 ms | [b0 00 00] Channel 1: CC Bank Select value: 0

00000011439621 ms | [b0 00 00] Channel 1: CC Bank Select value: 0

00000011439624 ms | [b0 00 00] Channel 1: CC Bank Select value: 0

00000011439626 ms | [b0 00 00] Channel 1: CC Bank Select value: 0

00000011439684 ms | [b0 00 01] Channel 1: CC Bank Select value: 1

00000011439736 ms | [b0 00 01] Channel 1: CC Bank Select value: 1

00000011439783 ms | [b0 00 02] Channel 1: CC Bank Select value: 2

00000011439855 ms | [b0 00 02] Channel 1: CC Bank Select value: 2

00000011439947 ms | [b0 00 03] Channel 1: CC Bank Select value: 3

00000011440064 ms | [b0 00 03] Channel 1: CC Bank Select value: 3

00000011440302 ms | [b0 00 04] Channel 1: CC Bank Select value: 4

00000011440570 ms | [b0 00 04] Channel 1: CC Bank Select value: 4

00000011440810 ms | [b0 00 05] Channel 1: CC Bank Select value: 5

00000011441051 ms | [b0 00 05] Channel 1: CC Bank Select value: 5

Mit Deadband auf 2,1,0 ist noch schlimmer

ich hab nur ein schieberegler dran kein anderes.

Link to comment
Share on other sites

ich habe  so eben die applikation ain64_din128_dout128_v1_3

drauf gemacht. der schieberegler funktioniert einwand frei

00000011956449 ms | [b1 00 00] Channel 2: CC Bank Select value: 0

00000011957410 ms | [b1 00 01] Channel 2: CC Bank Select value: 1

00000011957535 ms | [b1 00 02] Channel 2: CC Bank Select value: 2

00000011957698 ms | [b1 00 03] Channel 2: CC Bank Select value: 3

00000011957922 ms | [b1 00 04] Channel 2: CC Bank Select value: 4

00000011958129 ms | [b1 00 05] Channel 2: CC Bank Select value: 5

00000011958268 ms | [b1 00 06] Channel 2: CC Bank Select value: 6

00000011958347 ms | [b1 00 07] Channel 2: CC Bank Select value: 7

00000011958465 ms | [b1 00 08] Channel 2: CC Bank Select value: 8

00000011958620 ms | [b1 00 09] Channel 2: CC Bank Select value: 9

00000011958713 ms | [b1 00 0A] Channel 2: CC Bank Select value: 10

00000011958792 ms | [b1 00 0B] Channel 2: CC Bank Select value: 11

00000011958877 ms | [b1 00 0C] Channel 2: CC Bank Select value: 12

00000011959167 ms | [b1 00 0D] Channel 2: CC Bank Select value: 13

00000011959293 ms | [b1 00 0E] Channel 2: CC Bank Select value: 14

00000011959435 ms | [b1 00 0F] Channel 2: CC Bank Select value: 15

00000011959578 ms | [b1 00 10] Channel 2: CC Bank Select value: 16

00000011959657 ms | [b1 00 11] Channel 2: CC Bank Select value: 17

00000011959941 ms | [b1 00 12] Channel 2: CC Bank Select value: 18

00000011960026 ms | [b1 00 13] Channel 2: CC Bank Select value: 19

00000011960110 ms | [b1 00 14] Channel 2: CC Bank Select value: 20

00000011960219 ms | [b1 00 15] Channel 2: CC Bank Select value: 21

00000011960389 ms | [b1 00 16] Channel 2: CC Bank Select value: 22

00000011960468 ms | [b1 00 17] Channel 2: CC Bank Select value: 23

00000011960533 ms | [b1 00 18] Channel 2: CC Bank Select value: 24

Also ist es doch ein code problem

Link to comment
Share on other sites

ich habe  so eben die applikation ain64_din128_dout128_v1_3

drauf gemacht. der schieberegler funktioniert einwand frei

Ok, das war natuerlich ein wichtiger Input.

Vielleicht dauert die LCD Ausgabe zu lang, so dass ein neuer Wert bereits ansteht, waehrend die Display-Ausgabe noch nicht fertig ist. Es macht ja eigentlich wenig Sinn, jeden Wert sofort auszugeben, das LCD ist wahrscheinlich so traege, dass die Zahlen erst nach ca. 50 mS (oder mehr) sichtbar werden. Hier kann man also noch ein wenig Performance herausholen.

In meinen Applikationen mache ich das meistens so, dass ich in einem Flag "vermerke", dass sich der Poti-Wert geaendert hat, diesen dann erst in DISPLAY_Tick() ausgebe, und dort das Flag wieder loesche (so dass der Wert nicht erneut ausgegeben wird). Diese Funktion wird seltener als AIN_NotifyChange() aufgerufen, aber immer noch oft genug, um Werteaenderungen "scheinbar" sofort sichtbar zu machen.

Ein C Anwendungsbeispiel findest Du in ain64_din128_dout128_v2_0.zip (suche nach app_flags.DISPLAY_UPDATE_REQ --- das Flag ist in main.h definiert)

Gruss, Thorsten.

Link to comment
Share on other sites

Habe jetz alles so gemacht wie du es mir gesagt hast.

Die code teile von ain64_din128_dout128_v2_0 hab ich übernommen.

von 0 richtung 127 ist alles ok aber wenn zurück geht dann gehen einige zahlen verloren.

ich habe die original ain64_din128_dout128_v2_0 applikation draufgespielt das gleiche.

Beim zurück schieben von 127 auf 0 gehen einige zahlen verloren.

00000023275138 ms | [b0 00 14] Channel 1: CC Bank Select value: 20

00000023275143 ms | [b0 00 13] Channel 1: CC Bank Select value: 19

00000023275149 ms | [b0 00 12] Channel 1: CC Bank Select value: 18

00000023275154 ms | [b0 00 11] Channel 1: CC Bank Select value: 17

00000023275160 ms | [b0 00 10] Channel 1: CC Bank Select value: 16

00000023275165 ms | [b0 00 0E] Channel 1: CC Bank Select value: 14

00000023275171 ms | [b0 00 0D] Channel 1: CC Bank Select value: 13

00000023275178 ms | [b0 00 0C] Channel 1: CC Bank Select value: 12

00000023275183 ms | [b0 00 0B] Channel 1: CC Bank Select value: 11

00000023275190 ms | [b0 00 0A] Channel 1: CC Bank Select value: 10

00000023275196 ms | [b0 00 08] Channel 1: CC Bank Select value: 8

00000023275203 ms | [b0 00 07] Channel 1: CC Bank Select value: 7

00000023275210 ms | [b0 00 06] Channel 1: CC Bank Select value: 6

00000023275219 ms | [b0 00 05] Channel 1: CC Bank Select value: 5

00000023275233 ms | [b0 00 04] Channel 1: CC Bank Select value: 4

00000023275247 ms | [b0 00 03] Channel 1: CC Bank Select value: 3

00000023275260 ms | [b0 00 02] Channel 1: CC Bank Select value: 2

00000023275273 ms | [b0 00 00] Channel 1: CC Bank Select value: 0

Dann ain64_din128_dout128_v1_3

(Die 7 fehlt)

00000000152009 ms | [b1 00 0A] Channel 2: CC Bank Select value: 10

00000000152018 ms | [b1 00 09] Channel 2: CC Bank Select value: 9

00000000152025 ms | [b1 00 08] Channel 2: CC Bank Select value: 8

00000000152036 ms | [b1 00 06] Channel 2: CC Bank Select value: 6

00000000152046 ms | [b1 00 05] Channel 2: CC Bank Select value: 5

00000000152065 ms | [b1 00 04] Channel 2: CC Bank Select value: 4

00000000152087 ms | [b1 00 03] Channel 2: CC Bank Select value: 3

00000000152108 ms | [b1 00 02] Channel 2: CC Bank Select value: 2

00000000152129 ms | [b1 00 01] Channel 2: CC Bank Select value: 1

00000000152149 ms | [b1 00 00] Channel 2: CC Bank Select value: 0

Hat das jetz mit meinem schieberegler zu tun oder ist der effekt bei euch das gleiche?

Link to comment
Share on other sites

Ich denke, dass es an den Schiebereglern liegt - wie lang ist eigentlich der Faderweg? Ich habe das gerade mal mit den 60 mm Fadern von meinem Korg Microkontrol ausprobiert. Es ist ziemlich schwierig, die Fader so genau zu bewegen, dass die gesendeten CC Werte ohne Unterbrechung steigen (oder fallen). Hingegen klappt das mit den 100 mm Alps (Motor-)fadern meiner MBLC voellig problemlos :)

Es stellt sich natuerlich auch die Frage, inwiefern das exakte Einstellen eines Wertes fuer Deine Anwendung relevant ist. Hierfuer verwende ich normalerweise gerasterte Encoder (oder Inc/Dec Taster)

Gruss, Thorsten.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...