collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Desenvolver com AVR gcc - como fazer debug ?  (Lida 5582 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Desenvolver com AVR gcc - como fazer debug ?
« em: 22 de Fevereiro de 2019, 23:02 »
Boa noite,

Desde o principio que tenho algumas divergências artísticas com o IDE do arduino, como ganho a vida a fazer cenas com o vi numa janela do putty, é esse o ambiente a que estou mais habituado.
Quando não tive muita resposta ás perguntas que fiz sobre o avr-gcc em windows fui ver para linux e realmente não custou nada instalar, primeiro numa VM no meu pc e agora num Raspberry pi 3 que deixou de ter muito uso desde que comecei a pagar o netflix.
A programação é feita por um USBtiny.

Mas... está a fazer-me falta uma coisa, o Serial.print() do Arduino dá um jeitão para debug, muito especialmente quando se está a ter alguns problemas com o codigo que escreve para um ecran i2c :-(

O que estou a pensar cá com os meus botões...

a) Ligar a uart do Pi (pinos 8 e 10) à uart do Arduino Nano e usar uma lib como a uartlibrary do Peter Fleury para fazer os prints, não me agrada muito ter um segundo cabo entre o PI e o Arduino e ainda tenho que investigar como faço as conversões 3.3V / 5V, talvez o melhor seja ligar logo a uart do Arduino a um adaptador USB / TTL que tenho para o PC e ter um putty em permanência ligado nessa porta serie... ahhh pera, este adaptador eu usava para ligar a um PI, portanto é de 3.3V e não de 5V, será que funciona ?

b) A mesma coisa, mas em vez de ter o USBtiny ligar diretamente ao USB do Arduino Nano, sei que é suposto funcionar sem problema com o Arduino IDE para linux, mas para já não estou a ver como é que o avrdude fala diretamente e como "partilhar" esta via para programar e para debug, mesmo com o arduino ide no windows ás vezes tenho problemas e tenho que fechar o serial monitor para conseguir programar. Mas eliminava o segundo cabo, o USBtiny e a conversão 3.3/5

Aceitam-se sugestões, como é que vcs fariam ?

EDIT: Afinal b) foi mais fácil que eu pensava, bastou rescrever o bootloader a partir do windows.
Voltar a ligar no PI e mudar o Makefile

AVRDUDE_PROGRAMMER = USBtiny ---> arduino

AVRDUDE_PORT = usb ---> /dev/ttyUSB0

E já tá a bombar, se bem com dois erros na escrita dos fuses que antes não dava... estranho...
« Última modificação: 22 de Fevereiro de 2019, 23:34 por vasco »
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.947
  • NERD!
Re: Desenvolver com AVR gcc - como fazer debug ?
« Responder #1 em: 23 de Fevereiro de 2019, 00:05 »
Eh pá, assim nem das hipóteses de tentar ajudar. Parece-me que a solução que encontraste é a mais prática e era a que ia sugerir a meio da leitura da tua mensagem.

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: Desenvolver com AVR gcc - como fazer debug ?
« Responder #2 em: 23 de Fevereiro de 2019, 14:58 »
Bom, realmente funciona, só é estranho não conseguir escrever os fuses, quando estava com o USBtiny nunca se queixou... talvez porque não tivesse bootloader, porque a sensação que me dá é que o Nano sai do modo de download assim que tem lá o código para a eprom, quando ao avrdude manda os fuses já ele fez reboot e tá a bombar... que estranho.
Não preciso de mandar nada para a eprom, vou tentar fazer o disable... Tb não preciso de mudar os fuses agora mas irrita-me ver o erro.

Quanto ao uso da uart, não tem nada que se diga, fazer o set do baud rate de depois uart_puts("xxxxx\r\n")... só não esquecer de por um sei() logo a seguir ao init.
Por alguma razão não consigo usar o avrdude -t para acompanhar as msgs, mas não é um problema, o minicom funciona bem, evidentemente que tenho que sair do minicom antes de voltar a programar... o que é uma trabalheira... :-)

Código: [Seleccione]
avrdude -p atmega328p -P /dev/ttyUSB0 -c arduino -V -v -v  -B 1 -U flash:w:main.hex -U eeprom:w:main.eep -U lfuse:w:0xFF:m -U hfuse:w:0xdf:m

avrdude: Version 6.3-20171130
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "/etc/avrdude.conf"
         User configuration file is "/home/vasco/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/ttyUSB0
         Using Programmer              : arduino
         Setting bit clk period        : 1.0
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino
         Hardware Version: 3
         Firmware Version: 6.2
         Vtarget         : 0.3 V
         Varef           : 0.3 V
         Oscillator      : 28.800 kHz
         SCK period      : 3.3 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (10114 bytes):

Writing | ################################################## | 100% 3.82s

