Forum: Mikrocontroller und Digitale Elektronik Potentiometer erzeugung eines Midisignals


von Fabian F. (fabiii9)


Lesenswert?

Hallo,

ich habe jetzt lange experimentiert ein Poti mit dem integriertem ADC 
wandler eines Atmega8 auszulesen.

Hat auch super funktioniert.

Nun stehe ich vor der nächsten Herausforderung.

immer wenn ich an dem Poti drehe soll der passende Midi Controller wert 
(0...127) gesendet werden.
Habe hier auch einen Code, allerdings tut sich da gar nichts (keine 
Fehlermeldung).
Wenn ich am poti drehe wird kein Midisignal gesendet.

Der ADC Poti Teil wurde mit einer testschaltung getestet und auch ist 
der Midiausgang getestet.

=> Schaltungsaufbau passt.

Denke, dass ich da im Code irgendwas falsch hab.
wäre nett wenn jemand drüber schauen könnte, ich seh mitlerweile einfach 
nichts mehr. :)
1
#include <avr/io.h>
2
#include <avr/io.h>
3
#define F_CPU 1000000              // 1 MHz
4
#define BAUD 31250                // MIDI-Baudrate (31,25kBit)
5
#include <util/setbaud.h>
6
void adc_init (void){
7
8
  //interne Referenzspannung
9
  //ADMUX = 0xC0;
10
11
  //AVCC
12
  //ADMUX = 0x40;
13
14
  //AREF
15
  ADMUX = 0xC0;
16
17
18
  ADCSRA = 0x80; //ADC aktivieren, Rest 0 setzen
19
20
  //ADCSRA |= 0x01; //Vorteiler 2
21
  //ADCSRA |= 0x02; //Vorteiler 4
22
  //ADCSRA |= 0x03; //Vorteiler 8
23
  //ADCSRA |= 0x04; //Vorteiler 16
24
  ADCSRA |= 0x05; //Vorteiler 32
25
  //ADCSRA |= 0x06; //Vorteiler 64
26
  //ADCSRA |= 0x07; //Vorteiler 128
27
28
  ADCSRA |= (1<<6); //Konvertierung starten
29
30
while(ADCSRA & (1<<6)){}; //Kovertierung beendet
31
32
uint16_t ergebnis = 0;
33
34
ergebnis = ADCL;
35
ergebnis += (ADCH<<8);
36
37
}
38
39
40
uint16_t adc_read (uint8_t kanal){
41
42
static uint8_t init = 0;
43
44
if(init==0){adc_init(); init++;} //beim ersten Aufruf zunaechst initialisieren
45
46
ADMUX &= (0xE0); //Vorhandenen Wert fuer den Kanal loeschen
47
48
//den Wert fuer den Kanal schreiben, dabei die vorderen 3 Bits vor evtl. fehlern schuetzen
49
50
ADMUX |= (kanal&(0x1F));
51
52
ADCSRA |= (1<<6); //Konvertierung starten
53
54
55
56
while(ADCSRA & (1<<6)){}; //Kovertierung beendet
57
58
uint16_t ergebnis = 0;
59
60
ergebnis = ADCL;
61
ergebnis += (ADCH<<8);
62
63
return ergebnis; //Ergebnis zurueckgeben
64
65
}
66
67
int main(void)
68
  {
69
    float messung;
70
    float schweller;
71
    
72
    DDRD = 0b00111111;
73
    while(1)
74
    {
75
      messung = adc_read(2);
76
      
77
      schweller = messung/8;
78
      }
79
      
80
    }
81
void uart_init(void){
82
  UBRRH = UBRRH_VALUE;
83
  UBRRL = UBRRL_VALUE;
84
  #if USE_2X                  // U2X-Modus erforderlich
85
  UCSRA |= (1 << U2X);
86
  #else                    // U2X-Modus nicht erforderlich
87
  UCSRA &= ~(1 << U2X);
88
  #endif
89
  UCSRB |= (1<<TXEN);              // UART TX einschalten
90
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1
91
}
92
93
void uart_putc(unsigned char c){
94
while (!(UCSRA & (1<<UDRE))){}        // warten bis Senden moeglich
95
UDR = c;                  // sende Zeichen
96
  }
97
  
