Go Down

Topic: ATmega328PB (Read 102880 times) previous topic - next topic

astrobeed

#375
Mar 11, 2016, 04:59 pm Last Edit: Mar 11, 2016, 05:05 pm by astrobeed
Testata anche la libreria freqcount, che accede direttamente ai registri del timer 1 e 2, oltre a sfruttare i relativi interrupt, funziona perfettamente unica modifica necessaria alla libreria, file "FreqCountTimer.h", è cambiare questa riga:

Code: [Select]
#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)

in questo modo perché c'è il test del micro per sapere quali timer usare e se non si dichiara esplicitamente il 328PB ritorna l'errore di chip sconosciuto.

Code: [Select]
#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega328PB__)

Con questo test ritengo archiviata la questione timer 328PB e relativa compatibilità, riferita all'uso con l'IDE di Arduino, col 328P.

Scientia potentia est

gpb01

Ok, mi compila correttamente entrambi gli esempi a corredo della SPI ... sia usando SPI che SPI1 ...
... allego qui la libreria, che qualcuno provi se, oltre a compilare correttamente, funziona veramente :D :D :D

Guglielmo
Search is Your friend ... or I am Your enemy !

astrobeed

@ Gugliemo.

Credo sia ora di spostare questo topic in megatopic. :)
Scientia potentia est

astrobeed

Ok, mi compila correttamente entrambi gli esempi a corredo della SPI ... sia usando SPI che SPI1 ...
... allego qui la libreria, che qualcuno provi se, oltre a compilare correttamente, funziona veramente :D :D :D
Preso, appena ho un attimo di tempo provo le due spi, prima voglio chiudere la questione I2C, più che altro perché mi serve a breve termine da mettere in pratica. :)
Scientia potentia est

gpb01

#379
Mar 11, 2016, 05:03 pm Last Edit: Mar 11, 2016, 05:04 pm by gpb01
@ Gugliemo.

Credo sia ora di spostare questo topic in megatopic. :)
Mi sembra cosa GIUSTA ... che Megatopic SIA !!!  :D :smiley-mr-green: :D

Guglielmo
Search is Your friend ... or I am Your enemy !

astrobeed

Segnalo una anomalia che ho riscontrato durante l'uso della seriale tramite il chip mEDBG presente sulla scheda Atmel, apparentemente non lavora a 115200 bps, con tutte le altre velocità ricevo i dati correttamente, se seleziono 115200 bps arriva spazzatura nel modo tipico del baud rate sbagliato.
Devo verificare, tramite adattare USB-UART, se l'errore è realmente legato al chip mEDBG oppure c'è un problema con l'UART0 del 328PB.
Scientia potentia est

astrobeed

#381
Mar 11, 2016, 05:18 pm Last Edit: Mar 11, 2016, 05:18 pm by astrobeed
Questione velocità mEDBG risolta, è proprio il chip che lavora male a quella frequenza, hanno già verificato che invece di andare a 115200 va a 111.111 bps, errore del 3.5% ed è oltre il massimo ammesso per le comunicazioni seriali asincrone.
Per farla breve, se usate schede con sopra mEDBG non andate oltre i 57600 bps per le comunicazione seriali.
Scientia potentia est

astrobeed

#382
Mar 11, 2016, 10:08 pm Last Edit: Mar 11, 2016, 10:09 pm by astrobeed
Un update per la I2C, attualmente ho due librerie distinte, wire0.h e wire1.h, che funzionano bene, la wire0.h è compatibile al 100% con l'attuale wire.h, ho provato diversi sketch e funzionano tutti, la differenza tra wire0 e wire1  è che nella seconda la classe si chiama "wire1", tutti i metodi rimangono invariati.
Adesso devo fare il merge del tutto in una singola libreria, così da rendere più leggero il codice, ripulire tutti i punti di debug che ho introdotto, rifare i test.
Se tutto va bene domani abbiamo la nuova libreria per la I2C, dopo di che, se i test per la SPI che ha realizzato Guglielmo sono positivi, possiamo cominciare a rilasciare la 1.0 beta della patch per l'IDE di Arduino finalizzata all'uso del 328PB.
Per il momento ho fatto i test con l'IDE 1.6.5r5, domani riparto da zero con l'IDE 1.6.8 in modo da fare i test con l'ultima release disponibile.
Scientia potentia est

testato

Atmel è stata acquisita ma resta per conto suo ? Cioè i chip atmel continueranno a chiamarsi atmel ?
Ad oggi ha un suo amministratore delegato ?

Sul discorso dei compilatori stai dicendo quindi che io scrivo un sw corretto, che però crea un danno a causa di un bug nel compilatore, e non è colpa dell'azienda che fornisce il compilatore ?

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

gpb01

