Show Posts
Pages: 1 ... 17 18 [19] 20
271  International / Software / Re: Piccolo ma fastidioso problema con encoder! on: November 22, 2012, 03:29:49 pm
OK Grazie mille, grazie a te, modificando un po il mio listato, ho finito, ora funziona bene tutta la lettura.
vi chiedo una cosa:
perchè se muovo l'encoder e mentre lo muovo premo il touchscreen, l'arduino si blocca?


così su due piedi non ho la più pallida idea di perchè si pianti ma ho notato che hai messo un serial.print nella procedura di interrupt: non è una buona prassi... l'interrupt è per sua natura una procedura delicata da fare nella massima velocità... talvolta si mettono anche le istruzioni cli/sei proprio per evitare che gli interrupt si annidino uno dentro l'altro cambiandosi i valori delle variabili in corsa... quando il processore sente un interrupt lui va a eseguire la procedura di interrupt cascasse il mondo... ed un'operazione lenta come il serial print che potenzialmente potrebbe perdersi dietro ai protocolli ed hai tempi rs232... insomma non lo vedo molto bene...
io ho usato delle librerie già fatte... ce ne sono addirittura mezze fatte in assembler...
ho usato questa e legge perfettamente un encoder industriale da 4000 pulsazioni in quadratura al giro... veloce veloce...
http://www.pjrc.com/teensy/td_libs_Encoder.html

poi se ti interessa fare il giro a 99 ci sono metodi svariati: lo fai sul loop oppure appena prima di leggere potresti fare un modulo.... una cosa tipo
a = enco.read();
a = a % 99;
enco.write(a)

o anche proprio senza azzeramento del write tanto scrive su DW molto grandi... dubito che con una manopola potrai mai raggiungere valori di 2milioni di impulsi...
272  International / Software / Re: azzerare una variabile on: November 22, 2012, 03:15:36 pm
perchè scrivi in giro var=var? ...toglierei proprio l'else...
comunque la funzione che fa per te è il millis... ritorna i millisecondi trascorsi da quando hai acceso il coso...

dovresti scrivere cosette di questo tipo... te le butto giù di istinto poi tu correggile e metti maiuscole e punti e virgola a profusione dove vanno messi  smiley

quando dichiari le variabili globali tienti due var così:

long oldMillis;
long newMillis;

poi in setup() vai a scrivere un bel
oldMillis = millis();

poi nel loop() vai a fare
Code:
newMillis = millis()
if (newMillis - oldMillis > 10000) //10 secondi di timeout... casomai cala o cresci
{
 var =0; // cancello la variabile
 oldMillis = millis() //ricomincio con il conto...


};


   


magari all'interno dell'if potresti fare anche una cosa del genere per generare qualche lampeggio veloce
int i;
for (i= 0; i <4; i++)
{ digitalWrite(led,HIGH);
  delay(300);
 digitalWrite(led,LOW);
 delay(200);


};
273  International / Software / Re: Verificare SRAM utilizzata on: November 22, 2012, 02:16:39 pm
qua non abbiamo 2k ma 8... in pratica anneghiamo in un mare  smiley-roll di ram che non usiamo
Guarda che gli Atmega328 hanno solo 2 kB di RAM, l'ho scritto diverse volte.


 pensavo che si parlasse del  Atmega2560 con 8k. comunque mi permane il dubbio di come faccia a farsi 'ste funzioni ricorsive senza toccare lo stack... deve essere un barbatrucco non da poco.
274  International / Software / Re: Verificare SRAM utilizzata on: November 22, 2012, 07:35:24 am

Dipende da come usi la memoria, se ad ogni iterazione vengono aggiunti dati alla fine l'heap si riempie e va in overflow, se viene solo modificato il contenuto di una, o più, variabile/i non c'è problema, da notare che lo stack non viene incrementato ad ogni iterazione pertanto non va in overflow.


