Forum: Mikrocontroller und Digitale Elektronik Atmega Midi und Bascom


von Frank B. (frankbroma)


Lesenswert?

Guten Tag,

bevor ich meine Tischplatte ganz durch beiße möchte ich mich an euch 
wenden, denn im Moment drehe ich mich etwas im Kreis und die 
Suchfunktion hat auch nicht so richtig die passenden Ergebnisse 
gebracht.

Also ich will mittels eine Midi-Fußleiste (zum Beispiel 
http://www.thomann.de/de/rocktron_midi_xchange.htm) per Mide-Befehle 
über einen Atmega ein paar Relais schalten die dann Lampen ein und 
ausschalten.

Die Fußleiste die ich habe sendet auf Kanal 1 und immer einen "Programm 
Change" Befehl. Wenn ich das Midi-Protokoll richt verstanden habe, dann 
wir im ersten Byte der Programm Change im oberen Nibbel und der Kanal im 
unteren Nibbel übertragen und die Programmnummer folgt im zweiten Byte.
Zum Test wollt eich jetzt das zweite Byte auslesen und die Bits dann auf 
ein paar LEDs "übertragen" was allerdings nicht so richtig funktioniert. 
Daten werden zwar empfangen aber irgendwie passt die zu erwartende 
Anzeige nicht zu der tatsächlichen Anzeige. Wenn ich z.B. Programm 
Nummer 1 oder 2 schicke, dann müssten nur die ersten beiden LEDs an 
gehen, es gehen aber viel mehr an und auch vergleiche der Art Byte = 1 
oder Byte = 2 funktionieren irgendwie nicht.
Ich weiss nicht ob ich einen grundlegenden Denkfehler mache oder der 
Ansatz falsch ist und von daher wäre ich für jede Tipps sehr dankbar.
Hier ist der Programmansatz:
1
$regfile "m168def.dat"
2
$crystal = 8000000
3
$baud = 31250
4
5
On Urxc Onrxd
6
Enable Urxc
7
Enable Interrupts
8
9
Dim Rxbyte As Byte
10
Dim I As Integer
11
I = 0
12
13
Led1 Alias Portc.5
14
Config Portc.5 = Output
15
Led2 Alias Portc.4
16
Config Portc.4 = Output
17
Led3 Alias Portc.3
18
Config Portc.3 = Output
19
Led4 Alias Portc.2
20
Config Portc.2 = Output
21
Led5 Alias Portc.1
22
Config Portc.1 = Output
23
Led6 Alias Portc.0
24
Config Portc.0 = Output
25
26
27
Cls
28
Do
29
Loop
30
31
32
Onrxd:
33
   If I = 1 Then
34
    Rxbyte = Udr
35
36
    Led1 = Rxbyte.0                                        
37
    Led2 = Rxbyte.1                                         
38
    Led3 = Rxbyte.2                                         
39
    Led4 = Rxbyte.3                                         
40
    Led5 = Rxbyte.4                                   
41
    Led6 = Rxbyte.5
42
    Waitms 500
43
    Gosub Reset_leds
44
    I = 0
45
46
    Else
47
      Incr I
48
    End If
49
50
Return
51
52
Reset_leds:
53
  Led1 = 0
54
  Led2 = 0
55
  Led3 = 0
56
  Led4 = 0
57
  Led5 = 0
58
  Led6 = 0
59
Return

Ein Problem mit der Hardware selbst schließe ich aus. Diese ist getestet 
und überprüft. Ich vermute eher, dass das Problem vor dem Bildschirm 
sitzt ;-)

Vielen Dank.
Frank

von Rene B. (themason) Benutzerseite


Lesenswert?

