Newsgroup: it.hobby.elettronica.digitale
Titolo: Periferiche timer e ARM

Per un'applicazione che sto sviluppando ho bisogno di almeno 10 timer 
con uscite indipendenti (devo pilotare 6 stepper + 4 motori DC in PWM 
tutti in contemporanea).
Io di solito uso gli ARM7 AT91 di Atmel perché hanno flash e RAM in 
abbondanza, ma da una ricerca fatta sul loro sito non esistono 
versioni dei loro micro con abbastanza timer.
Per risolvere il problema ho pensato alle seguenti soluzioni:
- Scelgo un altro microcontrollore con abbastanza timer :-). Il 
problema è che non ne trovo di "giusti". Volevo rimanere con gli 
ARM7TDMI perché i 9 sono un po' sprecati e di solito necessitano di 
RAM/ROM esterna. Gli unici quasi adatti mi sembrano gli STR7 di ST e i 
TMS470 di Texas. Entrambi però hanno poca memoria: mi servirebbe 
qualcosa con almeno 256K di flash e 32-64K di RAM (oltre ai 10 timer).
- Rimango con gli AT91 di Atmel, che hanno tutta la memoria che mi 
serve, ma collego eventuali periferiche timer esternamente. Non sono 
però riuscito a trovare periferiche timer oltre ai vecchi 8254. Avete 
consigli?
- Rimango con gli AT91 di Atmel, che hanno tutta la memoria che mi 
serve, ma implemento i timer che mi servono su una logica 
programmabile esterna. Questa soluzione è molto flessibile ma ho paura 
che sia un po' più costosa delle altre, senza considerare il fatto che 
ho esperienza praticamente zero in vhdl.
Consigli, suggerimenti?
Ciao

 Consigli, suggerimenti?
Hai pensato alla possibile soluzione di aggiungere un mini microcontrollore 
(anche un PIC molto economico come un 16F873) con un firmware dedicato solo 
a fare timer?
Ti scrivi un firmware per configurare la periferica tramite SPI o I2C o un 
protocollo parallelo dedicato (oppure cabli già le temporizzazioni che 
necessiti) e lo ottimizzi in modo che i timer siano molto accurati. Con le 
porte libere controlli degli interrupt esterni sul micro principale Credo 
che sia la soluzione più economica e semplice, per non parlare della 
flessibilità
Brutta idea?
Ciao
CG

 a fare timer?
Sì ci ho pensato, però il progetto attuale è un rifacimento di una 
scheda che attualmente contiene un processore solo un po' vecchiotto 
(DSP56K) che però ha qualcosa come 16 timer.
Andare dal cliente e dirgli che per il nuovo processore ha invece 
bisogno di una miriade di PIC intorno non è bello.
Senza considerare i costi di produzione, collaudo, manutenzione, etc...
Al limite potrei mettere 2 processori medio/grossi, ma è proprio 
l'ultima delle soluzioni che vorrei percorrere.
Ciao

l'ultima delle soluzioni che vorrei percorrere.
Valuta se un AtMega1280 con i suoi 6 timers con comparatori, generatori PWM
ecc., ti basta per risolvere il problema.
--
ciao
  Stefano

 ecc., ti basta per risolvere il problema.
Sě, andrebbe bene come processore aggiuntivo, ma non come unico 
processore di tutta la scheda.
Ciao

processore di tutta la scheda.
Cosa ci devi fare di cosě grosso?
Guarda che il Mega1280 č potente, anche se il C++ non ce lo fai girare   ;-))
--
ciao
  Stefano


Ciao, per implementare i timer non c'è bisogno di conoscere vhdl: io
l'ho fatto con il graphic editor del pacchetto Baseline su Altera
grosso modo scopiazzando i diagrammi a blocchi descritti sui manuali
dei microcontrollori.
Eventualmente come micro puoi valutare l'H83052 che dovrebbe essere
simile al "vecchio" 3048 (dunque timer a iosa) con più flash e ram

Francesco,
perdona la domanda ma, per quale motivo ti servono proprio 6 timer per
gli stepper? non puoi implementare il controllo di tutti e 6 usando un
solo timer? inoltre supponendo che i motori siano troppo diversi l'uno
dall'altro dovresti riuscire abbastanza facilmente a scrivere una
routine che ti permetta di gestirne anche la velocità, o sbaglio?
Se come immagino non puoi fare come ti ho scritto, nella famiglia lpc
della philips qualcosa con 6 timer generici e  altrettanti pwm
dovresti trovarlo, prova a darci un'occhiata
Enrico

 6 stepper + 4 motori DC in PWM tutti in contemporanea).