ma questo come avviente? ogni volta che una funzione richiama se stessa deve fare una call mettendo nello stack quantomeno il punto di ritorno della procedura...mi sbaglio?
Boo non mi capisco... comunque penso che per provare a risolvere il problema si possa provare a dichiarare globale un puntatore ad uno o due array e in setup() procedere con il malloc... qualcosa dovrebbe andare meglio anche perchè qua non abbiamo 2k ma 8... in pratica anneghiamo in un mare  smiley-roll di ram che non usiamo
... poi domanda... perchè questo non mi crasha il leonardo che ha solo 2,5k di ram e i led continuano a lampeggiare? ...dove sto scrivendo?
Code:
/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
char prova1[1000];

char *prova2;
int led = 13;

// the setup routine runs once when you press reset:
void setup() {               
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
 
  prova2 = (char *) malloc(1000 * sizeof(char));

 
}

// the loop routine runs over and over again forever:
void loop() {
  int i;
  for (i = 0; i <1000; i++)
  {  prova1[i]=0;
   
    }
 for (i = 0; i <1000; i++)
  {  prova2[i]=0;
   
    }
   
   
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}
275  International / Software / Re: Verificare SRAM utilizzata on: November 22, 2012, 02:05:05 am
Nel caso in oggetto, l'Atmeg16 ha 1024 byte per cui l'occupazione di .data (le variabili dichiarate), .bss e .noinit (le variabili non inizializzate) occupano 635 byte di SRAM. Il resto è a disposizione dello stack, dell'heap e degli eventuali dati creati dinamicamente.
(ho capito la tua domanda?)

perfettamente... allora se è così io metterei come possibilità di vedere se comandando il compilatore si può aumentare di qualche k lo spazio .data oppure procederei ad allocare 'ste tabelle grossine in heap... la funzione malloc c'è e funziona vero? ... dopo mi attacco la scheda e provo.
o se no vedere di dichiarare localmente il più possibile.... le variabili locali dove le butta? heap o stack?
276  International / Software / Re: Verificare SRAM utilizzata on: November 21, 2012, 04:42:05 pm

Visto però che l'allocazione dinamica è usata raramente, nella maggior parte delle volte la memoria SRAM è occupata da .data, .bss e stack.

un'ultima cosa poi posso dormire più tranquillo: il tipo in avrfreaks scriveva che il compilatore gli dava fuori questa cosa...
Code:
AVR Memory Usage
----------------
Device: atmega16

Program:   14362 bytes (87.7% Full)
(.text + .data + .bootloader)

Data:        635 bytes (62.0% Full)
(.data + .bss + .noinit)

leggevi qua no?
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=818461

be comunque quello che ho notato è che il compilatore dava 62% full nel data segment...con 635 byte... significa che in pratica c'è un segmento dati che viene allocato con al massimo 1k di ram?
Adesso mi pare che quando trafficavo con i 2/386 c'era un segmento dati ed un segmento codice e c'erano delle limitazioni sulla lunghezza dei segmenti...anche qua?
277  International / Software / Re: Verificare SRAM utilizzata on: November 21, 2012, 04:16:29 pm
Grazie per l'interessamento smiley
Quote
quando fai un "int cicillo =0;" all'interno delle procedure o del main ma non nella dichiarazione globale lui intrinsecamente usa l'heap... alloca e poi a fine procedura disalloca  con notevole perdita di tempo...
che ci mettesse "molto tempo" non ci avevo mai pensato, in effetti sembra logico che creare una cosa che non c'è e poi smontarla implica un certo tempo rispetto a qualcosa che già esiste, ma non mi risolve il problema dell'insufficienza.


