programmare il 644 ... ma come????

Do per scontato che quando scrivo che può lavorare a 1,8V lo intendo non certamente a 20 MHz. Sono da rispettare le tabelle nel datasheet.
Poi, come detto, il "644" è una cosa, questo chip effettivamente esiste. Ma è a 2,7V e 20 MHz. Poi c'è il 644V, a 1,8V di tensione minima ma solo 10 MHz di tensione massima (ovviamente innalzando la tensione).
In questa pagina:
http://atmel.com/devices/ATMEGA644.aspx
ci sono tensione minima e clock massimo per i 644 e 644V. Il 644 è dato per 2,7V/20 MHz mentre il 644V per 1,8V/10 MHz.

Qui il 644A:
http://atmel.com/devices/ATMEGA644A.aspx
come vedi, 20 MHz e 1,8V

Qui invece il 644P/V
http://atmel.com/devices/ATMEGA644P.aspx
Il 644P va a 2,7V/20 MHz mentre il 644PV va a 1,8V/10 MHz. Entrambi con core PicoPower

E qui il 644PA:
http://atmel.com/devices/ATMEGA644PA.aspx
1,8V/20 MHz con core PicoPower

cari leo e menniti...

ok... credo di avere capito come procedere con la programmazione ISP...

... in effetti ieri ci sono risucito a riprogrammare il 644 usando questa configurazione

che dovrebbe essere questa tecnica ISP. Ok.. funziona e sto gia "migrando" il codice dal 328 al 644 ....

Ho provato anche la programmazione seriale (sui primi tx e rx), presa dal manuale Menniti .... ma non sono riuscito.... puo darsi che magari non fosse andata a buon fine la scrittura del bootloader e quindi non abbia funzionato per questo.... stasera riproverò....

Per quanto riguarda la programmazine seriale non posso (e non voglio) usare un altro arduino ma preferisco lasciare sulla board i pin su cui inserire il convertitore USB - seriale che ho comprato.

... quindi se la programmazione seriale non ha funzionato i motivi potrebbere due:

  • o il bootloader non è stato caricato bene .. (anche se il messaggio di fine trasferimento confermava il buon esito!!!)
  • non ho usato la giusta copia di rx - tx sul 644

quindi la domande sono:

  • è giusto quanto sopra, sulle possibili cause del malfunzionamento?
  • esiste un metodo certo per verificare la presenza del bootloader nel micro?

ed ancora

  • i pin utilizzati per l'ISP (MISO, MOSI, SCK) .. opsso comunque utilizzarli, durante il normale funzionamento , come pin di OUT/IN ???

... comunque confermo che il 644 sta funzionando regolarmente programmato con l'ISP, con il 30 % di script già "tradotto" per il 644 .. e sono già soddisfatto ....
saluti