Potresti cavartela implementando in software alcuni timer
e perfino i PWM... Non so di che frequenze stai parlando,
ma a occhio direi che si possa fare tranquillamente con
un ARM7...
A.D.

A.D. ha scritto:

Purtroppo no, devo pilotare con rampe di accelerazione/decelerazione 
costante tutti i motori indipendentemente (che fra l'altro sono di 
tipo diverso), ho anche il kernel e altri diversi processi I/O bound.
Nella migliore delle ipotesi otterrei dei segnali con del jitter, 
specialmente nei passo-passo questo non è tollerabile.
Se non trovo un processore adatto mi sa che dovrò ripiegare sulla 
soluzione a logica programmabile. Tutto sommato non mi dispiace, ho 
sempre voluto impararle :-)
Ciao

 Guarda che il Mega1280 č potente, anche se il C++ non ce lo fai girare   ;-))
Il Mega1280 ha solo 8k di RAM, purtroppo non bastano :-(
Ciao

 dovresti trovarlo, prova a darci un'occhiata
Già guardati, sono troppo piccoli come risorse di memoria (in 
particolare, troppa poca RAM).
Ciao

 simile al "vecchio" 3048 (dunque timer a iosa) con più flash e ram
Possibilmente cercavo qualcosa con core ARM che è preferito dal 
cliente, però ci darò lo stesso un'occhiata.
Ciao e grazie

 ho anche il kernel e altri diversi processi I/O bound.
Questo invece si che è un problema!!! :-)
Come non detto... Non si può fare...
A.D.
P.S. I sistemi operativi sono come le medicine: ti risolvono
alcuni problemi, ma te ne creano altri... :-)

 Come non detto... Non si può fare...
Il problema non è il kernel.
I processi I/O bound che dicevo sono altri driver che girano sotto 
interrupt. Inoltre quest'ultimi possono essere disabitati per brevi 
periodi per seguire atomicamente alcune operazioni altrimenti soggette 
a concorrenza.
Questo fa sì che le ISR vengano eseguite con un po' di ritardo, molto 
spesso casuale. E se implemento il timer software, muovendo i pin su e 
giù a mano, il segnale generato sarà affetto dallo stesso jitter 
casuale. Normalmente questo non è un problema, per esempio posso 
benissimo generare segnali e pwm con periodi dell'ordine dei 
millisecondi.
Però gli impulsi del clock degli stepper devono essere precisi quasi 
al microsecondo se non li vuoi sentire "gracchiare" quando sono alla 
massima velocità. E chiaramente non posso permettermi di perdere 
neache un passo.
Ciao

Il Mega1280 ha solo 8k di RAM, purtroppo non bastano :-(
Se è solo per quello, le soluzioni ci sono.
Il Mega1280 ha la possibilità di usare il bus esteso e ci puoi attaccare
facilmente una ram da 64K in indirizzamento diretto o una da 128K in paginato, e
magari sul bus ci puoi attaccare qualche altro dispositivo o porta I/O.
In una app. dove causa LCD grafico 8K erano pochini ho fatto proprio quella
scelta.
In alternativa, se non sono tutti dati che ti servono immediatamente per le
elaborazioni ma solo all' evento, una FRAM in SPI e risolvi solo sacrificando 2
pins.
Secondo me l' elettronica è bella proprio perchè si può risolvere un problema in
molti modi, e ci sarà sicuramente un altro modo migliore di quello che ho appena
pensato.
--
ciao
  Stefano

 magari sul bus ci puoi attaccare qualche altro dispositivo o porta I/O.
Questa è una soluzione interessante. In realtà gli AVR sono anche a 8 
bit e vanno un po' piano come frequenza di clock, però posso cercare un 
ARM con tanti timer e poca RAM, purchè abbia il bus per colllegarla 
esternamente.
Indago in questo senso, vediamo se viene fuori qualcosa...
Ciao e grazie


E' una tipologia di macchina che si può gestire anche distribuendo
l'elettronica in tanti piccoli azionamenti intelligenti + una cpu un
pò più "rilassata"; hai tanti software (però più semplici), l'aggiunta
del protocollo e il vantaggio della modularità...