Pages: 1 2 [3] 4   Go Down
Author Topic: problema con PORTD  (Read 1918 times)
0 Members and 1 Guest are viewing this topic.
Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9172
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
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.
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

peccato  smiley-confuse
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.
« Last Edit: November 16, 2012, 05:25:48 pm by dr.benway » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
Logged


Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
power_timer0_disable();

?
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma perché importare una libreria quando può con un semplice comando farlo?  smiley-wink
Logged


Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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   smiley-twist

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:
#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;}

}

  }




* Cattura.JPG (29.1 KB, 408x542 - viewed 11 times.)
Logged


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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9172
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma perché importare una libreria quando può con un semplice comando farlo?  smiley-wink

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

Ricevuto smiley-wink
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9172
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink

Quindi mi autoquoto.
Tutti chiaro fine OT
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.


Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


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

Pages: 1 2 [3] 4   Go Up
Jump to: