Sostieni il forum con una donazione! Il tuo contributo ci aiuterà a rimanere online!
Immagine

Re:varie riguardo PIC

Tutto ciò che riguarda l'elettronica digitale, dalla porta not al protocollo midi... e oltre!
Avatar utente
davidefender
Garzone di Roger Mayer
Garzone di Roger Mayer
Messaggi: 1437
Iscritto il: 11/02/2008, 23:51
Località: Roma
Contatta:

Re:varie riguardo PIC

Messaggio da davidefender » 13/12/2009, 21:22

credo che se posti il codice sarebbe meglio, anche se non so di essere in grado a occhio di capire tutto perchè non ho mai programmato con i microcontrollori del tipo PIC, ma posso sempre provare!  :face_green:

cmq per il tipo più appropriato ti conviene usare uint8_t che significa unsigned int a 8 bit, la libreria è da includere è questa (http://en.wikipedia.org/wiki/Stdint.h)
La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché.
(Albert Einstein)

Avatar utente
Dimitree
Diyer Esperto
Diyer Esperto
Messaggi: 425
Iscritto il: 01/09/2006, 23:56

Re:varie riguardo PIC

Messaggio da Dimitree » 13/12/2009, 21:35

ecco qua:

Codice: Seleziona tutto

void midi()
{

	unsigned int	byte;
	unsigned int	pc = 0b11001111;
	unsigned int	cc = 0b10111111;
	unsigned int	db = 0b01111111;

loop:
		
	while (1)
	{
		if (RCIF == 1)
		{
			byte = RCREG;

			if (byte > db)
			{
					
				if (byte == pc)
				{
					// è un program change
				}
				
				if (byte == cc)
				{
					// è un control change
				}

				else
					goto loop;
			}
ora provo a sostutuire int con char..ma tanto l'avevo già fatto e niente..  :'(
il fatto è che leggendo datasheet dell'usart, datasheet del pic e appunti di utilzzo del compilatore non consiglia niente riguardo il byte che si prende dall'usart..

Avatar utente
davidefender
Garzone di Roger Mayer
Garzone di Roger Mayer
Messaggi: 1437
Iscritto il: 11/02/2008, 23:51
Località: Roma
Contatta:

Re:varie riguardo PIC

Messaggio da davidefender » 13/12/2009, 21:51

fa una prova al volo, inserisci l'istruzione

RCIF = 0;

prima di "byte = RCREG;", praticamente appena verifichi che sia arrivato il dato, cancelli il flag! (l'ho trovato googolando, questo pare avere il TUO identico problema: http://www.pctuner.net/forum/programmaz ... 585-3.html )
La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché.
(Albert Einstein)

Avatar utente
Dimitree
Diyer Esperto
Diyer Esperto
Messaggi: 425
Iscritto il: 01/09/2006, 23:56

Re:varie riguardo PIC

Messaggio da Dimitree » 13/12/2009, 22:30

provato ma niente..
ora ho messo un test subito dopo l'assegnamento
byte = RCREG;

ho fatto accendere il led se byte è diverso da 0, subito dopo quest'assegnamento..
e indovina..si accendo solo a qualche messaggio..non a tutti  :????:
per esempio..i program change da 110 a 127 ok..quelli prima no.., il program change 7 si.. questo sul canale 11..
sul canale 16 li accetta tutti..
sul canale 1 alcuni..
ecc ecc ecc  :trip:
a questo punto il problema mi sembra un altro..

Avatar utente
davidefender
Garzone di Roger Mayer
Garzone di Roger Mayer
Messaggi: 1437
Iscritto il: 11/02/2008, 23:51
Località: Roma
Contatta:

Re:varie riguardo PIC

Messaggio da davidefender » 14/12/2009, 0:43

credo che per migliorare un pò le cose dovresti implementarti una funzioncina con un interrupt... non vorrei che l'arrivo di messaggi mentre sta elaborando compromettano il funzionamento.. Hai presente?
Ti fai una routin di interrupt che si attiva all'arrivo di un messaggio USART, riempi un buffer gestito come CODA CIRCOLARE (si fa con un semplice array) che riempi con la routine e svuoti con il tuo programma, così sei assolutamente sicuro di non perdere nemmeno un messaggio!
La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché.
(Albert Einstein)

Avatar utente
Dimitree
Diyer Esperto
Diyer Esperto
Messaggi: 425
Iscritto il: 01/09/2006, 23:56

Re:varie riguardo PIC

Messaggio da Dimitree » 14/12/2009, 0:49

no ma a quanto pare non è quello il problema Davide..perchè comunque tra un byte e l'altro c'è tempo per eseguire un confronto..e poi sono sempre gli stessi byte che non reagiscono..alcuni si e altri no..non è che non reagisce solo quando ne mando tanti..
anzi, se gli mando tutti i program change e i control change possibili del canale 16 li prende tutti e accende il led a raffica..quindi direi che non è un problema di velocità-reazione

Avatar utente
davidefender
Garzone di Roger Mayer
Garzone di Roger Mayer
Messaggi: 1437
Iscritto il: 11/02/2008, 23:51
Località: Roma
Contatta:

Re:varie riguardo PIC

Messaggio da davidefender » 14/12/2009, 1:15

ah ok, perfetto! una gatta in meno da pelare... se poi mi dici che sono sempre gli stessi byte che lo fanno andare fuori allora meglio! vuol dire che il problema è più ristretto..
senti fai questa cosa, allegami tutto il codice del tuo progetto (magari eliminando, se ci sono, parti che proprio non hanno nulla a che fare col MIDI) e tutti i tentativi che hai fatto con i vari risultati.. Ti prometto che domani se ho un pò di tempo gli dò un'occhiata, va bene?

:ciao:
La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché.
(Albert Einstein)

Avatar utente
Dimitree
Diyer Esperto
Diyer Esperto
Messaggi: 425
Iscritto il: 01/09/2006, 23:56

Re:varie riguardo PIC

Messaggio da Dimitree » 14/12/2009, 1:19

grazie Davide, però non voglio farti perdere tempo..pensavo che la cosa fosse più semplice e scontata..invece ora mi sono reso conto che su alcuni canali non prende alcuni messaggi, su altri canali ne prende altri, ecc
il codice è proprio quello che ho scritto prima..cioè..la parte che riguarda il midi e la ricezione è quella..il resto è tutta roba che dipende da quel passaggio..quindi se non passa là non va oltre e quindi il resto è inutile..
ora ho scritto anche su quel forum dei PIC, magari è un problema già riscontrato..

Avatar utente
davidefender
Garzone di Roger Mayer
Garzone di Roger Mayer
Messaggi: 1437
Iscritto il: 11/02/2008, 23:51
Località: Roma
Contatta:

Re:varie riguardo PIC

Messaggio da davidefender » 14/12/2009, 8:55

allora ciò che ti consiglio di fare è questo: metti un attimo da parte questo programma, e comincia a sceriverne un altro (solo per non impastrocchiare il primo) per fare alcuni test e vedere se funziona bene l'USART. Il primo programma che ti consiglio di fare è il seguente: ricevi SOLO status byte (stai attento dunque che mandi solo quelli) e fai lampeggiare un led tante volte quanto è il canale su cui l'hai mandato:

byte = RCREG;
byte &= 0x0F;
for(int i = 0; i <= byte; i++) {
  lampeggio led;
}

e comincia a vedere se almeno qualcosa torna!  :ciao:
La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché.
(Albert Einstein)

Avatar utente
Dimitree
Diyer Esperto
Diyer Esperto
Messaggi: 425
Iscritto il: 01/09/2006, 23:56

Re:varie riguardo PIC

Messaggio da Dimitree » 14/12/2009, 13:48

grazie Davide, lo farò, prima però devo trovare un programma che mandi soltanto status byte..perchè quello che ho manda un messaggio intero alla volta
mi metto alla ricerca

Avatar utente
davidefender
Garzone di Roger Mayer
Garzone di Roger Mayer
Messaggi: 1437
Iscritto il: 11/02/2008, 23:51
Località: Roma
Contatta:

Re:varie riguardo PIC

Messaggio da davidefender » 14/12/2009, 13:50

non vorrei sbagliarmi, ma se usi linux dovresti poterlo fare addirittura da bash, vedi se trovi qualche dritta online!  :ciao:
La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché.
(Albert Einstein)

Avatar utente
Dimitree
Diyer Esperto
Diyer Esperto
Messaggi: 425
Iscritto il: 01/09/2006, 23:56

Re:varie riguardo PIC

Messaggio da Dimitree » 14/12/2009, 16:13

no purtroppo non posso usare linux ora..
adesso vediamo che trovo su internet
a presto per aggiornamenti  :yrock:

Avatar utente
Dimitree
Diyer Esperto
Diyer Esperto
Messaggi: 425
Iscritto il: 01/09/2006, 23:56

Re:varie riguardo PIC

Messaggio da Dimitree » 21/12/2009, 18:59

la cosa si fa strana  :'(

allora..con questo programma

Codice: Seleziona tutto

	while(1) 
	{
		if (RCIF) 
		{
			byte = RCREG;
    
			PORTA = 0b00001100;
			PORTA = 0b00000000;
		}
	}
i led si accendono qualsiasi messaggio/canale mando..
lo stesso programma, con questa modifica:

Codice: Seleziona tutto

	while(1)
	{
    		if (RCIF) 
		{
			byte = RCREG;
			RCIF = 0;

			if (byte) 
			{
				PORTA = 0b00001100;
				PORTA = 0b00000000;
			}
    		}
	}
si comporta come prima..ovvero solo su alcuni canali reagisce, e non su tutti i possibili messaggi midi..

quindi, con ogni messaggio mandato, qualcosa nel registro usart c'è, altrimenti non si alzerebbe il flag RCIF..
però il secondo programma mi dice che a volte "byte" è vuoto! ma secondo logica, chi è che svuota byte!? come fa a essere vuoto se magari con un messaggio precedente è stato "riempito" da un altro byte? vorrebbe dire che "byte" è stato riempito con un messaggio di zeri, assurdo! in questo caso non penso che RCIF si alzerebbe!
concordate?
Ultima modifica di Anonymous il 21/12/2009, 19:21, modificato 1 volta in totale.

Avatar utente
Dimitree
Diyer Esperto
Diyer Esperto
Messaggi: 425
Iscritto il: 01/09/2006, 23:56

Re:varie riguardo PIC

Messaggio da Dimitree » 21/12/2009, 19:46

ho provato anche questo:

Codice: Seleziona tutto

	while(1)
	{
    		if (RCIF) 
			{
				byte = RCREG;
				RCIF = 0;		//provare a metterlo prima

				if (byte) 
				{
					PORTA = 0b00000100; //led 1
					PORTA = 0b00000000;
				}	

				else
				{
					PORTA = 0b00001000; //led 2
					PORTA = 0b00000000;
				}

				byte = 0;
    		}
e come pensavo, il led2 si accende sempre, mentre il led1 si comporta come al solito..
non mi resta che provare ad aggiungere un midi out al mio pic, così rimando indietro quello che riceve e visualizzo sul pc se è un messaggio comprensibile o no..

Avatar utente
davidefender
Garzone di Roger Mayer
Garzone di Roger Mayer
Messaggi: 1437
Iscritto il: 11/02/2008, 23:51
Località: Roma
Contatta:

Re:varie riguardo PIC

Messaggio da davidefender » 22/12/2009, 15:41

Dimitree ha scritto: non mi resta che provare ad aggiungere un midi out al mio pic, così rimando indietro quello che riceve e visualizzo sul pc se è un messaggio comprensibile o no..
si comincio a credere che sia decisamente meglio... almeno capisci di chi è il problema, infondo si può far lampeggiare un led fino ad un certo punto!! ti serve qualcosa di più "espressivo" per fare debugging!  :numb1:
La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché.
(Albert Einstein)

Rispondi