Go Down

Topic: RS485 per programmare ATmega (Read 2801 times) previous topic - next topic

leo72


Ok linux posso prenderlo su un altro pc di cui non posso disporre subito..

Cioè devo semplicemente salvarmi l'optiboot.h originale, posizionarmi sulla cartella che contiene questo file che stiamo modificando e lanciare il comando?

Per scrupolo, copia tutta la cartella /optiboot, così puoi rimettere tutto a posto e ripristinare l'Optiboot originale.

Quote

Poi suppongo che debba fare un burn bootloader with arduino as isp?

Sì, devi programmare l'Atmega tramite Arduino. Però devi crearti prima una board virtuale, come descritto nella guida di Menniti.

sciorty

Uhmm nell'istruzione non mi riconosce atmega328.. io ho fatto una copia della csrtella optiboot, modificato il file optiboot.c, e posizionatomi col terminale sulla cartella optiboot.
Ma quest'operazione esattamente a cosa serve? Sarebbe una compulazione dei codici? Se lo faccio sul mio pc linux, posso poi semplicemente copiare su windowsla cartella optiboot ricavata e quindi fare il burning del bootloader?

leo72


Uhmm nell'istruzione non mi riconosce atmega328.. io ho fatto una copia della csrtella optiboot, modificato il file optiboot.c, e posizionatomi col terminale sulla cartella optiboot.

deve funzionare con "make atmega328". Prova sennò dando un "make" generico e guarda se compila per tutti i micro.

Quote

Ma quest'operazione esattamente a cosa serve? Sarebbe una compulazione dei codici? Se lo faccio sul mio pc linux, posso poi semplicemente copiare su windowsla cartella optiboot ricavata e quindi fare il burning del bootloader?

Serve a compilare il bootloader, cioè a creare l'eseguibile partendo dai sorgenti modificati che hai scritto tu.
Se compili su Linux puoi semplicemente prendere il file optiboot_atmega328.hex, è quello che serve, e copiarlo sulla tua installazione Windows (salva quello originale, per scrupolo).

sciorty

Ho letto che su windows c'è il file omake.bat all'interno della cartella optiboot quindi si può fare, ma ho riscontrato un problema dovuto a qualche errore di sintassi all'interno di optiboot.c, allego anche lo screen.

Tolgo un po' di roba a caso altrimenti non rientro con il numero di caratteri, le modifiche sono in maiuscolo:
Code: [Select]

int main(void) {

  // Adaboot no-wait mod
  ch = MCUSR;
  MCUSR = 0;
  if (!(ch & _BV(EXTRF))) appStart();
[b]DDRD |=B0000100;  [/b]
#if LED_START_FLASHES > 0
  // Set up Timer 1 for timeout counter
  TCCR1B = _BV(CS12) | _BV(CS10); // div 1024
#endif

}

void putch(char ch) {
[b]PORTD |=B0000100;[/b]
#ifndef SOFT_UART
  while (!(UCSR0A & _BV(UDRE0)));
  UDR0 = ch;
#else
  __asm__ __volatile__ (
    "   com %[ch]\n" // ones complement, carry set
    "   sec\n"
    "1: brcc 2f\n"
    "   cbi %[uartPort],%[uartBit]\n"
    "   rjmp 3f\n"
    "2: sbi %[uartPort],%[uartBit]\n"
    "   nop\n"
    "3: rcall uartDelay\n"
    "   rcall uartDelay\n"
    "   lsr %[ch]\n"
    "   dec %[bitcnt]\n"
    "   brne 1b\n"
    :
    :
      [bitcnt] "d" (10),
      [ch] "r" (ch),
      [uartPort] "I" (_SFR_IO_ADDR(UART_PORT)),
      [uartBit] "I" (UART_TX_BIT)
    :
      "r25"
  );
#endif
[b]PORTD &=B1111011;[/b]
}

uint8_t getch(void) {
[b] PORTD &=B1111011;[/b]
  uint8_t ch;

#ifdef LED_DATA_FLASH
#ifdef __AVR_ATmega8__
  LED_PORT ^= _BV(LED);
#else
  LED_PIN |= _BV(LED);
#endif
#endif

#ifdef SOFT_UART
  __asm__ __volatile__ (
    "1: sbic  %[uartPin],%[uartBit]\n"  // Wait for start edge
    "   rjmp  1b\n"
    "   rcall uartDelay\n"          // Get to middle of start bit
    "2: rcall uartDelay\n"              // Wait 1 bit period
    "   rcall uartDelay\n"              // Wait 1 bit period
    "   clc\n"
    "   sbic  %[uartPin],%[uartBit]\n"
    "   sec\n"
    "   dec   %[bitCnt]\n"
    "   breq  3f\n"
    "   ror   %[ch]\n"
    "   rjmp  2b\n"
    "3:\n"
    :
      [ch] "=r" (ch)
    :
      [bitCnt] "d" (9),
      [uartPin] "I" (_SFR_IO_ADDR(UART_PIN)),
      [uartBit] "I" (UART_RX_BIT)
    :
      "r25"
);
#else
  while(!(UCSR0A & _BV(RXC0)))
    ;
  if (!(UCSR0A & _BV(FE0))) {
      /*
       * A Framing Error indicates (probably) that something is talking
       * to us at the wrong bit rate.  Assume that this is because it
       * expects to be talking to the application, and DON'T reset the
       * watchdog.  This should cause the bootloader to abort and run
       * the application "soon", if it keeps happening.  (Note that we
       * don't care that an invalid char is returned...)
       */
    watchdogReset();
  }
 
 



Secondo problema: Il mio convertitore non ha un pinout del reset, quindi non posso mandarlo allo standalone.. mi sa che stiamo facendo un lavoro inutile!! http://www.sparkfun.com/datasheets/BreakoutBoards/USB-to-RS485-Breakout-v11.pdf

leo72

1° problema:
per la compilazione su Windows non so aiutarti. Al max posso compilarti il file su Linux, se mi passi il sorgente.

2° problema:
devi replicare lo schema del reset che era usato sull'Arduino 2009, che usava anch'essa l'FT232, dove erano usate le linee DTR/RTS:
http://arduino.cc/en/uploads/Main/arduino-duemilanove-schematic.pdf

sciorty

No la compilazione la fa, il problema sta appunto nel sorgente in cui avrò sbagliato qualcosa!  :smiley-sweat:

2- Il problema sta nel fatto che sul convertitore non ho un "buco" che vada al reset o agli altri pin del ft232! (non si chiama pinout?)

leo72

Il grassetto non funziona all'interno del tag code.
A me pare che tu stia usando un valore a 7 bit, non ad 8  ;)

sciorty

:smiley-sweat:

Direi che ora rimanga il problema del reset:
O compro un altro convertitore che abbia un pinout sul reset (non fatemelo fare, vi prego), oppure..?

leo72

Il tuo è un convertitore USB/RS485, a te serviva questo prodotto:
https://www.sparkfun.com/products/718

che è un convertitore USB/seriale e che, a differenza della schedina che hai tu, tira fuori tutte le linee dall'FT232, comprese RTS e DTR.

Go Up