98
  void Sendmidicontrol(void){
99
    uart_putc(176);                // Control-Comment
100
    uart_putc(main());             // Control # (0-127)
101
    uart_putc(127);                // Control Value (0-127)
102
  }
103
  
104
int main1(void){
105
  uart_init();          // Uart initialisieren
106
  DDRD |= (1<<PD1);        // PD1 Output
107
  while(1){            // Endlosschleife
108
    Sendmidicontrol();      // Ende Endlosschleife
109
  }
110
}

Der Wert ADC Wert (0...1023) muss durch ca. 8 geteilt werden damit ich 
am Ende einen Wert von 0...127 hab.

Hier noch ein Link zu den ganzen MIdimessages:
http://www.midi.org/techspecs/midimessages.php

Vielen herzlichen Dank für eure Bemühungen und eure Zeit !!!

Gruß
Fabi

von Karl H. (kbuchegg)


Lesenswert?

wwnn ich deine main() mal ein wenig sauber einrücke ...
1
int main(void)
2
{
3
  float messung;
4
  float schweller;
5
    
6
  DDRD = 0b00111111;
7
  while(1)
8
  {
9
    messung = adc_read(2);
10
    schweller = messung/8;
11
  }
12
}

wie kommst du auf die Idee, dass sich hier irgendwas tun würde?
Da steht: lies den ADC WErt aus. Dann nimm ein Achtel davon und ... 
weiter nichts.
Du steht nichts davon, dass irgendwie verglichen werden soll, ob sich 
der WErt verändert hätte. Da steht auch nichts davon, diesen Wert per 
MIdi zu versenden. Da steht praktisch gar nichts, ausser: ADC auslesen.

Also: wie gehts weiter in deinem Programm?

von Dietrich L. (dietrichl)


Lesenswert?

Ich sehe da ein mittleres Chaos. Sortiere mal die Teile mit richtiger 
Einrückung, sonst sucht man sich ja den Wolf...

Was mir spontan einfällt:
- in der while-Schleife von 'main' wird gar nicht gesendet; wie soll da 
was herauskommen?
- 'main' ist das Hauptprogramm; was soll das hier:
1
    uart_putc(main());             // Control # (0-127)
- was macht 'main1'? Das wird nie aufgerufen...

Ich glaube, da ist einiges durcheinander gekommen...

Gruß Dietrich

von Karl H. (kbuchegg)


Lesenswert?

