Go Down

Topic: problema con PORTD (Read 2634 times) previous topic - next topic

astrobeed


Esiste una guida dove mi posso documentare a riguardo?
Ho cercato riferimenti alla programmazione diretta in assembler della scheda, ma con scarsi risultati.


Specificatamente per Arduino non credo ci sia molto, anzi quasi nulla, però basta cercare programmazione C ANSI per AVR e si trova moltissimo materiale, in fin dei conti Arduino non è altro che una scheda con sopra un ATmega 328 :)
In pratica tocca "buttare via" l'IDE di Arduino e lavorare con AvrStudio e la sua toolchain programmando esclusivamente quello che serve, in questo caso è possibile ottenere prestazioni real time con generazione di segnali molto precisi e stabili.

dr.benway

#31
Nov 16, 2012, 11:23 pm Last Edit: Nov 16, 2012, 11:25 pm by dr.benway Reason: 1
peccato  :~
In realtà questo progetto andrebbe sviluppato in vhdl per ottenere un segnale preciso in uscita.
Però, dato che sono un accanito sostenitore del Progetto Arduino, volevo proporlo nella mia tesi, come un rapido sostituto per uno studio alle basse frequenze.


Quindi se io programmassi in ambiente AVR, andrei pero' ad intaccare il firmware IDE di Arduino, giusto?
Che peccato ...

Grazie.

leo72

Io farei una prova:
1) carichi i 32 byte in un array da cui lo leggi poi ad una velocità molto maggiore rispetto a fare continue letture dalla EEPROM;
2) disattivi il timer 0 così che la relativa ISR che gestisce millis venga disattivata;
3) togli il debug seriale (la seriale sull'IDE 1.0.x lavora su interrupt)

Il timer 0 lo disattivi con PRR &= ~(1<<PRTIM0);

erpomata


Il timer 0 lo disattivi con PRR &= ~(1<<PRTIM0);

Sarebbe la stessa cosa se importasse la libreria "#include <avr/power.h>" e includesse il codice:

Code: [Select]
power_timer0_disable();

?
http://www.paologiammarco.it
http://www.valentinamagni.it

leo72

Ma perché importare una libreria quando può con un semplice comando farlo?  ;)

gingardu



come se i numeri memorizzati che iniziano con lo zero vicino alla B   perdessero gli zero  


Non è possibile quello che dici, la EEPROM non può fornire dati errati o incompleti, c'è sicuramente un errore di metodo di misura nel tuo test.


mah..   qualcosa di "strano"  sembra che c'è,

ho masso il serial print   nel  codice postato   (ho messo anche int a k  se no non compilava)

mi pare che dopo la sedicesima lettura si mangia gli zeri  (spiega il motivo per curiosita)

anche se quel wile ne codice cosi com'è mi sembra strano forse voleva fare un for   ]:D

se leggo direttamente le memorie sballate da giusto risultato  se si legge una dopo l'altra printa come la foto :smiley-eek-blue:

qui c'è il codice
Code: [Select]
#include <EEPROM.h>
int addr = 0;
int k=0;


void setup()
{
   Serial.begin(9600);
  DDRD = B11111111; //tutti i pin sono uscite
  //PORTD = B00000000  ;
}

void loop()
{
  while (k<100)
{
  //delay (160);
PORTD = EEPROM.read(addr);
// PORTD = EEPROM.read(18);
//delay (160);
  Serial.println  (PORTD, BIN);
 
    ++ addr;
   
    if (addr > 31)
{addr = 0;}

}

  }



Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

astrobeed


mah..   qualcosa di "strano"  sembra che c'è,


Non c'è nulla di strano, semplicemente non vengono visualizzati gli zeri non significativi, p.e. 0b0001000 viene stampato come 1000.


erpomata


Ma perché importare una libreria quando può con un semplice comando farlo?  ;)


Per non dover ricordare un comando strano  :smiley-mr-green:

Ricevuto ;)
http://www.paologiammarco.it
http://www.valentinamagni.it

astrobeed


Per non dover ricordare un comando strano  :smiley-mr-green:


Sarà strano per te, per noi è la norma  :smiley-mr-green:

erpomata

Vabè stiamo andando un po OT però ho visto la libreria power.h e non mi sembra faccia molto di diverso da quello che ha suggerito leo.

E' come doversi ricordare un ip invece del nome del nome della macchina,

Forse dipende proprio dal fatto che non ho molta esperienza in merito, in effetti quando lavoro mi ricordo meglio gli ip che i nomi macchina  ;)
http://www.paologiammarco.it
http://www.valentinamagni.it

leo72



mah..   qualcosa di "strano"  sembra che c'è,


Non c'è nulla di strano, semplicemente non vengono visualizzati gli zeri non significativi, p.e. 0b0001000 viene stampato come 1000.



Quoto.



Per non dover ricordare un comando strano  :smiley-mr-green:


Sarà strano per te, per noi è la norma  :smiley-mr-green:

Quoto anche questo, e rispondo alla domanda di erpomata dicendo che il motivo è semplice: essendo ormai molti mesi che spippolo coi registri dei micro, mi viene più naturale scrivere quella riga che andare ad includere una libreria e poi usarne i metodi per fare ciò che mi serve.

erpomata


Forse dipende proprio dal fatto che non ho molta esperienza in merito, in effetti quando lavoro mi ricordo meglio gli ip che i nomi macchina  ;)


Quindi mi autoquoto.
Tutti chiaro fine OT
http://www.paologiammarco.it
http://www.valentinamagni.it

dr.benway

Quote
(ho messo anche int a k  se no non compilava)


Si mi scuso, avevo aggiornato "a mano" il codice che stavo studiando in università.

Quel ciclo while (k<100) mi serve per ottenere una migliore simmetria del segnale in uscita.
Se provi ad escluderlo, vedrai che la simmetria "sballa" di molto.

Io ho letto qualcosa sulla programmazione in c puro.
Forse a qualcuno potrebbe interessare, quindi posto questo link:

http://hekilledmywire.wordpress.com/2010/12/04/22/

La cosa pero' che non capisco è la seguente:

se io programmo usando avrstudio, vado in qualche modo a compromettere il funzionamento della scheda in ambiente IDE?

In altre parole, se decido di programmare con avr studio, poi in futuro l'ambiente IDE non riconoscerà più la mia schedina arduino?

Grazie.


dr.benway

Quote
1) carichi i 32 byte in un array da cui lo leggi poi ad una velocità molto maggiore rispetto a fare continue letture dalla EEPROM;


Io avevo letto che la SCRITTURA in EEPROM è lenta mentre l'accesso avviene in 4 cicli di clock.

The EEPROM read access takes one instruction, and the requested data is available immediately. When the EEPROM is read, the CPU is halted for four cycles before the next instruction is executed.


Io dovrei leggere 9 array simili a quelli presenti nel programma.
Dato che il tempo di accesso è sempre il medesimo, ottengo, in linea di principio una buona simmetria del segnale in uscita.



gingardu


Quote
(ho messo anche int a k  se no non compilava)


Si mi scuso, avevo aggiornato "a mano" il codice che stavo studiando in università.

Quel ciclo while (k<100) mi serve per ottenere una migliore simmetria del segnale in uscita.
Se provi ad escluderlo, vedrai che la simmetria "sballa" di molto.

Io ho letto qualcosa sulla programmazione in c puro.
Forse a qualcuno potrebbe interessare, quindi posto questo link:

http://hekilledmywire.wordpress.com/2010/12/04/22/

La cosa pero' che non capisco è la seguente:

se io programmo usando avrstudio, vado in qualche modo a compromettere il funzionamento della scheda in ambiente IDE?

In altre parole, se decido di programmare con avr studio, poi in futuro l'ambiente IDE non riconoscerà più la mia schedina arduino?

Grazie.




mi sa che l'unica cosa che si tocca è l'atmega,  al max  atmega con botloader fresco   e tutto ritorna come nuovo,

meglio avere un atmega con botloader ok  di scorta
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Go Up