Modificare scketch arduinoisp

Ciao e buona domenica a tutti!
Ho finalmente finito un progettino (hardware) ed ore dovrei fare delle modifiche allo scketch arduinoisp presente nell'ide 1.0.1
Vi spiego in breve il progetto......
La scheda che ho allegato è in sostanza un programmatore per diversi chip atmel,in particolare dei tiny 24/44/84,25/45/85,2313/4313,ATmega 328,644,1280 e naturalmente i compatibili per pin a quest'ultimi oltre ad un connettore per fare la programmazione isp ed un'altro da cui programmare direttamente in seriale.
Sulla scheda c'è un convertitore USB/TTL (MCP2200) che comunica con un 328 che si preoccupa di gestire i dati del bus SPI utilizzati per programmare in ISP,controlla inoltre,tramite bus I2C,3 port expander PCF 8574 che si occupano a loro volta di gestire un lcd 16x2, 8 pulsanti e,l'ultimo dei PCF,controlla degli SN74LS244 (3 di preciso, che sono dei buffer ottali unidirezionali composti da due banchi a 4 bit) che si occupano di indirizzare il bus SPI solo al chip che si vuole programmare piuttosto che il connettore per la programmazione esterna.
Fatta questa breve introduzione sulle funzionalità devo dire che la scheda ha funzionato mooolto bene al primo colpo.
Ho fatto diversi test con programmazione di 328 e tiny85 ,perchè ho solo quelli,caricando solo scketch o anche BL e tutti sono andati a buon fine.....
Ora veniamo ai problemi che ho avuto.
Faccio fatica a modificare lo scketch arduinoisp in maniera che faccia al caso mio nel senso che se inserisco dei dati nel loop ,probabilmente creando ritardo nalla lettura del codice,mi va fuori sincronia.
Per ora vi lascio con queste indicazioni preparandovi il restante materiale(codici) che servono per capire cosa intendo.
Ciao a dopo......

Bene,rieccomi....
Sono riuscito a sistemare il tutto :slight_smile:
Per correttezza vi posto le parti di codice modificate
nelle parte del sutup da così