avrdude: 10114 bytes of flash written
avrdude: reading input file "main.eep"
avrdude: input file main.eep auto detected as Intel Hex
avrdude: writing eeprom (0 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 0 bytes of eeprom written
avrdude: reading input file "0xFF"
avrdude: writing lfuse (1 bytes):

Writing |                                                    | 0% 0.00s ***failed;
Writing | ################################################## | 100% 0.12s

avrdude: 1 bytes of lfuse written
avrdude: reading input file "0xdf"
avrdude: writing hfuse (1 bytes):

Writing |                                                    | 0% 0.00s ***failed;
Writing | ################################################## | 100% 0.13s

avrdude: 1 bytes of hfuse written

avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: safemode: lfuse changed! Was ff, and is now 0
Would you like this fuse to be changed back? [y/n] n
avrdude: safemode: hfuse changed! Was df, and is now 0
Would you like this fuse to be changed back? [y/n] n
avrdude: safemode: Fuses OK (E:00, H:DF, L:FF)
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x00

avrdude done.  Thank you.
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Desenvolver com AVR gcc - como fazer debug ?
« Responder #3 em: 23 de Fevereiro de 2019, 20:33 »
Acho que percebes a ideia. Aquele -3.16 pode eventualmente precisar de um ajustezinho (se o receptor não estiver a receber bem os dados), o valor actual tá afinado para um clock de 6MHz.


#define UartBaudrate  9600

#   define dbgSendEEStr(str)    \
        { static const char EEMEM seStr[] = str; \
          dgbSendStr(seStr); }


static void suart_DelayOneBit (void)
{
    _delay_us(1000000.0 / UartBaudrate - 3.16);
}


/**
 * Send a character to the debug serial port.
 * This routine is synchronous.
 */

static void dbgSend (uint8_t data)
{
    uint8_t  ctr;

    suart_DelayOneBit();

    // Start bit = 0 (logical)
    PORTA &= ~ePinMISO;
    suart_DelayOneBit();

    for (ctr = 0; ctr < 8; ctr++)
    {
        if (data & 0x01)
        {
            PORTA |= ePinMISO;         // tx 1 (logical)
        }
        else
        {
            PORTA &= ~ePinMISO;         // tx 0 (logical)
        }
        data >>= 1;
        suart_DelayOneBit();
    }

    // Stop bit = 1 (logical)
    PORTA |= ePinMISO;
    suart_DelayOneBit();
}


static void dbgSendStr (const char *str)
{
    while (*str)
    {
        if (*str == '\n')
            dbgSend('\r');
        dbgSend(*str++);
    }
}


void dbgSendNr (int16_t nr)
{
    static char  buf[8];
    itoa(nr, buf, 10);
    dbgSendStr(buf);
}

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: Desenvolver com AVR gcc - como fazer debug ?
« Responder #4 em: 24 de Fevereiro de 2019, 10:22 »
Pelo que percebo a função dbgSend() pega simplesmente num byte e "apresenta" o valor do bit 0 no pino ePinMISO do port A (não encontro esta definição, suponho que seja um pino arbitrário), depois roda o byte e repete para cada bit.
O baud rate é dado simplesmente pelo _delay() em que se mantém o pino a representar o estado de cada bit.
Acho que não é possível descer mais "baixo" que isto...  ;D E é fácil de compreender o que se passa.

Exatamente o oposto dos 20 e tal Kb de código C  da lib do Peter Fleury que certamente não só faz café como coa as borras, põe adoçante e ainda mexe, e que é completamente overkill para o que preciso. Vou ver se consigo por o teu código a funcionar.

Imagino que no meu caso, com o Arduino Nano o pino será o pin 1 do port D

Obrigado, as vossas respostas são sempre "interessantes". hehehehehe

EDIT: Quanto aos fuses, depois de pensar um bocadinho afinal estava só a ser parvo, uma vez que não é possível alterar os fuses quando se está a programar pelo bootloader (-c arduino), só quando se usa um programador. Mas não sabia que estes também não podiam ser lidos (o avrdude reporta sempre o valor zero)
« Última modificação: 24 de Fevereiro de 2019, 10:28 por vasco »
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Desenvolver com AVR gcc - como fazer debug ?
« Responder #5 em: 25 de Fevereiro de 2019, 00:35 »
O pino é aquele que tu quiseres, só tens que o configurar como output e inicializá-lo a 1.

Uso coisas destas para debug em chips pequenos. Só implementa output mas dá para saber o que o gajo anda a fazer. (antes de recorrer a este printf ainda corro o código em simulação)
« Última modificação: 25 de Fevereiro de 2019, 01:02 por Njay »

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: Desenvolver com AVR gcc - como fazer debug ?
« Responder #6 em: 25 de Fevereiro de 2019, 13:41 »
O pino é aquele que tu quiseres, só tens que o configurar como output e inicializá-lo a 1.

OK, ainda não testei.

Citar
Uso coisas destas para debug em chips pequenos. Só implementa output mas dá para saber o que o gajo anda a fazer. (antes de recorrer a este printf ainda corro o código em simulação)

O "pecado" que eu cometo relativamente ao printf é usar a versão full blow para poder fazer o print de floats. Por enquanto o espaço ainda dá.
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Desenvolver com AVR gcc - como fazer debug ?
« Responder #7 em: 25 de Fevereiro de 2019, 17:08 »
Tenho programado AVRs com um arduino. Alterei o sketch de programador para adicionar um "modo debug", em que fico num loop a ler a saída deste dbgSendXX() e a dumpá-la para o PC pelo terminal (e portanto uso o terminal série para ver o output do AVR). Uso o MISO pino de output, que já é um output do AVR durante a programação.