2

Author Topic: 50$ Robot atmega328p a2d conversion  (Read 1925 times)

0 Members and 1 Guest are viewing this topic.

Offline ytzTopic starter

  • Beginner
  • *
  • Posts: 2
  • Helpful? 0
50$ Robot atmega328p a2d conversion
« on: November 12, 2009, 03:49:39 PM »
Hi, I'm new to this stuff and trying to build the 50$ Robot.

I'm using ATmega328P and Serial Dongle Programmer.



Before building the board I hooked everything up to a breadboard to see if everything would work so far and because the servos haven't arrived yet I made a small change in Photovore_v1.c to have the led go on or off depending on which photoresistor recieved more light. What happened was that the led just stayed on permenantly.

After trying all kinds of things it seems somehow starting the a2d conversion makes the program start from the beginning (or maybe resets the controller?). Is this possible?
What could I be doing wrong?

Here is the last code I used and pictures of the circuit.

The leds were supposed to go on one at a time, then together, and stay on. What I get is a continuous blinking back and forth.
The problem seems to be caused by the line:

sbi(ADCSRA, ADSC); // start conversion




Code: [Select]
#include "SoR_Utils.h" //includes all the technical stuff


int main(void)
{
int sensor_left=0;//left photoresistor
int sensor_right=0;//right photoresistor


configure_ports();
a2dInit();
// a2dSetPrescaler(ADC_PRESCALE_DIV32); // configure ADC scaling
// a2dSetReference(ADC_REFERENCE_AVCC); // configure ADC reference voltage
/**************************************************/

/*********ADD YOUR CODE BELOW THIS LINE **********/
LED_off();
LEDy_on();
delay_cycles(11500);
LEDy_off();
LED_on();
delay_cycles(11500);
LED_off();
delay_cycles(11500);


//moved a2dconvert10bit to here to help debug
unsigned char ch = 4;
volatile unsigned char a2dCompleteFlag = FALSE; // clear conversion complete flag

outb(ADMUX, (inb(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK)); // set channel
cbi(ADCSRA, ADIF); // clear hardware "conversion complete" flag
cbi(PRR, PRADC);
sbi(ADCSRA, ADSC); // start conversion

LEDy_on(); //lighting up both leds then delaying - to find the problematic line
LED_on();
delay_cycles(11500);

//while(!a2dCompleteFlag); // wait until conversion complete
// while( bit_is_clear(ADCSRA, ADIF) ); // wait until conversion complete
while( bit_is_set(ADCSRA, ADSC) ); // wait until conversion complete

// CAUTION: MUST READ ADCL BEFORE ADCH!!!
unsigned short a2dConvert10bit = (inb(ADCL) | (inb(ADCH)<<8)); // read ADC (full 10 bits);

unsigned char a2dConvert8bit= a2dConvert10bit>>2; // return ADC MSB byte

        sensor_left=a2dConvert8bit;


while(1)
{

delay_cycles(22500);
}
/*********ADD YOUR CODE ABOVE THIS LINE **********/

return 0;
}






« Last Edit: November 12, 2009, 06:16:59 PM by ytz »

Offline Webbot

  • Expert Roboticist
  • Supreme Robot
  • *****
  • Posts: 2,132
  • Helpful? 109
Re: 50$ Robot atmega328p a2d conversion
« Reply #1 on: November 12, 2009, 10:27:24 PM »
After trying all kinds of things it seems somehow starting the a2d conversion makes the program start from the beginning (or maybe resets the controller?). Is this possible?
What could I be doing wrong?

Yes this is possible - it is normally caused by an interrupt which doesn't have a matching entry in the hardware interrupt vector list.
So it may be that your processor is signalling an 'ADC complete' interrupt but there is no entry in the vector list - in which case the default is to start the program from the beginning again.
Webbot Home: http://webbot.org.uk/
WebbotLib online docs: http://webbot.org.uk/WebbotLibDocs
If your in the neighbourhood: http://www.hovinghamspa.co.uk

Offline Admin

  • Administrator
  • Supreme Robot
  • *****
  • Posts: 11,658
  • Helpful? 169
    • Society of Robots
Re: 50$ Robot atmega328p a2d conversion
« Reply #2 on: November 14, 2009, 10:15:31 PM »
Any reason you aren't using the default $50 Robot code? I mean, there is no need to bother/understand the ADC code . . . :P

Offline ytzTopic starter

  • Beginner
  • *
  • Posts: 2
  • Helpful? 0
Re: 50$ Robot atmega328p a2d conversion
« Reply #3 on: November 23, 2009, 02:44:39 PM »
Any reason you aren't using the default $50 Robot code? I mean, there is no need to bother/understand the ADC code . . . :P

I did start with the default code, making only the minor changes referred to on the "Microcontroller Upgrading" page. Once I realized that I wasn't receiving any response from my photoresistor I started to modify the code to try to find out exactly what was causing the problem.

 


Get Your Ad Here

data_list