void setup() {
  Serial.begin(19200);
  pinMode(LED_PMODE, OUTPUT);
  pulse(LED_PMODE, 2);
  pinMode(LED_ERR, OUTPUT);
  pulse(LED_ERR, 2);
  pinMode(LED_HB, OUTPUT);
  pulse(LED_HB, 2);

a così

void setup() {
  Wire.begin();
  Serial.begin(19200);
  pinMode(LED_PMODE, OUTPUT);
  pulse(LED_PMODE, 2);
  pinMode(LED_ERR, OUTPUT);
  pulse(LED_ERR, 2);
  pinMode(LED_HB, OUTPUT);
  pulse(LED_HB, 2);
  lcd.init();  
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("      CIAO      ");
  lcd.setCursor(0,1);
  lcd.print("   E BENVENUTO  ");
  delay(3000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Premere un tasto");
  lcd.setCursor(0,1);
  lcd.print("per selezionare");
  }

Nella parte del loop va da così

void loop(void) {
  // is pmode active?
  if (pmode) digitalWrite(LED_PMODE, HIGH); 
  else digitalWrite(LED_PMODE, LOW);
  // is there an error?
  if (error) digitalWrite(LED_ERR, HIGH); 
  else digitalWrite(LED_ERR, LOW);
 // light the heartbeat LED
  heartbeat();
  if (Serial.available()) {
    avrisp();
  }
}

a così

#define add_isp 0x3C
#define add_pul 0x39
byte x=0;
byte y=0xFF;


void loop(void) {
  
  if (pmode) digitalWrite(LED_PMODE, HIGH); 
  else digitalWrite(LED_PMODE, LOW);
  // is there an error?
  if (error) digitalWrite(LED_ERR, HIGH); 
  else digitalWrite(LED_ERR, LOW);
 // light the heartbeat LED
  heartbeat();
  if (Serial.available()) {
    avrisp();
   }
  else{
    if(pmode==0){
      Wire.requestFrom(add_pul,1);
      if(Wire.available()){
        x=Wire.read();
        switch(x){
        case 128:
        y=0xFE;
        lcd.setCursor(0,0);
        lcd.print("  Chip scelto   ");
        lcd.setCursor(0,1);
        lcd.print("ATtiny 24/44/84 ");
        break;
        case 64:
        y=0xFD;
        lcd.setCursor(0,0);
        lcd.print("  Chip scelto   ");
        lcd.setCursor(0,1);
        lcd.print("ATtiny 25/45/85 ");
        break;
        case 32:
        y=0xFB;
        lcd.setCursor(0,0);
        lcd.print("  Chip scelto   ");
        lcd.setCursor(0,1);
        lcd.print("ATtiny 2313/4313");
        break;
        case 16:
        y=0xF7;
        lcd.setCursor(0,0);
        lcd.print("  Chip scelto   ");
        lcd.setCursor(0,1);
        lcd.print("ATmega 644/1280 ");
        break;
        case 8:
        y=0xEF;
        lcd.setCursor(0,0);
        lcd.print("  Chip scelto   ");
        lcd.setCursor(0,1);
        lcd.print("   ATmega 328   ");
        break;
        case 4:
        y=0x20;
        lcd.setCursor(0,0);
        lcd.print("  Chip scelto   ");
        lcd.setCursor(0,1);
        lcd.print(" Prog. esterna  ");
        break;
        case 2:
        y=0x40;
        lcd.setCursor(0,0);
        lcd.print("");
        lcd.setCursor(0,1);
        lcd.print("");
        break;
        case 1:
        y=0x80;
        lcd.setCursor(0,0);
        lcd.print("");
        lcd.setCursor(0,1);
        lcd.print("");
        break;
     }
    Wire.beginTransmission(add_isp);
    Wire.write(y);
    Wire.endTransmission(); 
      }
    }
  }
  
}

Il risultato ora è il seguente:
Collego la usb al pc ed arriva il messaggio "CIAO E BENVENUTO",e, subito dopo,"Premere un tasto per selezionare".
Ora ho a disposizione 8 pulsanti per selezionare il chip da programmare ma in realtà ne uso solo sei.
Una volta scelto il chip non devo fare altro che,nel caso volessi caricare uno scketch,aprire lo scketch e selezionare la giusta board relativa al chip scelto e quindi fare clic su carica con un programmatore.Dopo qualche secondo inizia il trasferimento dei dati ed,appena terminato,sul display visualizzo per 2 secondi il messaggio "Programmazione terminata" e subito dopo "Premere un tasto per selezionare" .
Visto che al quanto pare,dopo ripetute prove,sembra funzionare tutto alla perfezione accetto comunque molto volentieri delle migliorie al codice.
Ciao :slight_smile: :slight_smile:

Ma in pratica il tuo programmatore cosa sarebbe? Un'interfaccia che seleziona lo zoccolo? hai inserito qualche altra modifica allo sketch ArduinoISP a parte la scelta del chip?

Ma in pratica il tuo programmatore cosa sarebbe? Un'interfaccia che seleziona lo zoccolo? hai inserito qualche altra modifica allo sketch ArduinoISP a parte la scelta del chip?

Sì,per il momento ti da solo la possibilità di programmare tramite ide il chip che ti interessa,anche se sono montati tutti e 5 i tipi oltre al connettore per la ISP,scegliendolo tramite i pulsanti ed ovviamente non ho il bisogno di montare nulla su breadboard visto che ci sono già i quarzi.
Ora dovrò fare un'altra scheda come questa con aggiunte delle strip femmine per il pinout dei singoli chip in modo che si possa prototipare direttamente con i chip montatoci sopra ed aggiungere un bus seriale per poter fare interagire il pc direttamente con il chip che si vuole tramite il serial monitor oppure far dialogare direttamente tra loro due chip.
Le modifiche al codice sono solo quelle che ho riportato.Mi sarebbe piaciuto far di più lato codice ma come ben sai non sono una cima e quindi per il momento mi accontento :blush:
Ad esempio,guardando il codice arduinoISP,ci sono dei buffer utilizzati per contenere i fuse bit e le signature del micro e non mi sarebbe dispiaciuto affatto poter visualizzare sul display questi dati magari dopo aver caricato il BL in modo da poter controllare che siano corretti ma non sono ancora in grado di gestire con del codice queste cose =(

Ma i chip puoi inserirli "a caldo"? Cioè, hai previsto anche un sistema per staccare l'alimentazione dei chip da programmare quando lo sketch effettivamente non comunica con loro? Secondo me è una cosa utile.
Avevo realizzato tempo fa una piccola shield con gli zoccoli DIP28/20/14/8 per Megax28, Tinyx313, Tinyx4 e Tinyx5 e poi mi sono dimenticato di mettere questa cosa, ed ora devo ogni volta staccare il cavetto dell'Arduino, cambiare il chip, e poi riagganciare l'Arduino al PC.

No,non ho previsto questa cosa ed effettivamente potrebbe tornare molto utile.....
Staccarli sotto tensione non dovrebbe essere un problema se non per gli eventuali "corti" che si potrebbero fare usando degli attrezzini per staccarli...Potrei però nella prossima scheda usare un pulsante ,che per ora non ho utilizzato, per togliere tensione a tutti i chip usando un pin I0 che pilota un piccolo relè ed aggiungerci un led di segnalazione .....
E' tutto il pomeriggio che ci gioco e devo dire che è uno spasso.

tonid:
No,non ho previsto questa cosa ed effettivamente potrebbe tornare molto utile.....
Staccarli sotto tensione non dovrebbe essere un problema se non per gli eventuali "corti" che si potrebbero fare usando degli attrezzini per staccarli...Potrei però nella prossima scheda usare un pulsante ,che per ora non ho utilizzato, per togliere tensione a tutti i chip usando un pin I0 che pilota un piccolo relè ed aggiungerci un led di segnalazione .....
E' tutto il pomeriggio che ci gioco e devo dire che è uno spasso.

Staccare un micro in tensione, anche a mano, secondo me è un'operazione da non fare. Chissà quanti contatti fanno i pin VCC e GND con i corrispondenti alloggiamenti degli zoccolini... meglio evitare

Hai perfettamente ragione,mi riferivo più che altro al fatto di fare qualche prova e comunque anche io quando ho dovuto mettere/togliere ho preferito staccare il cavo USB per evitare problemi.
Leo,avrei da farti una domanda...per caricare scketch e BL sia su 328 e tiny ho dovuto smanettare con le board di testo ed ho imparato molto. Ho provato anche a guardare le cartelle contenenti i core ma non ho capito molto.
Mi piacerebbe imparare a creare tutto il materiale necessario per poter programmare un nuovo chip e vorrei cominciare dal core,so che è una domanda di non facile e veloce risposta ma mi sapresti aiutare ?

tonid:
Hai perfettamente ragione,mi riferivo più che altro al fatto di fare qualche prova e comunque anche io quando ho dovuto mettere/togliere ho preferito staccare il cavo USB per evitare problemi.
Leo,avrei da farti una domanda...per caricare scketch e BL sia su 328 e tiny ho dovuto smanettare con le board di testo ed ho imparato molto. Ho provato anche a guardare le cartelle contenenti i core ma non ho capito molto.
Mi piacerebbe imparare a creare tutto il materiale necessario per poter programmare un nuovo chip e vorrei cominciare dal core,so che è una domanda di non facile e veloce risposta ma mi sapresti aiutare ?

I core sono un grosso coso nel didietro... se mi passi il termine.
Non è facile rendere un chip completamente compatibile con l'IDE. Io in questi giorni sto lavorando ad un porting di un chip non supportato e mi sto mettendo le mani nei capelli. Il modo migliore è prendere il core di Arduino e mettersi a studiare tutti i file, scorrendoli 1 per uno, per capire a cosa si va incontro... segnati quando aprirai i file che gestiscono gli ingressi analogici, i timer e le periferiche tipo la seriale e l'I2C.

Finché puoi usa i core già disponibili, che poi ricoprono gran parte dei chip più diffusi.
Il core Tiny per i Tiny24/44/84, 25/45/85 e 2313 (anche 4313 non mi ricordo se con qualche modifica), poi c'è il core di Arduino che già supporta i 644/1284 nativamente; vanno solo aggiunte le voci nelle board (allo scopo, ho creato un package con tutto il necessario, bootloader compreso, che trovi sul mio sito). Per gli altri chip dipende: alle volte esistono dei core particolari per chip "esotici", vedi l'Attiny13, ma francamente non mi discosterei molto da quei 7/8 che ti ho menzionato.

I core sono un grosso coso nel didietro... se mi passi il termine.

Ahahah,passo,passo XD
Grazie dei consigli che accetto molto volentieri :slight_smile:
Immagino il casino....Il pacchetto l'ho già scaricato dal tuo sito quando si parlava del problema sul 644 che tra l'altro la prossima settimana dovrebbe arrivarmi insieme ad altro così posso fare un po di prove in merito al famoso filtro.
Comunque sulla scheda ho messo chip di cui avevo tutto il necessario(board di testo e compagnia bella) e credo che siano sufficienti a soddisfare molti progetti.
Ho anche approfondito un po la possibilità di usare la software serial per emulare via software la comunicazione seriale sui chip che non ne dispongono tipo appunto il tinyx5....