Ähm
1
int main1(void){
2
...


du kannst nur EIN main() im Programm haben.

Wenn du 2 verschiedene Programm zu einem einzigen "zusammenführen" 
willst, dann schreibst du grundsätzlich zuallererst einmal ein NEUES 
Programm, in welches du dann die Teile die du brauchst aus Programm A 
einbaust und die Teile die du brauchst aus Programm B einbaust.
ABer leg die Denkweise ad acta, dass du da die beiden Programme 
unverändert einfach übernehmen kannst. Du kannst Teile davon übernehmen. 
Du kannst Ideen davon übernehmen. Du kannst diese Teile/Ideen auch 
kombinieren. Du wirst einzelne Hilfsfunktionen übernehmen können. Aber 
grundsätzlich schreibst du ein neues Programm C.

Dein Programmaufbau wird sein.
1
int main()
2
{
3
  uint16_t schweller;
4
  uint16_t alterWert;
5
6
  uart_init();
7
  adc_init();
8
9
  alterWert = adc_read( 2 ) / 8;
10
11
  while( 1 )
12
  {
13
    schweller = adc_read( 2 ) / 8;
14
    if( schweller != alterWert )
15
    {
16
      alterWert = schweller;
17
18
      uart_sendMsg( schweller );
19
    }
20
  }
21
}

Das ist jetzt nicht 100% korrekt, aber ein bischen was musst du selbst 
auch tun.

: Bearbeitet durch User
von Udo S. (urschmitt)


Lesenswert?

copy paste programmierer

von Fabian F. (fabiii9)


Lesenswert?

Hallo,
vielen Dank für die so schnellen und zahlreichen Antworten!!!
Ein wahnsinns Forum.

Ich habe jetzt nochmal den Code überarbeitet und alles sauber 
eingerückt.

Das kam dabei raus:
1
#include <avr/io.h>
2
#include <avr/io.h>
3
#define F_CPU 1000000              // 1 MHz
4
#define BAUD 31250                // MIDI-Baudrate (31,25kBit)
5
#include <util/setbaud.h>
6
void adc_init (void){
7
8
  //interne Referenzspannung
9
  //ADMUX = 0xC0;
10
11
  //AVCC
12
  //ADMUX = 0x40;
13
14
  //AREF
15
  ADMUX = 0xC0;
16
17
18
  ADCSRA = 0x80; //ADC aktivieren, Rest 0 setzen
19
20
  //ADCSRA |= 0x01; //Vorteiler 2
21
  //ADCSRA |= 0x02; //Vorteiler 4
22
  //ADCSRA |= 0x03; //Vorteiler 8
23
  //ADCSRA |= 0x04; //Vorteiler 16
24
  ADCSRA |= 0x05; //Vorteiler 32
25
  //ADCSRA |= 0x06; //Vorteiler 64
26
  //ADCSRA |= 0x07; //Vorteiler 128
27
28
  ADCSRA |= (1<<6); //Konvertierung starten
29
30
  while(ADCSRA & (1<<6)){}; //Kovertierung beendet
31
32
  uint16_t ergebnis = 0;
33
34
  ergebnis = ADCL;
35
  ergebnis += (ADCH<<8);
36
37
}
38
39
uint16_t adc_read (uint8_t kanal){
40
41
  static uint8_t init = 0;
42
43
  if(init==0){adc_init(); init++;} //beim ersten Aufruf zunaechst initialisieren
44
45
  ADMUX &= (0xE0); //Vorhandenen Wert fuer den Kanal loeschen
46
47
  //den Wert fuer den Kanal schreiben, dabei die vorderen 3 Bits vor evtl. fehlern schuetzen
48
49
  ADMUX |= (kanal&(0x1F));
50
51
  ADCSRA |= (1<<6); //Konvertierung starten
52
53
54
55
  while(ADCSRA & (1<<6)){}; //Kovertierung beendet
56
57
  uint16_t ergebnis = 0;
58
59
  ergebnis = ADCL;
60
  ergebnis += (ADCH<<8);
61
62
  return ergebnis; //Ergebnis zurueckgeben
63
64
}
65
66
int main(void){
67
  uint16_t schweller;
68
  uint16_t alterWert;
69
70
  uart_init();
71
  adc_init();
72
73
  alterWert = adc_read( 2 ) / 8;
74
  
75
  while( 1 )
76
   {
77
     schweller = adc_read( 2 ) / 8;
78
     if( schweller != alterWert )
79
     {
80
       alterWert = schweller;
81
82
       uart_putc(schweller);
83
     }
84
   }
85
}
86
  
87
void uart_init(void){
88
  UBRRH = UBRRH_VALUE;
89
  UBRRL = UBRRL_VALUE;
90
  
91
  #if USE_2X                  // U2X-Modus erforderlich
92
  UCSRA |= (1 << U2X);
93
  #else                    // U2X-Modus nicht erforderlich
94
  UCSRA &= ~(1 << U2X);
95
  #endif
96
  UCSRB |= (1<<TXEN);              // UART TX einschalten
97
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1
98
}
99
100
void uart_putc(unsigned char c){
101
  while (!(UCSRA & (1<<UDRE))){}        // warten bis Senden moeglich
102
  UDR = c;                  // sende Zeichen
103
}
104
  
105
void Sendmidicontrol(void){
106
  uart_putc(176);          // Control-Comment
107
  uart_putc(100);          // Control # (0-127)
108
  uart_putc(100);          // Control Value (0-127)
109
}

Ich bezweifel nur, dass dieser Code funktioniert, da er ja jetzt jeden 
"uart_putc() auf "schweller setzt" mit diesem Aufruf:
1
 uart_putc(schweller);

Was ist falsch??

Ich bedanke mich jetzt schonmal.

Immer wenn man so kurz vor dem Ziel nicht mehr weiter kommt, macht einen 
echt aggresiv. ;) ;) ;)


Gruß
Fabi

: Bearbeitet durch User
von Hugo Egon Balder (Gast)


Lesenswert?

Fabian Müller schrieb:
> Ich bezweifel nur, dass dieser Code funktioniert, da er ja jetzt jeden
> "uart_putc() auf "schweller setzt" mit diesem Aufruf:
> [c]
>  uart_putc(schweller);

Das ist doch genau das, was du wolltest!

von Fabian F. (fabiii9)


Lesenswert?

Hallo,

danke für deine Antwort.

Habe es soeben ausprobiert.
Bei diesem Code wird das alles gesendet:
1
 TIMESTAMP IN PORT STATUS DATA1 DATA2 CHAN NOTE EVENT               
2
 Opened MIDI Input
3
      7063  1  --    144   126   124    1  F# 9 Note On               
4
      7064  1  --    144   126   124    1  F# 9 Note On               
5
      7082  1  --    144   122   120    1  D  9 Note On               
6
      7083  1  --    144   122   120    1  D  9 Note On               
7
      7102  1  --    144   118   116    1  Bb 8 Note On               
8
      7103  1  --    144   118   116    1  Bb 8 Note On               
9
      7122  1  --    144   114   112    1  F# 8 Note On               
10
      7123  1  --    144   114   112    1  F# 8 Note On               
11
      7130  1  --    144   110   112    1  D  8 Note On               
12
      7143  1  --    144   110   108    1  D  8 Note On               
13
      7152  1  --    144   106   108    1  Bb 7 Note On               
14
      7162  1  --    144   106   104    1  Bb 7 Note On               
15
      7163  1  --    144   106   104    1  Bb 7 Note On               
16
      7181  1  --    144   102   100    1  F# 7 Note On               
17
      7189  1  --    144    98   100    1  D  7 Note On               
18
      7201  1  --    144    98    96    1  D  7 Note On               
19
      7214  1  --    144    94    92    1  Bb 6 Note On               
20
      7217  1  --    144    94    92    1  Bb 6 Note On               
21
      7219  1  --    144    94    92    1  Bb 6 Note On               
22
      7220  1  --    144    94    92    1  Bb 6 Note On               
23
      7236  1  --    144    90    88    1  F# 6 Note On               
24
      7246  1  --    144    87    88    1  Eb 6 Note On               
25
      7260  1  --    144    86    85    1  D  6 Note On               
26
      7261  1  --    144    86    84    1  D  6 Note On               
27
      7270  1  --    144    83    82    1  B  5 Note On               
28
      7283  1  --    144    81    80    1  A  5 Note On               
29
      7291  1  --    144    79    78    1  G  5 Note On               
30
      7304  1  --    144    77    76    1  F  5 Note On               
31
      7313  1  --    144    75    74    1  Eb 5 Note On               
32
      7324  1  --    144    73    72    1  C# 5 Note On               
33
      7334  1  --    144    71    70    1  B  4 Note On               
34
      7336  1  --    144    71    70    1  B  4 Note On               
35
      7348  1  --    144    69    68    1  A  4 Note On               
36
      7361  1  --    144    67    66    1  G  4 Note On               
37
      7372  1  --    144    65    64    1  F  4 Note On               
38
      7383  1  --    144    63    62    1  Eb 4 Note On               
39
      7392  1  --    144    61    60    1  C# 4 Note On               
40
      7405  1  --    144    59    58    1  B  3 Note On               
41
      7415  1  --    144    57    56    1  A  3 Note On               
42
      7425  1  --    144    55    54    1  G  3 Note On               
43
      7434  1  --    144    53    52    1  F  3 Note On               
44
      7442  1  --    144    51    50    1  Eb 3 Note On               
45
      7453  1  --    144    49    48    1  C# 3 Note On               
46
      7464  1  --    144    47    46    1  B  2 Note On               
47
      7480  1  --    144    45    44    1  A  2 Note On               
48
      7491  1  --    144    43    42    1  G  2 Note On               
49
      7503  1  --    144    41    40    1  F  2 Note On               
50
      7518  1  --    144    39    38    1  Eb 2 Note On               
51
      7527  1  --    144    37    36    1  C# 2 Note On               
52
      7538  1  --    144    35    34    1  B  1 Note On               
53
      7546  1  --    144    33    32    1  A  1 Note On               
54
      7553  1  --    144    31    30    1  G  1 Note On               
55
      7563  1  --    144    29    28    1  F  1 Note On               
56
      7569  1  --    144    27    26    1  Eb 1 Note On               
