LusoRobótica - Robótica em Português
Robótica => Iniciantes => Tópico iniciado por: vasco 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...
-
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.
-
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... :-)
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.
-
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);
}
-
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)
-
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)
-
O pino é aquele que tu quiseres, só tens que o configurar como output e inicializá-lo a 1.
OK, ainda não testei.
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á.
-
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.