ti sei scordato ci citare la mia incertezza su quello che dico... inoltre prendi sempre quello che dico con mooolta calma: sono un newbi e le sQuole le ho finite una decina di anni fa...anche qualcuno di più adesso che ci penso...
tornando a noi il tempo di montare e smontare era più che altro riferito ad un pc normale che alloca e disalloca la memoria perchè ha un sistema operativo e n processi sottostanti che devono convivere: in questi arduino la cosa sicuramente è un po' diversa perchè non cè un sistema operativo eccetera... intendevo comunque più che altro che non metterei volentieri una dichiarazione di una variabile in una procedura che magari deve gestire interrupt veloci con timer e cose del genere...
In ogni caso non ho per il momento una soluzione: dovrei provare a capire come il compilatore riserva queste due aree di memoria: sicuro qualosa deve dargli specie allo stack se no non chiami manco una funzione... dovrebbe esserci anche una funzione di malloc che si può vedere di usare però... spetta un attimo vedo se googolando mi esce qualcosa da provare.
278  International / Software / Re: Verificare SRAM utilizzata on: November 21, 2012, 02:50:28 pm
nelle mie reminescenze di C scolastico mi ricordo che i compilatori di norma allocano uno spazio per lo stack ed uno spazio per l'heap oltre allo spazio necessario per il codice e le variabili globali: lo stack in effetti è una "pila", una zona di memoria riservata dove quando chiami una funzione con dei parametri il processore si annota l'indirizzo di ritorno ed i parametri... cioè ad esempio se fai un digitalwrite(10,HIGH) il processore fa un push in memoria dell'indirizzo attuale, del 10 e dell High e poi la funzione fa il pull del high, poi del 10 e poi quando ha finito facendo un "ret" si recupera l'indirizzo del ciclo che l'ha chiamato... invece l'heap serviva quando facevi i "malloc"... e forse... ma non mi ricordo bene... quando fai un "int cicillo =0;" all'interno delle procedure o del main ma non nella dichiarazione globale lui intrinsecamente usa l'heap... alloca e poi a fine procedura disalloca  con notevole perdita di tempo...in ogni caso 'sto allocare di disallocare non mi pare che fosse esattamente dinamico... forse c erano delle funzioni che usavano l'heap e delle funzioni che allocavano roba nuova non mi ricordo proprio... è brutto diventare vecchi...
Comunque a parte la pappardella teorica c'era 'sta cosa di qualche kb allocati a prescindere e nascosti alla vista del programmatore che era possibile modificare con delle direttive al compilatore.... questo sui computer normali ma non vedo perchè arduino debba fare differenza...  prova a leggere qua:
http://arduino.cc/forum/index.php/topic,41871.0.html
279  International / Software / Re: Raccolta e Visualizzazione dei dati attraverso un software on: November 21, 2012, 02:18:08 pm
che poi mi è ventuo in mente che se compri un arduino ethernet potresti addirittura fare un piccolo webserver pertanto scrivendo http://arduinoaddress da qualsiasi pc della rete potresti avere un'interfaccia web che con un piccolo javascript o simili ti propone i dati in grafico... la stessa board ha su anche una schedina sd dove potresti memorizzare una storicizzazione... cè da lavorare ma sarebbe carino.
280  International / Software / Re: Raccolta e Visualizzazione dei dati attraverso un software on: November 21, 2012, 01:27:10 pm
ma a me pare che si siano tirati dentro i dati spediti dall'arduino sulla porta seriale e poi con un normale foglio excel o giu di li abbiano fatto tutte le medie mobili grafichetti e quant'altro.
... mi sembra di capire che tu aversti bisogno non tanto di tirarti dentro con un copia incolla i dati in excel ma di un software che interrogasse la seriale del pc , leggesse i valori per diciamo un tempo x e ti generasse un grafico... be in generale non è un software molto difficile da scrivere ma già scritto onestamente non ne conosco.
A livello di funzionamento invece sono molto incuriosito dalla materia: ma veramente si possono vedere i livelli di glucosio con un sensore di luce in modo accurato???
e dove lo si mette per non farlo infruenzare dalla luce esterna? ... o no... non dirmelo... speriamo che non sia dove penso io... smiley-red ... bisogna prima stimolare la pelle con qualcosa?