57
      7579  1  --    144    25    24    1  C# 1 Note On               
58
      7587  1  --    144    23    22    1  B  0 Note On               
59
      7597  1  --    144    21    20    1  A  0 Note On               
60
      7599  1  --    144    19    20    1  G  0 Note On               
61
      7604  1  --    144    19    18    1  G  0 Note On               
62
      7606  1  --    144    17    18    1  F  0 Note On               
63
      7613  1  --    144    17    16    1  F  0 Note On               
64
      7623  1  --    144    15    14    1  Eb 0 Note On               
65
      7624  1  --    144    13    14    1  C# 0 Note On               
66
      7630  1  --    144    13    12    1  C# 0 Note On               
67
      7637  1  --    144    11    10    1  B -1 Note On               
68
      7644  1  --    144     9     7    1  A -1 Note On               
69
      7646  1  --    144     8     7    1  G#-1 Note On               
70
      7650  1  --    144     6     5    1  F#-1 Note On               
71
      7656  1  --    144     4     3    1  E -1 Note On               
72
      7668  1  --    144     1     0    1  C#-1 Note Off              
73
      8909  1  --    144     1     3    1  C#-1 Note On               
74
      8911  1  --    144     1     3    1  C#-1 Note On               
75
      8913  1  --    144     4     3    1  E -1 Note On               
76
      8918  1  --    144     5     7    1  F -1 Note On               
77
      8927  1  --    144     9    11    1  A -1 Note On               
78
      8936  1  --    144    13    14    1  C# 0 Note On               
79
      8941  1  --    144    15    16    1  Eb 0 Note On               
80
      8947  1  --    144    17    18    1  F  0 Note On               
81
      8950  1  --    144    19    20    1  G  0 Note On               
82
      8955  1  --    144    21    22    1  A  0 Note On               
83
      8961  1  --    144    23    24    1  B  0 Note On               
84
      8966  1  --    144    25    26    1  C# 1 Note On               
85
      8970  1  --    144    27    28    1  Eb 1 Note On               
86
      8975  1  --    144    29    30    1  F  1 Note On               
87
      8978  1  --    144    31    32    1  G  1 Note On               
88
      8979  1  --    144    31    32    1  G  1 Note On               
89
      8984  1  --    144    33    34    1  A  1 Note On               
90
      8987  1  --    144    35    36    1  B  1 Note On               
91
      8991  1  --    144    37    38    1  C# 2 Note On               
92
      8995  1  --    144    39    40    1  Eb 2 Note On               
93
      9000  1  --    144    41    42    1  F  2 Note On               
94
      9005  1  --    144    43    44    1  G  2 Note On               
95
      9008  1  --    144    45    46    1  A  2 Note On               
96
      9012  1  --    144    47    48    1  B  2 Note On               
97
      9016  1  --    144    49    50    1  C# 3 Note On               
98
      9020  1  --    144    51    52    1  Eb 3 Note On               
99
      9024  1  --    144    53    54    1  F  3 Note On               
100
      9028  1  --    144    55    56    1  G  3 Note On               
101
      9032  1  --    144    57    58    1  A  3 Note On               
102
      9036  1  --    144    59    60    1  B  3 Note On               
103
      9042  1  --    144    61    62    1  C# 4 Note On               
104
      9046  1  --    144    63    64    1  Eb 4 Note On               
105
      9050  1  --    144    65    66    1  F  4 Note On               
106
      9055  1  --    144    67    68    1  G  4 Note On               
107
      9059  1  --    144    69    70    1  A  4 Note On               
108
      9064  1  --    144    71    72    1  B  4 Note On               
109
      9068  1  --    144    73    74    1  C# 5 Note On               
110
      9072  1  --    144    75    74    1  Eb 5 Note On               
111
      9074  1  --    144    75    76    1  Eb 5 Note On               
112
      9078  1  --    144    77    78    1  F  5 Note On               
113
      9082  1  --    144    79    80    1  G  5 Note On               
114
      9087  1  --    144    81    82    1  A  5 Note On               
115
      9092  1  --    144    83    84    1  B  5 Note On               
116
      9100  1  --    144    86    87    1  D  6 Note On               
117
      9107  1  --    144    88    90    1  E  6 Note On               
118
      9115  1  --    144    92    94    1  G# 6 Note On               
