Jump to content

Probleme mit Buttons


lowfreq
 Share

Recommended Posts

So, mein Controller ist jetzt fertig!

Er besteht aus 32 Potis und 64 Tastern mit zugehörigen LEDs.

Ich habe nun das MIOS und mein Programm erfolgreich installiert. Die Potis funktionieren einwandfrei, allerdings habe ich ein Problem mit den Tastern und den LEDs:

Bei Druck auf die Taster passiert erst einmal gar nichts... Ich empfange weder ein Midi-Signal, noch wird irgendeine LED aktiviert. Wenn ich viele Taster hintereinander betätige, werden plötzlich alle Aktivierungen per Midi auf einmal übertragen (Aufstauung der Befehle??). Die LEDs werden immer noch nicht gesetzt.

Was mir leider erst im Nachhinein aufgefallen ist: Ich habe Taster in Schalterform verbaut (Aktivierung -> Wechsel der Spannung, beim Loslassen allerdings nicht zurück). Das sollte technisch gesehen

allerdings kein Problem sein, oder? Die Funktion "DIN_NotifyToggle" sollte ja trotzdem aufgerufen werden.

Ich habe nochmal alles mit einem Multimeter ausgemessen. Die Buttons reagieren einwandfrei... mittlerweile komme ich nicht mehr weiter mit diesem Problem:( Über Hilfe würde ich mich sehr freuen!!

Ich sende nochmal meinen gesamten C-Quellcode mit, vielleicht steckt da ja der Wurm drin

/*
 * MIOS SDCC Wrapper
 *
 * ==========================================================================
 *
 *  Copyright (C) <year>  <name> (<email>)
 *  Licensed for personal non-commercial use only.
 *  All other rights reserved.
 * 
 * ==========================================================================
 */

#include "cmios.h"
#include "pic18f452.h"

// Belegung der Potis (127 Werte, Course)
const unsigned char pot_event_map[32][2] = {
	// Pot 1..16 send CC#0x11 (General Purpose Slider1) over MIDI Channel #1..16	{0xb0, 0x5b},   {0xb1, 0x5b},   {0xb2, 0x5b},   {0xb3, 0x5b}, 
	{0xb0, 0x11},   {0xb1, 0x11},   {0xb2, 0x11},   {0xb3, 0x11}, 
	{0xb4, 0x11},   {0xb5, 0x11},   {0xb6, 0x11},   {0xb7, 0x11}, 
	{0xb8, 0x11},   {0xb9, 0x11},   {0xba, 0x11},   {0xbb, 0x11}, 
	{0xbc, 0x11},   {0xbd, 0x11},   {0xbe, 0x11},   {0xbf, 0x11}, 
	// Pot 17..32 send CC#0x12 (General Purpose Slider2) over MIDI Channel #1..16
	{0xb0, 0x12},   {0xb1, 0x12},   {0xb2, 0x12},   {0xb3, 0x12}, 
	{0xb4, 0x12},   {0xb5, 0x12},   {0xb6, 0x12},   {0xb7, 0x12}, 
	{0xb8, 0x12},   {0xb9, 0x12},   {0xba, 0x12},   {0xbb, 0x12}, 
	{0xbc, 0x12},   {0xbd, 0x12},   {0xbe, 0x12},   {0xbf, 0x12}, 
};

/////////////////////////////////////////////////////////////////////////////
// This function is called by MIOS after startup to initialize the 
// application
/////////////////////////////////////////////////////////////////////////////
void Init(void) __wparam
{
	MIOS_SRIO_UpdateFrqSet(1);	// set shift register update frequency (ms)

	MIOS_AIN_NumberSet(32);		// 32 pots are connected
	MIOS_AIN_Muxed();			// the AINX4 modules are used
	MIOS_AIN_DeadbandSet(7);	// should be 7 when 7bit resolution is used

	MIOS_SRIO_NumberSet(8);		// set IO shift registers for 64 pins

	MIOS_SRIO_DebounceSet(10);	// debouncing value for DINs
}

/////////////////////////////////////////////////////////////////////////////
// This function is called by MIOS in the mainloop when nothing else is to do
/////////////////////////////////////////////////////////////////////////////
void Tick(void) __wparam
{
}

/////////////////////////////////////////////////////////////////////////////
// This function is periodically called by MIOS. The frequency has to be
// initialized with MIOS_Timer_Set
/////////////////////////////////////////////////////////////////////////////
void Timer(void) __wparam
{
}

/////////////////////////////////////////////////////////////////////////////
// This function is called by MIOS when the display content should be 
// initialized. Thats the case during startup and after a temporary message
// has been printed on the screen
/////////////////////////////////////////////////////////////////////////////
void DISPLAY_Init(void) __wparam
{
  MIOS_LCD_Clear();
  MIOS_LCD_CursorSet(0x00);
  MIOS_LCD_PrintCString("Hello World!");
}

/////////////////////////////////////////////////////////////////////////////
//  This function is called in the mainloop when no temporary message is shown
//  on screen. Print the realtime messages here
/////////////////////////////////////////////////////////////////////////////
void DISPLAY_Tick(void) __wparam
{
}

/////////////////////////////////////////////////////////////////////////////
//  This function is called by MIOS when a complete MIDI event has been received
/////////////////////////////////////////////////////////////////////////////
void MPROC_NotifyReceivedEvnt(unsigned char evnt0, unsigned char evnt1, unsigned char evnt2) __wparam
{
}

/////////////////////////////////////////////////////////////////////////////
// This function is called by MIOS when a MIDI event has been received
// which has been specified in the MIOS_MPROC_EVENT_TABLE
/////////////////////////////////////////////////////////////////////////////
void MPROC_NotifyFoundEvent(unsigned entry, unsigned char evnt0, unsigned char evnt1, unsigned char evnt2) __wparam
{
}

/////////////////////////////////////////////////////////////////////////////
// This function is called by MIOS when a MIDI event has not been completly
// received within 2 seconds
/////////////////////////////////////////////////////////////////////////////
void MPROC_NotifyTimeout(void) __wparam
{
}

/////////////////////////////////////////////////////////////////////////////
// This function is called by MIOS when a MIDI byte has been received
/////////////////////////////////////////////////////////////////////////////
void MPROC_NotifyReceivedByte(unsigned char byte) __wparam
{
}

/////////////////////////////////////////////////////////////////////////////
// This function is called by MIOS before the shift register are loaded
/////////////////////////////////////////////////////////////////////////////
void SR_Service_Prepare(void) __wparam
{
}

/////////////////////////////////////////////////////////////////////////////
// This function is called by MIOS after the shift register have been loaded
/////////////////////////////////////////////////////////////////////////////
void SR_Service_Finish(void) __wparam
{
}

/////////////////////////////////////////////////////////////////////////////
// This function is called by MIOS when an button has been toggled
// pin_value is 1 when button released, and 0 when button pressed
/////////////////////////////////////////////////////////////////////////////
void DIN_NotifyToggle(unsigned char pin, unsigned char pin_value) __wparam
{
	// Midi Events senden
	MIOS_MIDI_TxBufferPut(0x90);		// Note Event at channel #1
	MIOS_MIDI_TxBufferPut(pin);			// just forward the pin number (0..127)
	MIOS_MIDI_TxBufferPut(0x7f); 		// Velocity = 0x7f when button pressed

	// verknüpfte Buttons 1-32 (von 0 ab gezählt)
	if(pin < 32)
	{
		MIOS_DOUT_SRSet(0, 0x00);		//löschen der ersten 32 LEDs (von 0 ab gezählt)
		MIOS_DOUT_SRSet(1, 0x00);
		MIOS_DOUT_SRSet(2, 0x00);
		MIOS_DOUT_SRSet(3, 0x00);
		MIOS_DOUT_PinSet1(pin);			//Setzen der zugehörigen LED
	}
	// die übrigen Buttons toggeln die LEDs
	else
	{
		if(MIOS_DOUT_PinGet(pin)==0)	// LED aus -> LED an
			MIOS_DOUT_PinSet1(pin);
		else							// LED an -> LED aus
			MIOS_DOUT_PinSet0(pin);
	}
}

/////////////////////////////////////////////////////////////////////////////
// This function is called by MIOS when an encoder has been moved
// incrementer is positive when encoder has been turned clockwise, else
// it is negative
/////////////////////////////////////////////////////////////////////////////
void ENC_NotifyChange(unsigned char encoder, char incrementer) __wparam
{
}

/////////////////////////////////////////////////////////////////////////////
// This function is called by MIOS when a pot has been moved
/////////////////////////////////////////////////////////////////////////////
void AIN_NotifyChange(unsigned char pin, unsigned int pin_value) __wparam
{
	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(MIOS_AIN_Pin7bitGet(pin));	// 7bit pot value
}

Grüße

Joscha

Link to comment
Share on other sites

Noch eine Frage: kann man die Weiterleitung eines Signalpegels an den Core mit Hilfe eines Multimeters messen? Falls ja an welchem PIN?

Dann könnte ich die Fehlerquelle weiter einschränken, da die DIN/DOUT Module zu funktionieren scheinen...

Link to comment
Share on other sites

Ich hab die Sache mit den massenhaften MIDI-Sends mal überprüft:

Nur bei Aktivierung von Button 7 werden für ALLE Buttons, welche getrennt sind (5 Volt am SR), die entsprechenden MIDI-Befehle auf einmal gesendet. Ich habe mal alle Buttons manuell getrennt und dann werden alle 64 Befehle gleichzeitig gesandt!

Was ist hier los  ???

Link to comment
Share on other sites

Hi!

Du könntest einmal die original midibox64 firmware reinladen um zu sehen ob wirklich alles korrekt angeschlossen ist.

Die Schalter dürfen kein Problem sein das ja das System jeden zustand weitersendet. D.h. zB Note on wenn taster offen; note off wenn taster(/schalter) zu.

Was du noch kannst (solltest du ein Display haben) ist ein MIOS_Print_xxx einzufügen das dir sagt welcher Taster gedrückt ist.

Grüße

Michael

Link to comment
Share on other sites

Wenn ein einzelner Button mehrere Events ausloest, dann liegt es meistens an einem Kurzschluss an oder zwischen der SCLK/RCLK Leitung. Mit dem srio_interconnection_test kann man das sehr einfach debuggen (die Anleitung steht in main.asm)

Gruss,

        Thorsten.

Link to comment
Share on other sites

Wenn ein einzelner Button mehrere Events ausloest, dann liegt es meistens an einem Kurzschluss an oder zwischen der SCLK/RCLK Leitung. Mit dem srio_interconnection_test kann man das sehr einfach debuggen (die Anleitung steht in main.asm)

Gruss,

        Thorsten.

Hi Thorsten

Ich hab die beiden Leitungen getestet, da ist kein Kurzschluss... Ich hab auch sonst verzweifelt nach Fehlern gesucht aber nichts gefunden.

Welche main.asm meinst du?

Mit dem MIOS Studio (Debug Interface) hab ich nochmal testweise versucht ein paar LEDs zu aktivieren, aber auch da tut sich gar nichts...

Was mir bei dem ominösen Button Nr. 7 aufgefallen ist: wenn ich in der main.c die Anzahl der Register z.b. von 8 auf 16 erhöhe, werden nicht nur 64 Befehle sondern 128 Befehle parallel gesendet, obwohl ja nur 8 Register angeschlossen sind.

Link to comment
Share on other sites

Mit main.asm meine ich das Source File vom srio_interconnection_test - hast Du ihn wirklich ausprobiert?

Was mir bei dem ominösen Button Nr. 7 aufgefallen ist: wenn ich in der main.c die Anzahl der Register z.b. von 8 auf 16 erhöhe, werden nicht nur 64 Befehle sondern 128 Befehle parallel gesendet, obwohl ja nur 8 Register angeschlossen sind.

Das ist absolut erklaerbar. Button 7 ist der erste Button in der Shiftregister-Kette. Wenn die Taktleitung nicht richtig angeschlossen ist, oder einen Kurzschluss hat, sieht das Core Modul nur diesen Button

Die LEDs sind an der gleichen Taktleitung angeschlossen...

Gruss,

        Thorsten.

Link to comment
Share on other sites

Hi nochmal

Danke erstmal für deine schnelle Antwort! Ich habe jetzt den interconnection test durchgeführt:

-> d0 funktioniert

bei rc und sc erhalte ich genau 0 volt. Da scheint also der Haken zu sein. Ich werde nochmals nach Kurzschlüssen Ausschau halten.

Grüße

Joscha

Link to comment
Share on other sites

Ich hab jetzt erst mal die Dout module komplett vom Core entfernt. Bei einer Durchgangsprüfung an SC und RC an den Din-Modulen habe ich Verbindung wie vermutet...

Allerdings funktionieren die Taster jetzt einwandfrei! Der Fehler muss also bei den Dout-Modulen zu finden sein... Aber da kann ich keine Kurzschlüsse entdecken.

Link to comment
Share on other sites

Verfolge mal die SCLK und RCLK Leiterbahnen auf der Platinenunterseite, vielleicht gibt es hier einen Kurzschluss?

Gruss,

        Thorsten.

So, ich habe die Dout Platinen nochmals überprüft, aber ich finde da keinen Kurzen:(

Link to comment
Share on other sites

Dann gehe mal schrittweise vor: schliesse ein DOUTX4 Modul nach dem anderen alleine an das Core Module an, und ueberpruefe, ob die Buttons noch funktionieren.

Beim fehlerhaften Modul dann die 74HC595 entfernen, und schauen, was passiert

Wenn die RCLK (oder SCLK) Leitung dann immer noch kurzschliest, mach doch mal ein Foto von den Platinen und poste sie hier (oder schicke sie mir zu, ich kann sie dann ins Netz stellen)

Gruss,

        Thorsten.

Link to comment
Share on other sites

Hi

Ich habe zuerst nur den ersten Dout angeschlossen und es lief alles einwandfrei. Die Buttons 1-64 funktionieren einwandfrei und auch die LEDs verhalten sich wie gewünscht.

Sobald ich den zweiten Dout anschliesse gehen weder die Buttons, noch die LEDs (bis auf button nr. 7, altes problem).

Ich habe nacheinander die vier 74HC595 entfernt und das Problem besteht weiterhin...

Hier ist ein Foto der Platine:

http://lowfrequ.lo.funpic.de/midi/dout1.jpg

An meinem Netzteil kann das nicht liegen, oder? Ich verwende eines mit 300mA... sollte doch eigentlich reichen

Grüße

Joscha

Link to comment
Share on other sites

Hallo Joscha,

auf Anhieb wuerde ich sagen, dass die beiden markierten Stellen etwas kritisch aussehen. Ich bin mir nicht sicher, ob es sich hierbei um Flussmittel, oder leitfaehiges Material handelt, doch Du koenntest es einfach mal mit einem Schraubenzieher wegkratzen.

dout1.jpg

Wenn das nicht weiterhilft, waere es interessant zu wissen, ob die Buttons funktionieren, wenn entweder die SCLK, oder die RCLK Leitung nicht am zweiten DOUTX4 Modul angeschlossen ist - so wuesstest Du, welche Leiterbahn nochmal genaustens untersucht werden muss. Manchmal kann selbst ein kaum erkennbarer Loetklumpen zwischen den Leiterbahnen zu einem Kurzschluss fuehren...

Die 300 mA sind ein bisserl wenig. Kurzes Rechenbeispiel: an den LEDs fallen ca. 1.8V ab, es werden 220 Ohm Widerstaende verwendet, macht ca. 15 mA pro LED. Bei 64 LEDs liegt der maximale Stromverbrauch bei 960 mA! Und falls ein LCD mit Backlight angeschlossen ist, kannst Du nochmal ca. 200-300 mA draufrechnen, und fuer die restliche Logik (dazu gehoert auch der PIC) nochmal 50 .. 100 mA

Ein zu schwaches Netzteil kann durchaus zu seltsamen Effekten fuehren, doch wenn die SRIO Kette bereits ausfaellt, wenn ein unbestuecktes DOUTX4 Modul angehaengt wird, dann vermute ich (nach wie vor) eher einen Kurzschluss.

Gruss,

        Thorsten.

Link to comment
Share on other sites

Hi Thorsten

Ich habe jetzt das zweite Dout Modul angeschlossen bis auf RCLK und es funktioniert! Daraufhin habe ich nochmal die Platine untersucht und alles, was irgendwie nach Kurzschluss aussah (das war aber alles nur Flußmittel, soweit ich das erkennen konnte) mit einer Pinzette vorsichtig weggekratzt, mit besonderem Augenmerk auf die RCLK Leitung. Ich hab auch mal ein stärkeres Netzteil angeschlossen, allerdings bleibt alles beim alten, sobald ich die RCLK Leitung wieder anlöte...

Link to comment
Share on other sites

So das Problem hat sich erledigt!

Ich hatte nochmal einen Durchgangstest gemacht und festgestellt, dass die RCLK und die Ground Leitung einen Kurzen hatten. Daraufhin bin ich mal mit einer Lupe über die Platine und da war eine Haarfeine Verbindung zwischen den Leitungen. Sah aus wie ein Fehler beim Ätzen der Platine, war auf jeden Fall kein Lötzinn!! Aber mit blosem Auge so gut wie gar nicht zu sehen.

Jetzt funktioniert alles einwandfrei, JUHUUU!

Vielen vielen Dank nochmals für deine geduldige Hilfe und dein tolles Projekt, das mir den Bau eines individuellen Midi-Controller ermöglicht hat  ;D ;D ;D ;D

Grüße

Joscha

PS: Ich werde den dokumentierten Bau meines Controllers demnächst unter http://lowfrequ.lo.funpic.de/wissen.php ins Netz stellen...

Link to comment
Share on other sites

Fein :)

Koenntest Du bitte Michael ueber dieses Problem informieren? Es besteht die Gefahr, dass noch mehr fehlerhafte Boards rausgehen (wenn es nicht bereits geschehen ist... :-/)

Gruss,

        Thorsten.

Link to comment
Share on other sites

Hi Thorsten

Sorry für die späte Antwort, ich war die ganze Zeit dabei, den Controller an meine Applikationen anzupassen;) Wenn du bei meinem Foto der Platine ganz unten links bei der RCLK-Leitung genau hinschaust, siehst du sogar die haarfeine Verbindung zwischen RCLK und Ground! Ziehe einfache vom Mittelpunkt des linken unteren Bohrloches eine 45° Gerade in Richtung RCLK und genau da ist der Ätzfehler.

Grüße

Joscha

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...