281  International / Generale / Re: Stranezza lettura analogica Arduino DUE on: November 21, 2012, 01:03:37 pm
scusate la domanda mona:  ipotizzare che il sensore sia scassato e per qualche motivo dopo breve si saturi in qualche modo o che si riscaldi in qualche suo componente interno inficiando i risultati è un'ipotesi da scartarsi a priori?
imho sarebbe bello capire appunto quali sono le tempistiche con il quale si verifica il problema: non so accedo l'arduino e dopo 3 o 30 secondi da i numeri, tolgo tensione per 10 e poi riparte giusto... o capire cosa succede facendo 1000 misurazioni tutte consecutive con un bel ciclo for e poi un bel delay di qualche secondo eccetera eccetera...
282  International / Generale / Re: Installare iniezione elettronica indiretta con l'aiuto di Arduino on: November 20, 2012, 03:07:13 pm
mi sono appena letto su wikipedia smiley-red come funziona sta sonda lambda... sembra facile da controllare... o esce con i sui circa 1volt o lavora in variazione di resistenza: in entrambi i casi la lettura con arduino dovrebbe essere una banalità usando un input analogico.
Presumo sia il resto più incasinato... comunque effettivamente l'argomento esula da arduino in se.
283  International / Generale / Re: Installare iniezione elettronica indiretta con l'aiuto di Arduino on: November 20, 2012, 02:39:22 pm
secondo me si dovrebbe fare una specie di inventario di cosa e come si comandano le cose...perchè non è detto che gli esperti di elettronica/arduino siano altrettanto bravi con la benzina... cioè per esempio questa sonda lamba che roba è? da fuori una tensione, una resistenza, si alimenta a 12volt o cosa... cosa fa?
e la pompa va con un motore che ha quanti Ampere e dobbiamo comandare in che modo (velocità?)... e le valvole a farfalla normalmente come si comandano? hanno una cordicella? si può mettere un motore?
...insomma servirebbe che si descrivessero meglio le cose da controllare ed i sensori in gioco con che segnali si muovono.... dopo per la programmazione (... avviene in un linguaggio del tutto paragonabile al C) e per la circuiteria di controllo ed amplificazione si può discutere passo passo un problema alla volta.
Diremo che la strada è lunga ma se mai si comincia mai si arriva...per la sonda lamba non so proprio come funzioni ma qualche mese fa ho usato le sonde figaro per rilevare i VOC: è stato semplice e di buon risultato: prova a dare un occhio qui se hanno qualche sensore servibile  o no
http://www.figarosensor.com/whatsnew.html
284  International / Hardware / Re: Differenza tra cavi Seriali on: November 20, 2012, 12:44:14 pm
...è sicuro che servisse un nullmodem e non un cavo dritto normale?
Io metterei uno spillo sul piedino 2 del cavo nero funzionante e vedrei con un tester se è in corto con il 3 dall'altra parte (--> nullmodem) oppure con il 2(cavo normale).
se i piedini 2-3 sono ok allora potrebbe esserci una differenza sui fili di handshake.

285  Using Arduino / Programming Questions / Leonardo problem: DigitalWrite on pin A1 turn off PWM on pin 10 on: November 20, 2012, 11:49:37 am
Hi, i'm writing this because i've found a little bug-problem using "leonardo" board with
ide 1.0.2 (win... linux isn't tested).

this is the code that does "fireworks" :
Code:
void setup() {
  // put your setup code here, to run once:
pinMode(A1,OUTPUT);
pinMode(10,OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
analogWrite(10,128);
//*************digitalWrite(10,HIGH);
delay(2000);
digitalWrite(A1,0);

delay(1000);

 
}


In 2 words i write an analog pwm value on pin 10 that, as normal, go up to 2,5Volts (255/2=128=2,5Volt) but when i write with digitalWrite on pin A1 (...on leonardo is 19D) pin 10 go down to 0Volt without explanations.... it will return up with the next loop.

If i use digitalWrite on pin 10 instead of analogWrite pin 10 stay normally up at 5Volt.
It seems that digitalWrite on pin A1 deactive pwm generation on pin 10.
Also i tested this phenomena setting pwm on pin 10 by manipulations of registries (timer1) but IMHO the problem is on digitalWrite instruction.

This problem is resolved (another thanks to guys of Italian section) by installing the last version of toolchain from Atmel over 1.0.2 standard IDE.... so it is a combination of 3 factor:
-Leonardo board
-analogWrite on 10 and digitalWrite on 19/A1
-original IDE 1.0.2.

Hoping that this info can be helpfull for something other,
Roberto.
Pages: 1 ... 17 18 [19] 20