Problems with ArduinoISP, WinAVR and Atmel Studio.

Go To Last Post
13 posts / 0 new
Author
Message
#1
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

I am new to microcontrollers and wanted to understand how they work and how they are programmed for a long time. This summer I purchased 2 Arduino nano's and an ATmega8A-PU microcontroller. I read how Arduino can be used as an ISP. So I made the circuit, uploaded the sketch to it, and after downloading WinAVR(20100110) I made a program to blink an LED using atemga8A. The process of uploading the code to the uC's memory was difficult however as avrdude displayed the following error: 

avrdude -c arduino -P COM3 -b 19200  -p atmega8a -U flash:w:main.hex:i
avrdude: AVR Part "atmega8a" not found.

I opened the io.h header file and found that ATmega8A is not listed in there. So I changed the name of device in the makefile to ATmega8 as it was their in the header file, an let the fuse setting be that of ATmega8A(Fuse settings I obtained from engbedded.com). It finally worked. Here is the code: 

#undef F_CPU
#define F_CPU 1000000UL

#include<avr/io.h>
#include<util/delay.h>

int main(void)
{		DDRD^=(1<<PD6);
		for(;;)
		{	PORTD^=(1<<PD6);
			_delay_ms(1000);
		}

		return 0;
}

I observed that if the clock frequency is set to 8MHz in the source code, the LED blinks at a slower rate. However if I changed it to 1MHz, it started blinking at 1 second interval. A search on net revealed that this is the default setting on AVRs. I am still not clear on this point.

Another problem which was there was that avrdude was not able to sync with the device. It was eliminated by using a 10uF capacitor between the RST and GND pins of Arduino, so as to prevent the MCU on it from resetting itself.

After this, I copied from internet assembly code to blink an LED. As ATmega8A does not support CALL instruction, I modified it to RCALL jus to see what happens. Here is the code: 


 .EQU F_CPU = 8000000
 .ORG 0

 LDI R16, LOW(RAMEND)
 OUT SPL, R16
 LDI R16, HIGH(RAMEND)
 OUT SPH, R16

;MAIN LABEL
MAIN:
LDI R16, 0xFF
OUT DDRB, R16 ;PORTB IS OUTPUT

BACK:
COM R16 ;COMPLEMENT THE VALUE IN R16
OUT PORTB, R16 ;PUSH THE VALUE IN R16 TO PORTB
RCALL DELAY
RJMP BACK ;KEEP DOING THIS INFINITELY

DELAY:
LDI R17, 100
LOOP3: LDI R18, 255
LOOP2: LDI R19, 255
LOOP1: DEC R19
BRNE LOOP1 ;KEEP DECREASING R19
DEC R18
BRNE LOOP2 ;FOR EVERY DECREASE OF R18 REDO THE PREVIOUS LOOP
DEC R17
BRNE LOOP3 ;FOR EVERY DECREASE OF R17 REPEAT PREVIOUS LOOP
RET        ;RETURN TO PREVIOUS PC ADDRESS
; Replace with your application code

I know its a mindless copy-paste but I just wanted to see how this is going to pull off. I wrote the command "make flash" but nothing happened.

 

Then I searched more about WinAVR and got to know that it has not been updated since 2010. So it was better if started using Atmel Studio. I installed AS7. Then I searched on net on how I can upload my source code in AS to the MCU. I copy-pasted my c code in AS7 In the external tools I made the following entries: 

TITLE: ARDUINO_ISP
COMMAND: C:\WinAVR-20100110\bin\avrdude.exe
ARGUMENTS: -U lfuse:w:0xe1:m -U hfuse:w:0xd9:m -CC:\WinAVR-20100110\bin\avrdude.conf -v -v -v -patmega8 -carduino -PCOM3 -b19200 -e -U flash:w:"$(TargetDir)GccBoardProject2.hex":i
INITIAL DIRECTORY: 

I then tried uploading my code but the following message was displayed:


avrdude.exe: Version 5.10, compiled on Jan 19 2010 at 10:45:23
             Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
             Copyright (c) 2007-2009 Joerg Wunsch

             System wide configuration file is "C:\WinAVR-20100110\bin\avrdude.conf"

             Using Port                    : COM3
             Using Programmer              : arduino
             Overriding Baud Rate          : 19200
             AVR Part                      : ATMEGA8
             Chip Erase delay              : 10000 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         4    20   128    0 no        512    4      0  9000  9000 0xff 0xff
                                      Block Poll               Page                       Polled
               Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
               ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
               flash         33    10    64    0 yes      8192   64    128  4500  4500 0xff 0x00
                                      Block Poll               Page                       Polled
               Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
               ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
               lfuse          0     0     0    0 no          1    0      0  2000  2000 0x00 0x00
                                      Block Poll               Page                       Polled
               Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
               ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
               hfuse          0     0     0    0 no          1    0      0  2000  2000 0x00 0x00
                                      Block Poll               Page                       Polled
               Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
               ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
               lock           0     0     0    0 no          1    0      0  2000  2000 0x00 0x00
                                      Block Poll               Page                       Polled
               Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
               ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
               calibration    0     0     0    0 no          4    0      0     0     0 0x00 0x00
                                      Block Poll               Page                       Polled
               Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
               ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
               signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

             Programmer Type : Arduino
             Description     : Arduino
             Hardware Version: 2
             Firmware Version: 1.18
             Topcard         : Unknown
             Vtarget         : 0.0 V
             Varef           : 0.0 V
             Oscillator      : Off
             SCK period      : 0.1 us

avrdude.exe: AVR device initialized and ready to accept instructions

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

avrdude.exe: Device signature = 0x1e9307
avrdude.exe: safemode read 1, lfuse value: e1
avrdude.exe: safemode read 2, lfuse value: e1
avrdude.exe: safemode read 3, lfuse value: e1
avrdude.exe: safemode: lfuse reads as E1
avrdude.exe: safemode read 1, hfuse value: d9
avrdude.exe: safemode read 2, hfuse value: d9
avrdude.exe: safemode read 3, hfuse value: d9
avrdude.exe: safemode: hfuse reads as D9
avrdude.exe: erasing chip
avrdude.exe: reading input file "0xe1"
avrdude.exe: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude.exe: 1 bytes of lfuse written
avrdude.exe: verifying lfuse memory against 0xe1:
avrdude.exe: load data lfuse data from input file 0xe1:
avrdude.exe: input file 0xe1 contains 1 bytes
avrdude.exe: reading on-chip lfuse data:

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

avrdude.exe: verifying ...
avrdude.exe: 1 bytes of lfuse verified
avrdude.exe: reading input file "0xd9"
avrdude.exe: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude.exe: 1 bytes of hfuse written
avrdude.exe: verifying hfuse memory against 0xd9:
avrdude.exe: load data hfuse data from input file 0xd9:
avrdude.exe: input file 0xd9 contains 1 bytes
avrdude.exe: reading on-chip hfuse data:

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

avrdude.exe: verifying ...
avrdude.exe: 1 bytes of hfuse verified
avrdude.exe: reading input file "GccBoardProject2.hex"
avrdude.exe: can't open input file GccBoardProject2.hex: No such file or directory
avrdude.exe: write to file 'GccBoardProject2.hex' failed

avrdude.exe: safemode read 1, lfuse value: e1
avrdude.exe: safemode read 2, lfuse value: e1
avrdude.exe: safemode read 3, lfuse value: e1
avrdude.exe: safemode: lfuse reads as E1
avrdude.exe: safemode read 1, hfuse value: d9
avrdude.exe: safemode read 2, hfuse value: d9
avrdude.exe: safemode read 3, hfuse value: d9
avrdude.exe: safemode: hfuse reads as D9
avrdude.exe: safemode: Fuses OK

avrdude.exe done.  Thank you.

In  fact my LED stopped blinking. But programming the ATmega8A via avrdude in command prompt uploaded the code successfully.

Then at a post here, it was suggested that Arduino's avrdude directories work. So I tried them too. But it didn't work. Instead avrdude showed that memory verification has failed:

avrdude.exe: verification error, first mismatch at byte 0x0032             0x03 != 0x02

I searched avrdude's command words and instead of -D I put -e because I thought that maybe the flash was being not erased causing errors. The memory verification error then disappeared but the old  ".hex file not found" appeared again.  Sometimes, the write and read work by avrdude works, but the LED does not flash at all. Other times, it reports a syncing error. 

 

I am now totally lost. Here are the questions that I wish to ask:

 

1. How can I use ArduinoISP with Atmel Studio7?

2. How outdated is WinAVR?

3. How can one write assembly code to MCU using avrdude (installed with WinAVR) and command prompt?

4. Is 1MHz frequency the default frequency of MCU? How can it be changed? Does it requires changing fuses? (this I interpreted from my search on net and in datasheet. But I am not too clear on this.)

5. Will my technique of fooling avrdude into programming an MCU not in its file cause any problems? 

 

I apologise for my long post but I wanted to provide as many details as I could provide so that I could be helped.

 

" No, sir. Scientific truth is beyond loyalty and disloyalty."
"There is no harm done, except in your ego, in asking something obvious."

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

BareBones_VacuumTubes wrote:
after downloading WinAVR(20100110)
BareBones_VacuumTubes wrote:
2. How outdated is WinAVR?
You do know that 20100110 means 10th January 2010? The fact that Eric built the distribution on 10th January (actually I remember he pulled and reissued it on 19th to correct a fault) means the compiler itself dates from late 2009 so very soon you are going to be looking at a compiler that is ten years out of date - missing 10 years worth of new features and important bug fixes.

 

Over the last 10 years Atmel (now Microchip) have been getting pretty good at building issues of avr-gcc. They have 5.4.0 (WinAVR is 4.3.3). You can either get it standalone but if using Windows most folks would simply download and install Atmel Studio 7 which gets you that compiler (actually 6 compilers) and four assemblers. It also includes editor, build system, debugger and simulator.

BareBones_VacuumTubes wrote:
1. How can I use ArduinoISP with Atmel Studio7?
There's gazillions of articles about this - it basically involves setting up avrdude as an "external command" that can be triggered from within AS7.
BareBones_VacuumTubes wrote:
3. How can one write assembly code to MCU using avrdude (installed with WinAVR) and command prompt?
Not sure why "command prompt" is important in this. Anyway in AS7 you have a choice of two assemblers for AVR8. Eihther the original Atmel one or the one that comes with the C compiler and that turns the C code (after Cto Asm conversion) into binary. If doing Asm only projects there's more examples and more support for the Atmel  assembler. If trying to do mixed C+Asm projects you must use the avr-as one.
BareBones_VacuumTubes wrote:
4. Is 1MHz frequency the default frequency of MCU? How can it be changed? Does it requires changing fuses? (this I interpreted from my search on net and in datasheet. But I am not too clear on this.)
You picked a real tired old AVR in the mega8. The only way to change clocks is to change fuses. It has four internal osciallators - 1, 2, 4, and 8MHz - you can also set fuses to say "use crystal" then you attach a crystal between 0MHz and 16MHz to the XTAL1/XTAL2 pins and it runs at the speed of the crystal. There is another option which is "external clock" - do NOT select that unless you understand fully how clock vs crystal are different ! If you had even picked a slight newer AVR like mega88P (like the more modern version of mega8 but still from 2005) then you would have had a chip with CLKPR - that allows the speed to be changed without fuses and can be done as the chip is running.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Thanks for replying so quickly. 

I understand that WinAVR is to AS 7.0 what Turbo C is to latest release of GNU-GCC compilers. 

 

There's gazillions of articles about this - it basically involves setting up avrdude as an "external command" that can be triggered from within AS7.

Yes I know that there are many articles out there, and I understand that I have to set up avrdude as an external command , and that I have to have arguments which directs the tool to the hex file. However I have did exactly as there is in the websites, even took precaution in some case (like in -F case, which just bricks the MCU by neglecting signature check). But I have not been able to use ArduinoISP for this purpose in AS7, although it (arduinoISP) does work with WinAVR. That's why I posted all the error messages and the setting that I had because I am so confused as to why this is not working. 

 

Not sure why "command prompt" is important in this.

My mistake! I meant to say that with compiler, an editor and command prompt. I have been using GNU C compiler using Notepad++ and Command Prompt. Here's a pic of that:

 

 

I had experience with Visual Studio, but it was a heavy IDE which used to lag on my cheap i3 4GB RAM laptop. SO I am more comfortable with this "raw" programming.

 

You picked a real tired old AVR in the mega8.

I understand. I am starting out new with microcontrollers. I had C programming course in my second semester (will enter third now). So I wanted to apply that plus electronics is exciting. SO I thought that if I want to experiment with AVR's, why not pick a cheap one? So clock setting would be less problematic in some recent AVR like 328p. Am I right?

 

 

" No, sir. Scientific truth is beyond loyalty and disloyalty."
"There is no harm done, except in your ego, in asking something obvious."

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

BareBones_Vacuu... wrote:
I had experience with Visual Studio, but it was a heavy IDE which used to lag on my cheap i3 4GB RAM laptop.
Visual Studio Code is half the weight of Visual Studio, has GDB extensions, and the Arduino extension obtains Upload (AVRDUDE to AVR bootloader) and Upload using Programmer (AVRDUDE to AVRISP, USBasp, and etc)

mega8 was in early Arduino.

mega8 follow-on add OCD (GDB and EDBG via Visual Studio Code extensions)

 

Requirements for Visual Studio Code

Visual Studio 2019 System Requirements | Microsoft Docs

Arduino - ArduinoBoardSerialSingleSided3

https://www.avrfreaks.net/forum/avr-studio-mac-linux#comment-2584196

 

"Dare to be naïve." - Buckminster Fuller

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

BareBones_VacuumTubes wrote:
I am new to microcontrollers and wanted to understand how they work and how they are programmed for a long time. This summer I purchased 2 Arduino nano's

So you have at least two Mega328p's you can play with, if you ISP your code into one, it will overwrite the bootloader, but if you just use the bootloader via avrdude, your all set! 

Search for how you setup avrdude to use the usb serial bootloader as an external command in AS7.

 

Welcome to AVRFreaks!  (your one of us now)

 

Jim

edit: added link below on how to setup AS7 to use Arduino bootloader as external command

https://medium.com/jungletronics...

Click Link: Get Free Stock: Retire early! PM for strategy

share.robinhood.com/jamesc3274
stack gold/silver https://www.onegold.com/join/713...

 

 

 

 

Last Edited: Fri. Jul 12, 2019 - 06:37 PM
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

"Dare to be naïve." - Buckminster Fuller

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

The avr-gcc tools that come with AS7 can easily be invoked from a Command Prompt if you can think of any logical reason to run things that way (I can't). In fact on the AS7 Tools menu is an option for Command Prompt that not only  opens a command prompt but does so with all the PATHs and stuff setup for you.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

clawson wrote:
(I can't)

  • lint
  • automated regression test
  • static analysis

though one may prefer to have those as post-build events in the form of background applications while one deals with their current build in the foreground (unit test, integration test, test by an operator)

Atmel Studio 7 - Build Events

 

"Dare to be naïve." - Buckminster Fuller

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Search for how you setup avrdude to use the usb serial bootloader as an external command in AS7.

I will surely try it! 

 

I am have seen this video. It was after seeing this video that on a google search I got to know that Arduino can be used as an ISP.

 

I checked my connections, commands and arguments in external tools again. 

 

Command: C:\WinAVR-20100110\bin\avrdude.exe
Arguments: -U lfuse:w:0xe1:m -U hfuse:w:0xd9:m  -C C:\WinAVR-20100110\bin\avrdude.conf -v -v -v -p atmega8 -c arduino -P COM3 -b 19200 -D -U flash:w:$(TargetDir)$(TargetName).hex:i

These arguments I got from an AVRFreaks post which has been mentioned below in the comments. It seems that I made a mistake, for avrdude says that it burned my chip but the LED doesn't blinks. This is the console output of avrdude in AS7:

avrdude.exe: AVR device initialized and ready to accept instructions

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

avrdude.exe: Device signature = 0x1e9307
avrdude.exe: safemode read 1, lfuse value: e1
avrdude.exe: safemode read 2, lfuse value: e1
avrdude.exe: safemode read 3, lfuse value: e1
avrdude.exe: safemode: lfuse reads as E1
avrdude.exe: safemode read 1, hfuse value: d9
avrdude.exe: safemode read 2, hfuse value: d9
avrdude.exe: safemode read 3, hfuse value: d9
avrdude.exe: safemode: hfuse reads as D9
avrdude.exe: reading input file "0xe1"
avrdude.exe: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude.exe: 1 bytes of lfuse written
avrdude.exe: verifying lfuse memory against 0xe1:
avrdude.exe: load data lfuse data from input file 0xe1:
avrdude.exe: input file 0xe1 contains 1 bytes
avrdude.exe: reading on-chip lfuse data:

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

avrdude.exe: verifying ...
avrdude.exe: 1 bytes of lfuse verified
avrdude.exe: reading input file "0xd9"
avrdude.exe: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude.exe: 1 bytes of hfuse written
avrdude.exe: verifying hfuse memory against 0xd9:
avrdude.exe: load data hfuse data from input file 0xd9:
avrdude.exe: input file 0xd9 contains 1 bytes
avrdude.exe: reading on-chip hfuse data:

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

avrdude.exe: verifying ...
avrdude.exe: 1 bytes of hfuse verified
avrdude.exe: reading input file "C:\Users\Praneet Kapoor\Documents\Atmel Studio\7.0\GccBoardProject2\GccBoardProject2\Debug\GccBoardProject2.hex"
avrdude.exe: writing flash (70 bytes):

Writing | ################################################## | 100% 0.14s

avrdude.exe: 70 bytes of flash written
avrdude.exe: verifying flash memory against C:\Users\Praneet Kapoor\Documents\Atmel Studio\7.0\GccBoardProject2\GccBoardProject2\Debug\GccBoardProject2.hex:
avrdude.exe: load data flash data from input file C:\Users\Praneet Kapoor\Documents\Atmel Studio\7.0\GccBoardProject2\GccBoardProject2\Debug\GccBoardProject2.hex:
avrdude.exe: input file C:\Users\Praneet Kapoor\Documents\Atmel Studio\7.0\GccBoardProject2\GccBoardProject2\Debug\GccBoardProject2.hex contains 70 bytes
avrdude.exe: reading on-chip flash data:

Reading | ################################################## | 100% 0.06s

avrdude.exe: verifying ...
avrdude.exe: 70 bytes of flash verified

avrdude.exe: safemode read 1, lfuse value: e1
avrdude.exe: safemode read 2, lfuse value: e1
avrdude.exe: safemode read 3, lfuse value: e1
avrdude.exe: safemode: lfuse reads as E1
avrdude.exe: safemode read 1, hfuse value: d9
avrdude.exe: safemode read 2, hfuse value: d9
avrdude.exe: safemode read 3, hfuse value: d9
avrdude.exe: safemode: hfuse reads as D9
avrdude.exe: safemode: Fuses OK

avrdude.exe done.  Thank you.

As you can see, the output says that everything has gone well. But I still can't see my LED blinking. However if I write the same code in Notepad++, store it with makefile and using WinAVR burn the chip, the LED starts blinking. Why is it that using one outdated software (WinAVR 2010) this thing works, but after I set ARDUINO_ISP as an external tool in AS7, it does not works. Sorry if my questions are stupid, but I do not thing that there is any advantage in sticking to WinAVR given how outdated it is. 

In the mean time I will figure stuff out my nano's. 

Thank you!

" No, sir. Scientific truth is beyond loyalty and disloyalty."
"There is no harm done, except in your ego, in asking something obvious."

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Usual error is programming a different HEX from the one most recently built.

 

Also how do Makefile and AS7 handle F_CPU definition.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

For another way to get an AVR toolchain on Windows, I have used the new WSL with a Ubuntu install.

 

https://docs.microsoft.com/en-us/windows/wsl/install-win10

 

After installing Ubuntu, the AVR toolchain is available with

 

sudo apt-get install make git gcc-avr binutils-avr gdb-avr avr-libc avrdude

 

The next trick is to find an editor. I read that Microsoft notepad (the actual one not the ++) will soon recognize a Makefile tab character. One editor option is VS code, it is not heavyweight, but it is not light. I just finished trying its newish remote feature that allows editing source on a remote machine (a Ubuntu laptop) without having to share files over Samba (it was all done over SSH), now if that can be made to work with an R-Pi.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

ron_sutherland wrote:
... I have used the new WSL with a Ubuntu install.
Advantage of that WSL variant of Ubuntu is RDP if Windows 10 Pro and subsequent (Hyper-V)

For other WSL variants of Linux distributions, run an X server on Windows 10.

 

Linux on Windows 10: Running Ubuntu VMs just got a lot easier, says Microsoft | ZDNet

Ubuntu VMs can now be launched from Hyper-V Quick Create and use RDP for enhanced session mode.

...

After setup, Enhanced Session Mode will be automatically enabled, and users are prompted to select a display resolution.

Users will then see an XRDP prompt to login and then need to ensure 'Xorg' is selected from the menu to log in to an Ubuntu desktop session.

...

https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v#check-requirements

Pengwin by Whitewater Foundry

...

Run many Linux GUI applications.

...

emacs, vim, etc

 

"Dare to be naïve." - Buckminster Fuller

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Thank you. I will surely give it a try!

" No, sir. Scientific truth is beyond loyalty and disloyalty."
"There is no harm done, except in your ego, in asking something obvious."