119
      9122  1  --    144    96    98    1  C  7 Note On               
120
      9127  1  --    144   100    98    1  E  7 Note On               
121
      9131  1  --    144   100   102    1  E  7 Note On               
122
      9132  1  --    144   100   102    1  E  7 Note On               
123
      9139  1  --    144   104   106    1  G# 7 Note On               
124
      9148  1  --    144   108   110    1  C  8 Note On               
125
      9156  1  --    144   112   114    1  E  8 Note On               
126
      9161  1  --    144   116   114    1  G# 8 Note On               
127
      9166  1  --    144   116   118    1  G# 8 Note On               
128
      9171  1  --    144   120   118    1  C  9 Note On               
129
      9176  1  --    144   120   122    1  C  9 Note On               
130
      9186  1  --    144   124   126    1  E  9 Note On               
131
      9227  1  --    144   127     0    1  G  9 Note Off              
132
      9260  1  --    144   127     0    1  G  9 Note Off

Dies wird alles gesendet, wenn man den Poti ganz in die eine Richtung 
dreht und wieder ganz zurück dreht.

Eigentlich sollte ja immer ein Controler  Midi Befehl gesendet werden, 
bei dem sich dann der 2nd Byte von 0-127 je nach Stellung des Potis 
variiert.

was ist falsch??

gruß
fabi

Danke!!!!

von Hugo Egon Balder (Gast)


Lesenswert?

Fabian Müller schrieb:
> Eigentlich sollte ja immer ein Controler  Midi Befehl gesendet werden,
> bei dem sich dann der 2nd Byte von 0-127 je nach Stellung des Potis
> variiert.

Dann sende doch das first Byte, und nicht nur das 2nd Byte....

von c-hater (Gast)


Lesenswert?

Fabian Müller schrieb:

> was ist falsch??

Das Grundproblem ist, daß du keine Ahnung hast, was du da eigentlich 
tust.

Ganz offensichtlich (das sehe sogar ich ohne jede Ahnung von MIDI sofort 
anhand des Empfängerprotokolls), besteht ein MIDI-Kommando aus mehr als 
einem Byte.

Und auf diesen Sachverhalt nimmst du keinerlei Rücksicht. Du sendest 
völlig hirn- und zusammenhanglos einzelne Bytes in die Welt, wann immer 
du glaubst, daß es nötig wäre.

Und obendrein bist du zu doof oder zu faul, die Warnungen des Compilers 
zu lesen, denn der hat bestimmt an der Stelle gemeckert, wo du ein 
uint16_t übergibst, die Funktion aber nur ein unsigned char erwartet,

Ja, Programmieren ist was anderes als nur geklauten Code 
zusammzukopieren...

von Karl H. (kbuchegg)


Lesenswert?

Fabian Müller schrieb:

> Eigentlich sollte ja immer ein Controler  Midi Befehl gesendet werden,
> bei dem sich dann der 2nd Byte von 0-127 je nach Stellung des Potis
> variiert.

Ja, dann mach das doch auch!

Das hier
1
       uart_putc(schweller);

verschickt nun mal keinen Midi-Befehl!


Wie hat das denn im Original Programm B ausgeschaut, wo du dir den Code 
geklaut hast.
Das war ja wohl:

in main
1
  while(1){            // Endlosschleife
2
    Sendmidicontrol();      // Ende Endlosschleife
3
  }

und die zugehörige Funktion
1
void Sendmidicontrol(void){
2
  uart_putc(176);          // Control-Comment
3
  uart_putc(100);          // Control # (0-127)
4
  uart_putc(100);          // Control Value (0-127)
5
}

Ganz offensichtlich muss man also für einen Midibefehl 3 mal uart_putc 
aufrufen.
Was auch irgendwie logisch ist.
Das erste Byte ist der Befehl. Das 2.te Byte ist die Nummer des zu 
verändernden Elements und das 3.te Byte ist der neue Wert, den das zuvor 
angegebene Element kriegen soll.

Es spricht nichts dagegen, sich in Fremdcode anzusehen, wie andere die 
Dinge machen bzw. wie es funktioniert.
Aber: Dann muss man sich die Dinge auch RICHTIG ansehen und nicht nur so 
halb.