Bene, bene, partiamo dalla programmazione seriale, i collegamenti da fare sono: (premesso che il 644 deve essere configurato con quarzo e condensatori e R da 10K tra reset [pin 9] e 5V, per la frequenza a cui l'hai programmato)
TX convertitore al pin 14 del 644
RX convertitore al pin 15 del 644
5V covertitore ai pin 10 e 30 del 644
GND del convertitore ai pin 11 e 31 del 644
RESET/DTR/RST/RTS del convertitore (è sempre lo stesso pin, non so come si chiama sul tuo) ad un C da 100nF, l'altro capo del C da 100nF al pin 9 del 644
In caso di insuccesso puoi bypassare il C da 100nF, ma in genere serve

  • è giusto quanto sopra, sulle possibili cause del malfunzionamento?
  • esiste un metodo certo per verificare la presenza del bootloader nel micro?

sì alla prima domanda, segui le mie istruzioni per la prova; no alla seconda domanda, o meglio temo che la cosa sia abbastanza complessa, però se la procedura di caricamento è andata a buon fine stai tranquillo che il bl c'è :wink:

  • i pin utilizzati per l'ISP (MISO, MOSI, SCK) .. opsso comunque utilizzarli, durante il normale funzionamento , come pin di OUT/IN ???

sì, senza alcuna limitazione, invece devi stare attento a che siano completamente liberi quando decidi di riprogrammare il micro; ma se l'ISP lo usi solo per il bl in seguito non ti serviranno più.

... comunque confermo che il 644 sta funzionando regolarmente programmato con l'ISP, con il 30 % di script già "tradotto" per il 644 .. e sono già soddisfatto ....

certamente mi sono perso qualcosa, perché non capisco questa frase :cold_sweat:

Grazie michele .. gentilissimo e chiarissimo....

l'ultima frase era solo per rafforzare quanto scritto prima da me....

... niente di importante ... stasera riproverò.. ciao

Un modo per sapere se il bootloader funziona ci sarebbe. Se hai scaricato il mio pckage, apri il file /hardware/arduino/booloaders/1284p/optiboot.c e cercare intorno alla riga 187 il seguente codice:

#ifndef LED_START_FLASHES
#define LED_START_FLASHES 0
#endif

Metti il numero di flash che vuoi e poi ricompila.

e questo fa lampeggiare un LED? quale?

E' scritto nel file pins_def.h presente nella stessa cartella. Per il 644/1284 si tratta del pin PB1, che sarebbe il 2° piedino.

leo72:

[quote author=Michele Menniti link=topic=136740.msg1031155#msg1031155 date=1355400441]
e questo fa lampeggiare un LED? quale?

E' scritto nel file pins_def.h presente nella stessa cartella. Per il 644/1284 si tratta del pin PB1, che sarebbe il 2° piedino.

[/quote]
per Paolo non per me, se attiva quella riga senza collegare nulla all'esterno non si accorgerà comunque di niente :slight_smile:

per Paolo non per me, se attiva quella riga senza collegare nulla all'esterno non si accorgerà comunque di niente :slight_smile:
[/quote]
Beh, questo è scontato :wink:
Cmq era stato domandato come poter avere la certezza che il bootloader fosse stato caricato correttamente e stesse funzionando, quello è il modo più semplice, che sfrutta lo stesso codice del bootloader.

infatti è perfetto, abbiamo fatto tutto sto casino solo perché intendevo dirti che accanto al suggerimento potevi dirgli direttamente che doveva collegare un led al pin 2 tramite una R in serie :smiley:

Ma così non gli davo il suggerimento di andare a studiarsi il core che ha scaricato. Invece così sa che ci sono dei file che fanno alcune cose, che quei file li può modificare e che modificandoli può personalizzarsi il core.
Diciamo che stasera mi sento molto insegnante, va' ... sarà che a forza di ragionare con te mi sto professorizzando :stuck_out_tongue_closed_eyes:

leo72:
Ma così non gli davo il suggerimento di andare a studiarsi il core che ha scaricato. Invece così sa che ci sono dei file che fanno alcune cose, che quei file li può modificare e che modificandoli può personalizzarsi il core.
Diciamo che stasera mi sento molto insegnante, va' ... sarà che a forza di ragionare con te mi sto professorizzando :stuck_out_tongue_closed_eyes:

Ottimo, caro collega, concordo con la Sua disquisizione, da approfondire in sede opportuna XD

Grazie per gli "spiegoni" ... ad entrambi naturalmente.
Ma se siete d'accordo continuerei con le domande!!!!

sul 328, in una parte del codice, leggevo i 4 bit della porta D così:

charDTMF_value = (PIND)>>4;   // legge i bit della porta D e shifta a destra di 4 (estrae un valore tra 0 e 15)

adesso nel 644 volevo collegarlo ai primi PIN della porta B, ovvero:

PCINT8/(D0 ) PB0  1|   
            PCINT9/(D1 ) PB1  2| 
   PCINT10/INT2 (D2 ) PB2  3| 
  PCINT11/OC0A (D3 ) PB3  4|

nel 644 dovrei leggerlo così

charDTMF_value = (PINB)>>4;   // legge i bit della porta B e shifta a destra di 4 (estrae un valore tra 0 e 15)

.. ma mi sfugge quale dei bit è più significativo e quale no... insomma ddevo shiftare di 4 posti o no? siccome non riesco a farlo funzionare...

un'altra cosa:

  • per fare il debug devo fare funzionare il serial monitor... siccome la programmazione la faccio tramite ISP .. niente serial monitor!!! giusto?

ed ancora:

  • la funzione che legge questo: "charDTMF_value = (PINB)>>4" è attivata con l'interrupt che sul 644 ho messo sul n° 0,
    PCINT26/INT0/RX1 (D10) PD2 16 (dalla mappattura dei PIN del 644)
    cioè il PIN 16 del microcontrollore, dove cè anche il RX1...
    quindi siccome ci sono funzioni che inviano dati anche alla seriale, è possibile che il fatto che sia attivita RX sul pin 16 mandi a quel paese l'interrupt?

suggerimenti??... consigli???

In questo modo non leggerai nulla di valido, o per meglio dire otterrai il valore di pin PB4..PB7 sui primi 4 bit.
Uno shift è uno scorrimento, se scorri 1 byte di 4 posizioni verso destra perdi il valore dei primi 4 bit meno significativi, su cui troverai il valore dei 4 bit più significativi.
Esempio:
byte 11000011
Se fai byte >> 4 poi byte vale 00001100(0011) perché i bit 0011 sono usciti da destra, e li hai persi.

.. ma mi sfugge quale dei bit è più significativo e quale no... insomma ddevo shiftare di 4 posti o no? siccome non riesco a farlo funzionare...

Il "peso" dei bit si misura da sinistra a destra.
76543210
Quindi il bit 7 è quello più significativo, il bit 0 quello meno significativo.
Ma tu cosa intendi fare? Leggere solo i primi 4 bit di quella porta?
Allora usa un AND bit a bit.
Fai PINB & 0b0001111, in questo modo ti verranno restituiti solo i 4 bit a destra, perdendo gli altri.

un'altra cosa:

  • per fare il debug devo fare funzionare il serial monitor... siccome la programmazione la faccio tramite ISP .. niente serial monitor!!! giusto?

Non dipende da come programmi il chip ma dal fatto che tu usi o meno la seriale nel tuo sketch.

ed ancora:

  • la funzione che legge questo: "charDTMF_value = (PINB)>>4" è attivata con l'interrupt che sul 644 ho messo sul n° 0,
    PCINT26/INT0/RX1 (D10) PD2 16 (dalla mappattura dei PIN del 644)
    cioè il PIN 16 del microcontrollore, dove cè anche il RX1...

No, la seconda seriale esiste solo sul 1284.
Mi sa che ti devi leggere il datasheet della famiglia 344/644/1284 prima di continuare.

quindi siccome ci sono funzioni che inviano dati anche alla seriale, è possibile che il fatto che sia attivita RX sul pin 16 mandi a quel paese l'interrupt?

suggerimenti??... consigli???

Studia.

leo72:
In questo modo non leggerai nulla di valido, o per meglio dire otterrai il valore di pin PB4..PB7 sui primi 4 bit.
Uno shift è uno scorrimento, se scorri 1 byte di 4 posizioni verso destra perdi il valore dei primi 4 bit meno significativi, su cui troverai il valore dei 4 bit più significativi.
Esempio:
byte 11000011
Se fai byte >> 4 poi byte vale 00001100(0011) perché i bit 0011 sono usciti da destra, e li hai persi.

devo leggere i 4 bit di informazionepresenti nei primi 4 PIN della porta B del 644, ovvero
D0 1|
D1 2|
D2 3|
D3 4|

  • quindi quando leggo la porta B, il D0 è il meno significativo!! giusto?

per l'utilizzo della seriale ....

Non dipende da come programmi il chip ma dal fatto che tu usi o meno la seriale nel tuo sketch.

si. la seriale la uso. ma nella connessione per la programmazione ho la connessione ISP, non quella seriale. Siccome non sono riuscito a ricevere dati nel serial monitor ne ho dedotto che la connessione ISP non consente ai dati seriali di raggiungere il serial monitor.. quindi niente debug....
pensavo di collegare direttamete il tx del 644 al rx dell'arduino usato come programatore ISP e viceversa per il rx <-- tx ..

circa questo

No, la seconda seriale esiste solo sul 1284.
Mi sa che ti devi leggere il datasheet della famiglia 344/644/1284 prima di continuare.

il problema e con l'inglese ....

e per questo:

Studia.

.. il problema è sempre con l'inglese!!!! ... ma grazie di tutto, anche del consiglio!!! :wink:

Giusto! (metto il "!" visto che a te piacciono i punti esclamativi :P)
Però tu scrivevi prima che volevi fare uno shift, perché?
Se shifti di 4 posizioni la lettura dei primi 4 bit, li perdi. Questo lo hai capito? Non rispondi alle mie domande...

Ma tu cosa intendi fare? Leggere solo i primi 4 bit di quella porta?

per l'utilizzo della seriale ....

Non dipende da come programmi il chip ma dal fatto che tu usi o meno la seriale nel tuo sketch.

si. la seriale la uso. ma nella connessione per la programmazione ho la connessione ISP, non quella seriale. Siccome non sono riuscito a ricevere dati nel serial monitor ne ho dedotto che la connessione ISP non consente ai dati seriali di raggiungere il serial monitor.. quindi niente debug....

La connessione SPI serve per la programmazione: SPI = Serial Programming Interface.
La linea SPI non la puoi usare per l'invio dei dati. Una volta programmato il chip, devi approntare la connessione seriale.

pensavo di collegare direttamete il tx del 644 al rx dell'arduino usato come programatore ISP e viceversa per il rx <-- tx ..

Appunto. SPI è una cosa, seriale è un'altra.

No, la seconda seriale esiste solo sul 1284.
Mi sa che ti devi leggere il datasheet della famiglia 344/644/1284 prima di continuare.

il problema e con l'inglese ....

e per questo:

Studia.

.. il problema è sempre con l'inglese!!!! ... ma grazie di tutto, anche del consiglio!!! :wink:

Se aspetti che Atmel rilasci un datasheet in italiano, fai prima a cambiare hobby :wink:
Tutti i datasheet, anche quelli dei componenti, sono scritti tutti in inglese. Un minimo di conoscenza della lingua ti serve, altrimenti non ti puoi muovere.

Ciao leo.... innanzitutto scusami perchè mi sembra che sto mettendo a dura prova la tua pazienza ...

leo72:
Esempio:
byte 11000011
Se fai byte >> 4 poi byte vale 00001100(0011) perché i bit 0011 sono usciti da destra, e li hai persi.
Questo lo hai capito? Non rispondi alle mie domande...
Ma tu cosa intendi fare? Leggere solo i primi 4 bit di quella porta?

Si esatto devo leggere solo i primi 4 bit e ricavare il valore contenuto dai primi 4 bit (tra 0 e 15) ....
ciò perchè ho deciso di usare i primi quattro pin della porta B, se avessi usato i pin dal 4 al 7 avrei dovito fare il bitwise con 00001111 ... e non fare nessuno shift. almeno così mi pare di avere capito!!!!

Se aspetti che Atmel rilasci un datasheet in italiano, fai prima a cambiare hobby :wink:
Tutti i datasheet, anche quelli dei componenti, sono scritti tutti in inglese. Un minimo di conoscenza della lingua ti serve, altrimenti non ti puoi muovere.

si... qualcosa cerco di leggere ma arrivo fin dove posso..... per il resto leggo a destra e a manca.... dove capita...
grazie comunque...

E' alla rovescia... Comunque tutto dipende da dove vuoi avere quei 4 bit. Se li vuoi avere nelle prime 4 posizioni di una variabile, allora leggi la porta e basta.
Ti ricordo che esistono anche istruzioni appositamente scritte per chi è un po' a digiuno in fatto di manipolazione dei singoli bit. Leggi questa:
http://arduino.cc/en/Reference/Bit
e le funzioni linkate in fondo.

Non credo si tratti di pazienza, e che se non hai capito serve spiegare quel concetto con altri esempi, ovviamente a te serve arrivare all'obiettivo e sacrifichi volentieri di imparare le operazioni di shift.

Se prenti 8 bit
7 0
1111 1111

Il bit 0 e il meno significativo, mentre il 7 e più significativo. Per prelevare il valore dei primi 4 bit (0-4) serve impostare i bit 5-7 tutti a zero, oppure fare un operazione logica di and tra il numero x è una maschera.

La maschera in questo caso equivale al numero 15 che in binario significa impostare i primi 4 bit ad 1, così 0000 1111.

L'operazione and sarà simile a questa:
x = 0110 0110 (102 decimale)
result = x & 15
o se preferisci in formato esadecimale:
x = 0x66
result = x & 0xf

result conterrà il valore 6.

Ciao.

Per Mauro....

in realtà come fare ed usare le operazoini di bitwise l'ho capito e lo sto usando regolarmente in diversi progetti .... il mio dubbio, probabilmente perchè non mi sono spiegato a sufficienza, consisteva in questo:
.. siccome sto prelevando 4 bit dalla porta B del 644, a partire dal pin1 (D0), il mio dubbio era:

  • sto prelevando questo: 11110000
  • oppure questo: 00001111 ...
    poi per trattarli con il bitwise per estrarre ciò che mi serve, credo di arrangiarmi, me l'avete spiegato voi stessi in molti altri post....

ad ogni buon conto ringrazio per la gentile disponibilità....

io capisco che a chi è esperto e pratico le domande banali, magari su argomenti affrontati decine di volte, rischiano di urtare, ma chi ha bisogno chiede ... gentilmente e senza nessuna pretesa. Poi se uno ritiene di rispondere, innazitutto lo ringrazio, poi interloquisco, chiedo chiarimenti... sempre fintanto che all'interlocutore gli và di rispondere .....
ciao