midi-message auf LCD ausgeben

savag

Neues Mitglied
11. Juni 2009
9
0
0
Sprachen
Hallo zusammen, wollte mich erst mal vorstellen.
Ich heiße Mathias (25) und bin noch etwas frisch was den AVR betrifft.
Hab den Beruf des Informationselek. ergriffen in dem ich aber seit 4Jahren nicht mehr arbeite. Arbeite jetzt in der Audiobranche (Entwicklungshelfer, Testadapter bau für Geäte und und und)
Beschäftige mich erst seit 1 Monat mit AVR`s.
Als Testboard verwende ich das myAVR USB (mit Atmega8) und als Compiler bascom.
Habe auch schon so ein paar kleinere sachen damit gemacht LED schalten und was auf dem LCD ausgeben.

Jetzt wollte ich mal was sinnvolles machen und hab da auch schon gleich das erste problem.
Mein Projekt:
Es soll eine Midi Message auf dem LCD ausgegeben werden sobald ich den Fußschalter drücke. den Fußschalter habe ich über eine Standartschaltung (Optokoppler, 1N4148, 220R....) über Pinb.0 an das Board angeschlossen.
Wenn ich mit dem Oscar messe ändert sich beim betätigen des Fußschalters der zustand von Hi auf Lo, also steht schonmal signal an.
Leider weiß ich jetzt überhaupt garnicht wie ich diesen String aus 1er und 0er als Bin oder byte auf meinem LCD ausgeben kann.
Währe für jede weiterführende anregung dankbar, oder wenn ich auch beispielprogramme habt.
 
Hallo, und willkommen im Forum!

Hallo @savag...,
erst einmal willkommen im Forum.

Da Du schon Kenntnisse in der AVR-Programmierung besitzt, würde ich direkt medias in res gehen.

Also, wenn ich Deine Fragestellung richtig verstanden habe, möchtest Du eine "Festtext" auf ein LCD zaubern, immer dann, wenn eine Taste gedrückt bzw. ein Fußschalter betätigt wird.

Hier bietet sich eine Interruptsteuerung mit Flankenerkennung an, die dann eine Interruptserviceroutine mit auf Pointer zeigende Ausgaberoutine triggert.

Könnte in Assembler zum Beispiel so aussehen:

(kommt gleich..Momang....)


Bis dann,
Gruß von Oskar01
 
Hi savag,

irgendwie geht das heute wie am Fließband :D der dritte neue :)

Auch dir ... "Herzlich willkommen" :)

Wenn das so weiter geht komm ich heute ja garnicht mehr aus dem
grüßen raus ;)

Gruß
Dino
 
Im Prinzip....

Hallo @Savag...,

im Prinzip sieht ein solches ASM-Proggi dann so aus.
(Ist hier aber noch nicht getestet, müßte auf spezielle Bedürfnisse
noch abgestimmt werden...)

PHP:
; Reset- and Interrupt-vectors
;
	rjmp Start ; Reset-vector
	rjmp IInt0 ; External Interrupt Request 0

;.....
;
IInt0:
	push temp
	in temp,SREG
	rcall pointerunterprogramm
	out SREG, temp
	pop	temp
reti
;.....

Start:
	cli ; Disable all interrupts
	ldi temp,RAMEND ; stack pointer setzen
	out SPL,temp
	ldi temp, RAMEND
	out SPH, temp
; hier kommen LCD Routinen Portdefinitionen etc. rein
; General Interrupt Mask Register
;External Interrupt Request 0 Enable
	ldi temp,0b11000000
	out GIMSK,temp; General interrupt Maskierungsregister
;	für die Flankentriggerung auf den Default-Porteingängen
; 	initialisieren
; Enable interrupts (Master Interrupt Enable)
	sei ; Enable all interrupts
; Master Control Register Einstellungen
;   Ext Int 0 fallende Flanken-Erkennung
	ldi temp,0b00101110
	out MCUCR,temp
;......

pointerunterprogramm:			; Zeigt auf Text-Array
;
ldi	ZL,	LOW(textx*2)	; Adresse des Strings in den
ldi	ZH,	HIGH(textx*2)	; Z-Pointer laden
rcall	print			; Funktion print aufrufen
;rcall	verz3		; evtl. kurze Pause zwischen Zeichen
ret
;
print:
;
lpm			; erstes Byte des Strings nach R0 lesen
tst	R0		; R0 auf 0 testen
breq	print_end1	; wenn 0, dann zu print_end1
mov	temp,	r0	; Inhalt von R0 nach temp kopieren
rcall	ausgabe		; Ausgabefunktion aktivieren
adiw	ZL:ZH,	1	; Adresse des Z-Pointers um 1 erhoehen
rjmp	print		; zum Anfang springen, um naechstes 
;			; Byte aus dem cseg-Label textx zu holen
print_end1:		; Beenden der Leseroutine
;
ret
;
textx:		; 
;
.db "Fußschaltertext", 0	; Aufruf konstanten Textes  

ausgabe:		; uebergibt Inhalt von "temp" an LCD
;  
rcall	lcdausgabe	; 
ret
;


Bis dann....
Gruß von Oskar01
 
Es geht auch "einfacher"

Hallo @Savag,
es geht natürlich auch "einfacher".
Das angehängte Proggi arbeitet mit dem ATMega8515.
Hatte es zum Testen eines LCD mal aus Jux und Dollerei geschrieben.

Dabei wird mit dem "sbis"-Befehl eine einfache Tastenabfrage gestaltet.
Je nach gedrückter Taste kommt dann ein anderer Text.

Das wär doch was für den Anfang, oder?
Mit den Interrupts ist das nämlich immer "so eine Sache".

Viel Spaß mit dem LCD.
Initialisierung klappt doch schon, oder?

Gruß von Oskar01
 

Anhänge

  • Groschengrab2.asm
    7,1 KB · Aufrufe: 5
hi, ja super das bringt mich schon mal weiter!!!

Danke :)

Habe auch nach gelesen das das beste wohl über interrupts währe.
Nur wie ich das im einzelnen mache da bin ich noch nicht so ganz dahinter gestiegen.
Eigetlich soll kein Festtext erscheinen sondern wenn z.b

100100000100010101100101 übertragen wird soll auf dem lcd
144 69 101 oder
90H 45H 65H

stehen. Also genau der Code in hex oder dec der der Fußschalter gesendet hat.

Ich habe gesehen das der Atmega8 zwei eingänge extra für Interrupt besitzt, ist es durch einen Trick möglich eine ähnlich funktion an anderen Ports zu machen??

Gruß Mathias
 
Mir ist gerade aufgefallen das das Programm das du mir zur verfügung gestellt hast nicht in Bascom geschrieben wurde.
wurde deins in C geschrieben?
 
Umrechnungsroutinen

Hallo @Savag...,
ok.
Mit welcher Programmiersoftware arbeitest Du?
Also, die Proggis sind unter Verwendung des STK500 EVA-Boardes und der mitgelieferten Software Studio 4 in Assemblersprache geschrieben worden.

Das dürfte aber keine Probleme geben, oder?

(Unser Bascom-Experte heißt übrigens @Markus, der in BASCOM gerne wohl weiterhilft, nehme ich mal an......-))

Anbei noch Codeschnipsel als Denkanstöße, wie man binäre Registerinhalte in den ASCII-Code für das LCD aufbereitet, einmal als Darstellung in Dezimalschreibweise (für 2 Stellen einer Uhrenschaltung) und Hexadezimalschreibweise.

Hoffe, das hilft schon mal ein bißchen weiter......


Gruß von Oskar01
 

Anhänge

  • Umrechnungen.asm
    2,2 KB · Aufrufe: 6
Ich Arbeite mit Bascom und kenn mich mit anderen Sprachen garnicht aus.

Ich bekomme das allein vom verständniss momentan nicht hin.
kann jemand vom ablauf beschreiben, wie ich das empfange byte das zu jeder x beliebigen zeit an Pinb.0 ansteht so auswerten kann das es auf meinem LCD angezeigt wird

an PD2 und PD3 von meinem Atemga 8 hängt mein LCD deswegen veruche ich auf die Interrupts zu verzichten

Ich hab gelesen das es bei Bascom Befehle gibt wo ich z.b sage:
1. über Pinb.0, kommt 8N1 Bits, mit 31250baud
2. warte so lange bis diese bits übertragen sind
3. schreibe die bits in Speicher XXXX
4. nimm das was in speicher XXXX steht und schreib es als HEX auf das LCD

diese bits werden nun auf einem LCD als HEX wiedergegeben bis neue bits kommen
die dann wiedergegeben werden

leider bin ich nicht weit gekommen da ich nicht weiß wie ich die dafür notwenige befehle verwenden muss
 
U(S)ART ist wohl gemeint hier

Hallo @Savag,
momentan bin ich mit BASCOM total überfragt.
Generell scheint mir aber hier ein kleines Verständnisproblem vorzuliegen.

Du schriebst eben im Beitrag:

Ich hab gelesen das es bei Bascom Befehle gibt wo ich z.b sage:
1. über Pinb.0, kommt 8N1 Bits, mit 31250baud
2. warte so lange bis diese bits übertragen sind
3. schreibe die bits in Speicher XXXX
4. nimm das was in speicher XXXX steht und schreib es als HEX auf das LCD

Nun, 8N1Bits bezieht sich auf eine Konfiguration, die die serielle Datenübertragung nach dem RS232-Protokoll verwendet, also etwas diametral Entgegengesetztes zu dem, wie ich Deine Ausführungen eingangs verstanden hatte.

Dafür gibt es dann das Feature U(S)ART bei den ATMEL AVRs.
Also, Universelle-(synchrone-)-asynchrone-Empfänger-Sender-Konfiguration.

Dafür benötigst Du auch im einfachsten Falle zunächst keine Interrupts.

Wie man nun den UART (- ich nehme mal den Synchronbetrieb hier bewußt raus-) konfiguriert, könntest Du hier nachlesen.
Da gibt es auch ein paar kleine Tricks und Kniffe.

http://www.avr-praxis.de/forum/showthread.php?t=178

Oder Du könntest beides machen, dazu wird obiges Beispielprogramm simpelsterweise um die UART-Sende-Empfangs-Routinen ergänzt. Siehe auch ASM-Proggi-Beispiel unten angehängt.
Das ist das gesamte Uhren- bzw. Meßwerterfassungs-Proggi, Umrechnung in Dezimal- und Hex-Format und ASCII-Ausgabe auf LCD drin.
Du könntest Dir das Wesentliche dann herauspicken.
Noch etwas: Hier wird der ATMEL ATTiny2313 verwendet, der hat zum Beispiel eingeschränkte Portbreiten, andere UART-Strings (- nur 8-Bit, nicht 16 Bit, wie bei dem ATMega8 zum Bleistift-) und nur den LOW-Bereich des Stapels, also das Prog müßte dann noch Deinem verwendeten AVR angeglichen werden.

Gruß von Oskar01
 

Anhänge

  • Eingabeseriell.asm
    17,1 KB · Aufrufe: 6
das stimmt synchron geht da nix.
Das midi und das rs232 Signal sind die gleichen nur das midi mit 5v arbeitet.
Ich werde mal versuchen den Uart zu konfigurieren.
Ich habe vermutlich auch schon alle Befehle auf meinem Schreibtisch liegen aber nur die Verknüpfungen da bin noch etwas Irr.

Ich habe ein ähnliches Programm gefunden das die Signale einer RC5 Fernbedienung auswertet, aber das jetzt so umzuschreiben das es für einen
Midi Fußschalter ist da bin ich einfach momentan an der grenze.

Hatte auch schon mal gegoogelt nach Midi-Sniffer, ist ja nixanderes was ich da auch mache. Ich schaue mir auch einfach nur an was auf dem Midi weg so los ist. Aber irgendwie werd ich da nicht schlau draus.

Ich danke dir dennoch für die freundliche Unterstützung bei dieser sache.
 
RS232 ungleich V24

Hallo @Savag,
da kommen wir der Sache schon näher.
Also der UART bei den ATMEL AVRs arbeitet auch mit 5-Volt-Pegel,
man muß ja erst den Pegelwandler-Inverter (meistens MAX232 oder ähnlich) dazwischenschalten, will man auf die PC-Kommunikationsebene nach dem V24-Standard kommen, aber das kann man sich hier natürlich zunächst schenken.

Die MIDI-Spezifikation arbeitet ja mit den verschiedenen "Controllern", als da wären, "Tonhöhe" (Taste am Keyboard), "Anschlagsdynamik" (wie "schnell" die Taste am Keyboard gedrückt bzw.losgelassen wird), und was war das dritte noch...ähh.. fällt mir im Moment nicht ein, obwohl ich viel mit Notensatz und MIDI arbeite.

Da kommt doch der 15-polige Joystick-Port an der PC-Soundkarte zum Tragen, gelle?

So, dann noch viel Erfolg, ich hoffe, Du berichtest dann hier über den Fortschritt Deines Projektes noch.....

So long...

Gruß von Oskar01

P.S.:Die Orgel von St. Peter in Köln hat auch eine MIDI-Schnittstelle, man muß ja mit der Zeit gehen.....-))
 

Anhänge

  • MITKAD3.zip
    2,7 KB · Aufrufe: 8
MIDI-Schnittstelle

Hallo zusammen,

ich hab mal nen paar Daten zu MIDI zusammengefaßt damit alle wissen wovon
die Rede ist. (Wikipedia läßt grüßen ;) ) Musical Instrument Digital Interface

- 31250 Bit/s (31,25kBaud) 8n1
- Stromschleife (also eher wie ne 20mA-Serielle und nicht wie ne +/-12V)
- Ein-/Ausgänge über Optokoppler
- 5pol-Diodenstecker bei dem Pin 4+5 verwendet werden
- Pin4 = +5V , Pin5 = Signal (siehe hier)
- 1 (High) = Strom fließt , 0 (Low) = kein Strom
- MIDI-Out (Master-Out) , MIDI-In (Slave-In) , MIDI-Thru (Slave-Out)
- Beim Ausgang sind zu beiden Pins 220 Ohm Widerständein Reihe
- Beim Eingang ist auch ein 220 Ohm Widerstand in Reihe zum Optokoppler
- 0xF7 scheint die Übertragung abzuschließen (kommt aber auch im Header vor)
- Es sollten schnelle Optokoppler (PC-900, 6N136, ...) eingesetzt werden

hier sind auch noch elektrische Spezifikationen.
und hier auch ... MIDI - Tech Specs & Info

Also mit dem 0x7F (EOX) als Datensatz-Ende bin ich mir nicht so ganz im
klaren. Das scheint kommt auch im Header vor und evtl auch in den Daten.
Könnte also kompliziert werden, den Datensatz wirklich einzeln darzustellen
ohne nen Interpreter für die reinkommenden Daten zu programmieren.

Auf jeden Fall sind die notwendigen Daten jetzt schon mal im Thread drin ;)

Also die Physik und USART ist auf jeden Fall nen Kinderspiel. Das größere
Problem sehe ich in der Interpretation des Datenstroms.

Gruß
Dino
 
So, hab nun mal endlich den ersten erfolg gehabt, ist fast unglaublich :D
Jetzt kommt nur noch das zweite problem, wobei ich schon gelesen habe wie man es löst aber ich weiß eben nur noch das ich es gelesen habe.

Also:
Wenn ich den Fußschalter drücke erscheint das erste byte auf meinem LCD aber die 2 die noch gesendet werden gehen unter.

momentan sieht das dann so aus:
Fußschalter wird gedrückt ->nix passiert
FS wird noch mal gedrückt ->nix passiert
FS wird nochmal gedrückt -> ausgabe disblay -> 144 144 144
er wartet immer bis die 3 mal get gefüllt sind und gibt dann aus

hier mal der code:
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 13250
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Cursor Off

Open "comb.0:13250,8,n,1" For Input As #1
Dim A As byte , B As byte , C As byte

Do

Get #1 , A
Get #1 , B
Get #1 , C
Cls
Lcd A ; " " ; B ; " " ; C

Loop
End
 
Hi savag,

hier mal der code:
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 13250
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Cursor Off
das sind nach meinen Infos 31250 Baud (31,25kBaud), Fehler beim
Copy&Paste oder im Sourcecode ? Oder ... ?

Gruß
Dino
 
Hallo Dino

Ja du hast recht, diese Zeile hatte ich vergessen raus zu nehmen, denn das funzt auch ohne die Baud angabe da diese ja eigentlich schon weiter unten definiert ist. Also so hab ich das mal festgestellt.

Aber das Problem liegt ja jetzt darin das ich nicht weiß wie ich bascom sage das er weitere bytes die ja nach dem ersten noch kommen in meine Variablen B und C steckt.
 
Hallo Savag!

Ich habe den GET-Befehl zwar selbst noch nicht verwendet bin aber der Meinung, dass dieser immer auf einen "Eingang" wartet.

Demnach wird dein LCD auch erst dann aktualisiert, wenn das letzte GET "gefüllt" ist.... weil erst dann dein Programm weiter abgearbeitet wird.

Schätze mal, du musst dein kleines Programm etwas umschreiben. ;)

Um dies zu testen, kannst du ja einfach mal eine LED togglen lassen....
Zum Beispiel wird nach jedem GET die LED "umgeschaltet" (evtl. noch ein Waitms 100 einbauen).
So kannst du sehen, ob dein Programm auch ohne Dateneingang durchläuft.


Ich habe da aber mal zwei Fragen.....
Warum müssen es denn drei Variablen gleich nacheinander sein? :hmmmm:
Was bringt es dir eigentlich, die empfangenen Werte auf dem Display auszugeben? :hmmmm:

Grüße,
Cassio
 
ich weiß nicht wie ich das am besten lösen kann, wenn es eine andere möglichkeit gibt die 3 byte auf dem lcd darzustellen dann werd ich das gern versuchen.

Es geht einfach nur dabei darum das man sieht was genau auf der Midi leitung los ist.

Und ich wollte gern das es auf diese weise auf dem LCD steht.

sobald die 3 byte übertragen wurden wird ja so lange nix mehr übertragen bis ich den Fußschalter wieder drücke.
Es würde auch nichts mache wenn ich so lange warten müsste bis die get mit jeweils einem byte gefüllt währen.
In der Hilfe steht das man bei GET auch noch die länge und die position definieren kann, leider weiß ich damit garnicht um zu gehen.
Könnt ich dann z.B sagen

get #1, A, 1 'schreibe von ch1 das 1te byte in var A
get #1, B, 2 'schreibe von ch1 das 2te byte in var B
get #1, C, 3 'schreibe von ch1 das 3te byte in var C

Oder wie kann man das verstehen:

GET #channel, var
GET #channel, var , [pos] [, length]

Hat vieleicht jemand ein kleines Beispiel wo ich mich mal orientieren könnte??

Gruß Mathias
 
Hallo Savag!

Vielleicht habe ich ja auch irgendetwas falsch (oder gar nicht) verstanden, aber...

Du betätigst doch drei mal das Fußpedal.....
Dann bekommst du die Anzeige 144 , 144 , 144

Demnach wurde doch jedesmal das "Signal" 144 gesendet.
Warum musst du also drei Bytes empfangen? :hmmmm:

Irgendwie bekomme ich wohl den Dreh nicht.....


Nur interessenhalber für mich:
Wo greifst du das Signal denn ab?
Hat dein Keyboard eine Midi-Schnittstelle, oder machst du das am Fußpedal?
Ich habe hier auch ein Yamaha-Keyboard stehen.... habe aber außer mit den Midi-Dateien auf Diskette noch nichts damit gemacht.

Ich weiß zwar dass man damit auch eine Verbindung zum PC herstellen kann, aber..... ;)

Gruß,
Cassio
 
Hallo zusammen,

nach dem was ich da über Midi gelesen habe kommen da ein paar mehr Bytes.
So ein Datensatz scheinen um die 8 Byte zu sein oder irre ich mich da ?
Die Daten-Sequenzen in den Referenz-Unterlagen waren auf jeden Fall
mehr als 3 Byte. Immer so um die 2 Byte Header (oder Adresse oder was weiß ich) und dann einige Datenbytes unnd danach ein Byte als Ende.

Darum meinte ich ja das man da um nem Interpreter für die Daten nicht rum
kommt. Es gibt wohl einiges an verschiedenen Daten-Sequenzen und irgendwie
hab ich nicht rausgefunden wie man rausbekommt wann die Sequenz zu ende
ist oder wie lang sie ist.

Wenn man einfach nur 3 Bytes auf die Anzeige packt wird man auf jeden Fall
auch mal per Zufall in die Mitte so einer Sequenz greifen. Und was da steht
kann man nicht unbedingt voraussagen.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)