Hallo,
ich baue mir zur Zeit einen Midi-Controller auf basis eines ATmega8.
Es funktioniert soweit, dass er die neuen Werte von mehreren AD-Wandlern
sammelt und auch ohne Probleme ausgibt.
Nun möchte ich die Funktionalität einbauen, dass er nur bei einer
Änderung eine neue Midi-Nachricht schickt, habe aber genau da Probleme
mit einem Vergleich.
Nach dem Midi-Protokoll hat jeder Regler eine CC-Nummer und einen Wert,
jeweils 7 Bit ( daher auch nur bis 128 ).
1
uint8_tbuffer[128];
2
3
voidupdate_changes(uint8_tcc,uint8_tval)
4
{
5
//if(val != buffer[cc])
6
{
7
midi_send_cc(cc,val);
8
midi_send_cc(cc,buffer[cc]);
9
midi_send_cc(cc,val!=buffer[cc]);
10
buffer[cc]=val;
11
}
12
}
Zum debuggen hab ich die if-Abfrage auskommentiert ( ist immer false,
egal wie val und buffer[cc] aussehen ), und die Ergebnisse sieht man im
Anhang ( bei den ersten paar ist die logische 0 ja richtig, aber beim
letzten müsste da eine 1 stehen ).
Ich hab nur mal die main.c angehängt, denn spi und midi senden
funktioneren an sich einwandfrei.
Woran könnte es liegen, dass bei dem Vergleich immer false rauskommt,
egal ob val und buffer[cc] gleich sind oder nicht ?
Gruß,
Artur
Hi,
kein Mensch kann wissen was in deinem Buffer steht. Du bist dir schon im
klaren darüber das du den Bufferinhalt an der Position CC mit Val
vergleichst (bezogen auf deinen Anhang)?!
Gruß Andre
Hi,
das Bild im Anhang hat keinen Informationsgehalt, also hättest du es ja
weglassen können. Was für einen Datentyp gibt den die Funktion
spi_transmit zurück ?
Ein uint8_t, hab 4 Eingangs-Schieberegister 74HC165 hintereinander
geschaltet, die Werte von den 4 AD-Wandlern zurückliefern ( was auch
einwandfrei funktioniert ).
Das Bild zeigt zu jedem CC 3 Werte: einmal den der Variable val, einmal
den vom Buffer an der stelle und dann den logischen Wert vom Vergleich
val != buffer, bei den ersten 3 sieht man, dass val und buffer
übereinstimmen, der Vergleich also stimmt. Beim letzten ist der val 0x28
und der buffer 0x3B, für den ATmega gilt jedoch 0x28 == 0x3B ist true,
warum auch immer :(
Hi,
sorry das hab ich im ersten Moment nicht geblickt. Ich würde vermuten
das die Funktion midi_send_cc deine Variablen verändert. Das würdest du
nicht mitbekommen wenn du dir die Variablen nicht merkst.
Probier mal folgendes :
void update_changes(uint8_t cc, uint8_t val)
{
uint8_t valbuf = val;
uint8_t ccbuf = buffer[cc];
midi_send_cc(cc, val);
midi_send_cc(cc, buffer[cc]);
midi_send_cc(cc, valbuf != ccbuf);
buffer[cc] = val;
}
Hi,
ich bin kein Assembler-Experte, daher kann ich das letzte Posting nicht
wirklich bewerten.
Es wäre wohl hilfreich wenn du mehr von deinem Quelltext posten würdest.
Oder du brichst dein Programm soweit runter das du viele Fehler
defenitiv ausschließen kannst.
z.B aus:
midi_send_cc(cc, val != buffer[cc]);
folgendes machen.
if (val != buffer[cc])
{
midi_send_cc(cc, 0x01)
}
else
{
midi_send_cc(cc, 0x00)
}
Ich persöhlich habe keine Ahnung was der Compiler aus val != buffer[cc]
für einen Variable bastelt. Gibts beim kompilieren denn keine Warnung ?
Naja. Genau genommen, wäre der Code mit dem nicht auskommentierten if
noch etwas interessanter.
Aber das Ganze deutet darauf hin, das eben doch keine gleichen Bytes in
dem Array und in der Variablen sind, auch wenn der TO davon überzeugt
ist.