> ...  so kurz vor dem Ziel ....
Du bist schon am Start gestrauchelt. Da liegt dein eigentliches Problem.
Mach da jetzt nicht das Ziel dafür verantwortlich. Dich hat es vor dem
Startschuss geschmissen, dann hat dich das Forum die 42 Kilometer bis 3
Schitte vor die Ziellinie getragen, nur damit du dann drauf kommst, dass
du am Start deine Startnummer vergessen hast.
So sieht die Realität aus.

: Bearbeitet durch User
von OAmp (Gast)


Lesenswert?

Karl Heinz schrieb:
> Du bist schon am Start gestrauchelt. Da liegt dein eigentliches Problem.
> Mach da jetzt nicht das Ziel dafür verantwortlich. Dich hat es vor dem
> Startschuss geschmissen, dann hat dich das Forum die 42 Kilometer bis 3
> Schitte vor die Ziellinie getragen, nur damit du dann drauf kommst, dass
> du am Start deine Startnummer vergessen hast.
> So sieht die Realität aus.


Zurück auf Los :-)

Ich würde einen einfachen Analog-In für das Schweller-Poti nehmen.
Die Werte in einen laufenden Loop einlesen und dann mit ankommenden
midi-werten mischen. Nur so ist erkennbar dass der Schweller funzt.

Eine Midi-lib sollte verwendet werden - oder selbst erstellt ?

Sowas :

https://www.pjrc.com/teensy/td_libs_MIDI.html

oder modifizieren....

von Fabian F. (fabiii9)


Lesenswert?

Hugo Egon Balder schrieb:
> Dann sende doch das first Byte, und nicht nur das 2nd Byte....

Das sende ich doch auch.
Ich sende 3 Bytes.

c-hater schrieb:
> Und obendrein bist du zu doof oder zu faul, die Warnungen des Compilers
> zu lesen, denn der hat bestimmt an der Stelle gemeckert, wo du ein
> uint16_t übergibst, die Funktion aber nur ein unsigned char erwartet,

Das stimmt so nicht, wenn ich den Code erstelle kommt keine 
Fehlermeldung sonder "sucessful, 0 fails"

OAmp schrieb:
> Eine Midi-lib sollte verwendet werden - oder selbst erstellt ?

danke für den Tipp, jetzt versuche ich erst jetzt mal sound dann schau 
ich mal weiter.

Also werde mal diese Sachen ausprobieren:

Karl Heinz schrieb:
> Das hier       uart_putc(schweller);
>
> verschickt nun mal keinen Midi-Befehl!
>
> Wie hat das denn im Original Programm B ausgeschaut, wo du dir den Code
> geklaut hast.
> Das war ja wohl:
>
> in main  while(1){            // Endlosschleife
>     Sendmidicontrol();      // Ende Endlosschleife
>   }
>
> und die zugehörige Funktionvoid Sendmidicontrol(void){
>   uart_putc(176);          // Control-Comment
>   uart_putc(100);          // Control # (0-127)
>   uart_putc(100);          // Control Value (0-127)
> }
>
> Ganz offensichtlich muss man also für einen Midibefehl 3 mal uart_putc
> aufrufen.
> Was auch irgendwie logisch ist.
> Das erste Byte ist der Befehl. Das 2.te Byte ist die Nummer des zu
> verändernden Elements und das 3.te Byte ist der neue Wert, den das zuvor
> angegebene Element kriegen soll.

Also schonmal vielen Dank.
Finde zwar von manchen Leuten den Umgangston eine Frechheit, aber es 
gibt doch Leute die noch nett schreiben und einem helfen.


Vielen Dank
Gruß
Fabi

P.S.: Die Post wo die Leute nur meckern und keinen Tipp geben auf die 
kann ich verzichten. Dazu ist der Webspace zu schade. :)

von wim (Gast)


Lesenswert?

Fabian Müller schrieb:
> Hugo Egon Balder schrieb:
>> Dann sende doch das first Byte, und nicht nur das 2nd Byte....
>
> Das sende ich doch auch.
> Ich sende 3 Bytes.
Dann schauen wir uns doch mal deine main-Funktion an:

> int main(void){
>   uint16_t schweller;
>   uint16_t alterWert;
>
>   uart_init();
>   adc_init();
>
>   alterWert = adc_read( 2 ) / 8;
>
>   while( 1 )
>    {
>      schweller = adc_read( 2 ) / 8;
>      if( schweller != alterWert )
>      {
>        alterWert = schweller;
>
>        uart_putc(schweller); <------ HIER
>      }
>    }
> }
In der markierten Zeile wird nur 1 Byte gesendet. Ans MIDI Protokoll 
hält sich dieser Teil überhaupt nicht.
Dadurch wundert mich schon, dass überhaupt MIDI erkannt wird.
Du musst insgesamt 3 Bytes senden: das Status Byte ( Control Change / 
MIDI-Kanal ), das 1. Datenbyte ( CC# ) und schließlich deinen Wert 
(schweller).
Dazu könntest du die von Karl-Heinz genannte Sendmidicontrol-Funktion 
z.b. so modifizieren, dass sie einen Wert als Parameter entgegennimmt 
und die 3 Bytes sendet.
Dann muss in der main-Funktion nur noch Sendmidicontrol(schweller) 
aufgerufen werden.

> Finde zwar von manchen Leuten den Umgangston eine Frechheit, aber es
> gibt doch Leute die noch nett schreiben und einem helfen.
Der Umgangston hängt auch davon ab ob der Fragesteller versucht, etwas 
zu verstehen und selbst aktiv an einer Lösung arbeitet oder nur nach dem 
Motto "macht ihr meine Hausaufgaben" auftritt. Und bisher scheinst du 
eher den Eindruck zu machen, dass das zweitere zutrifft.

von OAmp (Gast)


Lesenswert?

Midi-Grundlagen - anschaulich und in Variationen :

http://www.zem-college.de/midi/mc_befe.htm

this is very important :-)

von c-hater (Gast)


Lesenswert?

Fabian Müller schrieb:

> Das stimmt so nicht, wenn ich den Code erstelle kommt keine
> Fehlermeldung sonder "sucessful, 0 fails"

Dann bist du außerdem auch noch zu blöd, dem Compiler zu sagen, daß er 
dir doch bitteschön auch alle Warnungen anzeigen sollte und nicht nur 
die Fehler...

Tipp: Die Fehler erkennt man schon daran, daß kein binary entsteht, da 
sind die Compilermeldungen nur noch insofern nützlich, daß man eventuell 
rauskriegen kann, warum nicht.

Warnmeldungen hingegen sind u.U. dann sehr nützlich, wenn ein binary 
erzeugt wurde, dieses aber nicht das macht, was du willst. Es macht dann 
nämlich das, was du gesagt (vielmehr geschrieben) hast, was es machen 
soll. Das ist oft nicht mit dem identisch, was du gewollt hast, was es 
machen soll. Und die Warnmeldungen können oft helfen, der Ursache der 
Diskrepanzen auf die Spur zu kommen. Im konkreten Fall würden ihre 
Auswertung schon die Hälfte des Problems lösen und vielleicht sogar 
gleich die Erkenntnis bringen, wo die andere Hälfte liegt, nämlich 
(prinzipiell) an derselben Stelle.

Du glaubst, C wären einfach. Und das glaubst du nur deshalb, weil du 
soviel Code zum Raubkopieren findest. Dieser Weg führt in's Verderben. 
Lerne C, wenn du es benutzen willst! Und zwar, bevor du es benutzt...

> P.S.: Die Post wo die Leute nur meckern und keinen Tipp geben auf die
> kann ich verzichten.

Der wesentliche Tipp ist: Lerne deine selbstgewählte Sprache!

Daß dir der Tipp nicht gefällt, ist ein ganz anderes Problem, nämlich 
ein Problem deiner Faulheit oder deiner Dummheit. Oder beides. Das 
kannst nur du selbst entscheiden.

von eProfi (Gast)


Lesenswert?

Wenn das ganze mal einigermaßen funktioniert, wirst Du auch noch 
draufkommen, dass eine Hysterese ganz praktisch wäre.

von Fabian F. (fabiii9)


Lesenswert?

hallo zusammen,
habe es jetzt gelöst.
Ich hatte einfach einen totalen denkfehler.
Sorry für eure Zeit!!!

Aber den Denkanstoß hat doch wieder das Forum gebracht.

Vielen Dank
Gruß
Fabi

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.