Re:varie riguardo PIC
- davidefender
- Garzone di Roger Mayer
- Messaggi: 1437
- Iscritto il: 11/02/2008, 23:51
- Località: Roma
- Contatta:
Re:varie riguardo PIC
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!
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)
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)
(Albert Einstein)
Re:varie riguardo PIC
ecco qua:
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..
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;
}
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..
- davidefender
- Garzone di Roger Mayer
- Messaggi: 1437
- Iscritto il: 11/02/2008, 23:51
- Località: Roma
- Contatta:
Re:varie riguardo PIC
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 )
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)
(Albert Einstein)
Re:varie riguardo PIC
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
a questo punto il problema mi sembra un altro..
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
a questo punto il problema mi sembra un altro..
- davidefender
- Garzone di Roger Mayer
- Messaggi: 1437
- Iscritto il: 11/02/2008, 23:51
- Località: Roma
- Contatta:
Re:varie riguardo PIC
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!
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)
(Albert Einstein)
Re:varie riguardo PIC
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
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
- davidefender
- Garzone di Roger Mayer
- Messaggi: 1437
- Iscritto il: 11/02/2008, 23:51
- Località: Roma
- Contatta:
Re:varie riguardo PIC
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?
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?
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)
(Albert Einstein)
Re:varie riguardo PIC
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..
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..
- davidefender
- Garzone di Roger Mayer
- Messaggi: 1437
- Iscritto il: 11/02/2008, 23:51
- Località: Roma
- Contatta:
Re:varie riguardo PIC
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!
byte = RCREG;
byte &= 0x0F;
for(int i = 0; i <= byte; i++) {
lampeggio led;
}
e comincia a vedere se almeno qualcosa torna!
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)
(Albert Einstein)
Re:varie riguardo PIC
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
mi metto alla ricerca
- davidefender
- Garzone di Roger Mayer
- Messaggi: 1437
- Iscritto il: 11/02/2008, 23:51
- Località: Roma
- Contatta:
Re:varie riguardo PIC
non vorrei sbagliarmi, ma se usi linux dovresti poterlo fare addirittura da bash, vedi se trovi qualche dritta online!
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)
(Albert Einstein)
Re:varie riguardo PIC
no purtroppo non posso usare linux ora..
adesso vediamo che trovo su internet
a presto per aggiornamenti
adesso vediamo che trovo su internet
a presto per aggiornamenti
Re:varie riguardo PIC
la cosa si fa strana :'(
allora..con questo programma
i led si accendono qualsiasi messaggio/canale mando..
lo stesso programma, con questa modifica:
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?
allora..con questo programma
Codice: Seleziona tutto
while(1)
{
if (RCIF)
{
byte = RCREG;
PORTA = 0b00001100;
PORTA = 0b00000000;
}
}
lo stesso programma, con questa modifica:
Codice: Seleziona tutto
while(1)
{
if (RCIF)
{
byte = RCREG;
RCIF = 0;
if (byte)
{
PORTA = 0b00001100;
PORTA = 0b00000000;
}
}
}
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.
Re:varie riguardo PIC
ho provato anche questo:
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..
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;
}
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..
- davidefender
- Garzone di Roger Mayer
- Messaggi: 1437
- Iscritto il: 11/02/2008, 23:51
- Località: Roma
- Contatta:
Re:varie riguardo PIC
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!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..
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)
(Albert Einstein)