Ich würde dir drigend empfehlen die empfangenen Daten in einer 
Statemachine zu verarbeiten und nicht "blind" einfach jedes zweite Byte 
"fressen".
Wenn die Fußtreter einen running-status sendet (oxfe glaub ich), oder 
die Daten "komprimiert" sendet dann funktioniert deine Vorgehensweise 
nicht.
Einfach eine Statemachine implementieren die im Startzustand auf ein 
Program-Change Befehl "wartet", dann in einen anderen Zustand 
weiterschaltet indem dein Datenbyte ausgewertet wird. Ist der befehl 
komplett "durchgelaufen" wieder in den ersten Zustand auf ein erneutes 
Program-Change warten.
Sich bei MIDI darauf zu verlassen das jedes zweite Byte dies und das ist 
nur weil man nur diese Befehlstypen erwartet geht zu 120% in die Hose.

von Frank B. (frankbroma)


Lesenswert?

Hallo,

natürlich muss noch eine gewisse Sicherheit implementiert werden. Das 
Programm ist auch nur als "Test" anzusehen um zu sehen was tatsächlich 
ankommt und die grundsätzliche Frage ist, ob der Ansatz richtig ist oder 
ob eine andere Art des Datenempfangs sinnvoller bzw. besser geeignet 
ist.
Die Daten die der vorhandene Fußschalter liefert habe ich mir mit einem 
Midi-Monitor am PC angeschaut und dort zeigt Byte 1 und Byte 2 genau 
das, was ich auch erwartet würde (laut Midi-Protokoll) aber wenn ich wie 
oben gezeigt das zweite Byte direkt ausgeben will, dann bekommen ich 
eine andere Anzeige bzw. es sind Bits gesetzt, die eigentlich nicht 
gesetzt sein sollten.

Viele Grüße, Frank

von Rene B. (themason) Benutzerseite


Lesenswert?

>ob der Ansatz richtig ist oder ob eine andere Art des Datenempfangs
>sinnvoller bzw. besser geeignet ist.

Wie gesagt : Statemachine. Ist das einzig sinnvolle bei MIDI-Empfang. 
Und die "Sicherheit" bekommst du damit automatisch. Einfach Bytes zählen 
wäre mir zu riskant, zumal eben der Fußtreter evtl noch 0xfe schickt 
oder die Daten "komprimiert" (Folgedaten werden dann ohne gesetztem 7. 
Bit übertragen und beziehen sich dann auf das zuletzt versendete 
Kommando)

>Midi-Monitor am PC angeschaut und dort zeigt Byte 1 und Byte 2 genau
>das, was ich auch erwartet würde

Edit :

Und sicher das der die 0xFE (sofern deine Fußtretminen den senden) nicht 
vllt einfach nur nicht anzeigt bzw ggf "komprimierte" Daten nicht 
automatisch dekomprimiert ?

von Frank B. (frankbroma)


Lesenswert?

entschuldige bitte die späte Antwort...

Ich bin mir sehr sicher, daß der Bodenschalter nur zwei Byts sendet denn 
ich habe bereits ein C-Programm für das Board, welches nur das zweite 
Byte auswertet und auch richtig anzeigt. Allerdings würde ich gerne aus 
verschiedenen Gründen nicht auch noch mit C anfangen wollen - nur wenn 
es überhaupt nicht anders geht.
Von daher bin ich mir also sehr sicher, daß der eigentliche "Denkfehler" 
im BASCOM Programm liegt und nicht an der Hardware, dem Board oder dem 
Sender.

Was mir derzeit noch nicht ganz klar ist: werden Daten die über UART 
gesendet werden irgendwo zwischengespeichert bis diese abgeholt werden 
oder überschreiben sich die Daten gegenseitig ?

Viele Grüße, Frank

von Frank B. (frankbroma)


Lesenswert?

Hallo,

so, ich bin einen großen Schritt weiter. Ursache für die ganze 
Verwirrung scheint $crystal = 8000000 zu sein. Wird der Wert auf 1000000 
geändert dann werden Daten empfangen, welche logischer zu sein scheinen. 
Ich muss diese jetzt noch im Detail auswerten.
Das ist auf der einen Seite jetzt schön aber auf der anderen Seite 
verwirrt es mich jetzt doch noch mehr.
Der Atmega16 wird mit einem externe Quarz betrieben welches mit 7,3728 
angegeben ist. Die Baud-Rate bei MIDI ist 31,25 kBit. Wie errechnet man 
nun die Optimale Einstellung für den Parameter $cyrstal ? In der 
Bascom-Hilfe bin ich leider nicht fündig geworden.

Viele Grüße, Frank

von Karl H. (kbuchegg)


Lesenswert?

Frank Broma schrieb:

> Der Atmega16 wird mit einem externe Quarz betrieben welches mit 7,3728
> angegeben ist. Die Baud-Rate bei MIDI ist 31,25 kBit. Wie errechnet man
> nun die Optimale Einstellung für den Parameter $cyrstal ?

Gar nicht!
Du gibst das an, was du hast.
WEnn du einen Quarz mit 7.3728 Mhz am M16 hast und der auch aktiviert 
ist, dann schreibst du da auch 7327280 rein.

Lüg niemals deinen Compiler an!


> Wird der Wert auf 1000000
Also 1Mhz

Das heißt, dein Quarz ist noch gar nicht aktiv.
Der M16 läuft immer noch auf Auslieferungszustand mit dem eingebauten 
RC-Schwingkreis auf ungefähr 1Mhz.

> so, ich bin einen großen Schritt weiter.
Hättest du dir alles sparen können, wenn du erst mal den Banaltest 
gemacht hättest und eine LED mittels Wait(1) im Sekundentakt hättest 
blinken lassen. Deine Sekunde wäre nicht 1 Sekunde gewesen und du 
hättest gewusst, dass mit der Takversorung was nicht stimmt.
Du gehst mir ein wenig zu sorglos an die Dinge ran (siehe zb das partout 
darauf bestehen, dass man keine Fehlercheck braucht um das Datenbyte zu 
isolieren. Und nein, das ein C-Programm das kann, ist kein Argument. Das 
ist genauso schlecht gemacht. Wenn dir auf der Bühne dann das erste mal 
das Kabel abgeht, du es in der Hektik schnell wieder einsteckst und dann 
drauf kommst, dass nichts mehr stimmt, weil deine banale 1-2-1-2 Zählung 
sich nicht mehr richtig einklinkt, dann wirst du dich dafür verfluchen, 
dass du das bischen Aufwand nicht getrieben hast, dass COmmandobyte zu 
identifizieren)

von so (Gast)


Lesenswert?

Man rechnet gar nicht. man stellt crystal auf den Wert, mit dem der Chip 
läuft. Wenn das Timing kritisch ist, musst Du einen Quarz anschließen.

Bascom "rechnet" selbst aus, wie viele Wartetakte er bei 31,5kBit und 
z.B. 8MHz Takt einlegen muss.

von Frank B. (frankbroma)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Du gehst mir ein wenig zu sorglos an die Dinge ran (siehe zb das partout
> darauf bestehen, dass man keine Fehlercheck braucht um das Datenbyte zu
> isolieren.

Das ist nicht richtig wiedergegeben. Ich habe nicht behaupte, daß ich 
keinen Fehlercheck oder ähnliches machen will. Im ersten Ansatz ging es 
nur darum die reinen Daten die übermittelt werden irgendwie anzuzeigen. 
Das kann man auch in dem Programm erkennen welches oben steht. Nicht 
mehr und nicht weniger. Aber nachher kam man sich natürlich weit aus dem 
Fenster lehnen. Nicht sehr hilfreich.

Da aber noch kein Meister vom Himmel gefallen ist stehe ich der Sache 
weiterhin positiv gegenüber zumal dies der Erste Ansatz mit einem Atmel 
ist.

Viele Grüße, Frank

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.