#384
Mar 11, 2016, 10:42 pm Last Edit: Mar 11, 2016, 10:42 pm by gpb01
.... se i test per la SPI che ha realizzato Guglielmo sono positivi ....
.... "diamo a Cesare ciò che è di Cesare" .... io mi sono solo limitato a correggere il nome dei bit all'interno della libreria preparata da hackaday ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

astrobeed

Ho dato una sistemata alla libreria I2C per 328PB, dovrebbe essere tutto ok, devo solo aggiungere un controllo per verificare il tipo di processore e fornire un errore nel caso non viene utilizzata per il 328PB.
In realtà si tratta di due librerie distinte, "wire0" e "wire1", purtroppo cercare di fare il merge in una sola è un bel casino perché saltano fuori un sacco di conflitti con i metodi, che a loro volta usano funzione per l'accesso low level ai registri, quindi per evitare di dover definire due volte tutti i metodi con nomi diversificati ho preferito tenere separate le due lib diversificando solo i nomi delle funzioni low level, cosa trasparente per l'utente in quanto non deve usare queste funzioni direttamente.
In pratica basta usare le classi wire e wire1 con i metodi standard, in questo modo qualunque sketch realizzato per il 328P è utilizzabile direttamente con il 328PB semplicemente sostituendo "wire.h" con "wire0.h", mentre se si vuole utilizzare la seconda I2C basta includere "wire1.h" e utilizzare come classe wire1 al posto di wire, tutto il resto rimane invariato.
Adesso aggiungo il controllo per il tipo processore, faccio qualche test pratico con tutte le due I2C in funzione assieme e se è tutto ok tra non molto posto la libreria.
Scientia potentia est

astrobeed

#386
Mar 12, 2016, 06:02 pm Last Edit: Mar 12, 2016, 06:03 pm by astrobeed
Ecco la nuova libreria Wire che gestisce tutte e due le I2C, per il momento ha passato tutti i test però rimane una 1.0 beta fino a che non ho conferme da parte di altri del corretto funzionamento.
Come anticipato la libreria è composta due librerie distinte, wire0 e wire1, da copiare nella cartella librerie generiche o in quella dedicata al 328PB dentro "hardware", c'è anche il file pins_arduino.h aggiornato perché quello fornito da Watterott sebbene prevede SDA1 e SCL1 i pin sono assegnati a quelli della I2C standard.
Per la questione twi.h delle avrlibc ho risolto copiando il codice necessario dove serve con la dovuta modifica ai nomi dei registri, questo perché se si vogliono usare tutte e due le I2C assieme è impossibile risolvere con #undef dato che la stessa funzione deve usare due set diversi di registri, in realtà si tratta di una sola riga di codice quindi nessun appesantimento della libreria.

Uno sketch di esempio su come usare tutte e due le I2C, basato sull'esempio digipot fornito con l'IDE.

Code: [Select]
// This example code is in the public domain.

#include <Wire0.h>
#include <Wire1.h>

void setup() {
  Wire.begin(); // join i2c bus (address optional for master)
  Wire1.begin();
}

byte val = 0;

void loop() {
  Wire.beginTransmission(44); // transmit to device #44 (0x2c)
  // device address is specified in datasheet
  Wire.write(byte(0x00));            // sends instruction byte
  Wire.write(val);             // sends potentiometer value byte
  Wire.endTransmission();     // stop transmitting

  Wire1.beginTransmission(44); // transmit to device #44 (0x2c)
  // device address is specified in datasheet
  Wire1.write(byte(0x00));            // sends instruction byte
  Wire1.write(val);             // sends potentiometer value byte
  Wire1.endTransmission();     // stop transmitting
 
  val++;        // increment value
  if (val == 64) { // if reached 64th position (max)
    val = 0;    // start over from lowest value
  }
  delay(500);
}
Scientia potentia est

gpb01

Grazie, gran bel lavoro ... appena posso la provo  ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

astrobeed

Domani vedo di provare la SPI, da quello che ho visto la libreria gestisce solo la SPI0.
Scientia potentia est

gpb01

Domani vedo di provare la SPI, da quello che ho visto la libreria gestisce solo la SPI0.
Non dovrebbe, c'è una classe apposta definita per la SPI1 ... ::)

Code: [Select]
/* additional SPI1 Class ************************************************/
#if defined(__AVR_ATmega328PB__)

uint8_t SPI1Class::initialized = 0;
uint8_t SPI1Class::interruptMode = 0;
uint8_t SPI1Class::interruptMask = 0;
uint8_t SPI1Class::interruptSave = 0;
#ifdef SPI_TRANSACTION_MISMATCH_LED
uint8_t SPI1Class::inTransactionFlag = 0;
#endif
.....
.....

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up