NEW: Learning electronics? Ask your questions on the new Electronics Questions & Answers site hosted by CircuitLab.
    
  May 27, 2012  
  by Heno2au
  
  
     
    
    
    
    
     
    
    
 | 
Hi , Sorry to go over old ground but i am trying to use a simple input to start a loop. As You can see i am using the led_blink code as a base.
I have written the bootloader to the chip and all is OK.i  It runs as it is written on a 328p 
// led_blink.c
// for NerdKits with ATmega168
// hevans@nerdkits.edu
#define F_CPU 14745600
#include <avr/io.h>
#include <inttypes.h>
#include "../libnerdkits/delay.h"
#include "../libnerdkits/lcd.h"
#include "../libnerdkits/io_328p.h"
// PIN DEFINITIONS:
//
// PC5-- LED anode
uint8_t in1=0;
int main() {
    // LED as output
  DDRC |= (1<<PC5) | (1<<PC4) | (1<<PC3) | (1<<PC2) |(1<<PC1) | (1<<PC0);
  // loop keeps looking forever
  DDRD &= ~(1<<PD7);
  PORTD |= (1<<PD7);
  while (1) //(PIND & ((1<<PD7)==0))
    // turn on LED
    {
    PORTC |= (1<<PC5);
    //delay for 500 milliseconds to let the light stay on
    delay_ms(500);
    // turn off LED
    PORTC &= ~(1<<PC5);
    //delay for 500 milliseconds to let the light stay off
    delay_ms(500);
    // turn on LED
    PORTC |= (1<<PC4);
    //delay for 500 milliseconds to let the light stay on
    delay_ms(500);
    // turn off LED
    PORTC &= ~(1<<PC4);
    //delay for 500 milliseconds to let the light stay off
    delay_ms(500);
    // turn on LED
    PORTC |= (1<<PC3);
    //delay for 500 milliseconds to let the light stay on
    delay_ms(500);
    // turn off LED
    PORTC &= ~(1<<PC3);
    //delay for 500 milliseconds to let the light stay off
    delay_ms(500);
    // turn on LED
    PORTC |= (1<<PC2);
    //delay for 500 milliseconds to let the light stay on
    delay_ms(500);
    // turn off LED
    PORTC &= ~(1<<PC2);
    //delay for 500 milliseconds to let the light stay off
    delay_ms(500);
    // turn on LED
    PORTC |= (1<<PC1);
    //delay for 500 milliseconds to let the light stay on
    delay_ms(500);
    // turn off LED
    PORTC &= ~(1<<PC1);
    //delay for 500 milliseconds to let the light stay off
    delay_ms(500);
    // turn on LED
    PORTC |= (1<<PC0);
    //delay for 500 milliseconds to let the light stay on
    delay_ms(500);
    // turn off LED
    PORTC &= ~(1<<PC0);
    //delay for 500 milliseconds to let the light stay off
    delay_ms(500);
  }  
  return 0;
}
I have commented out at the line while(1)what I have tried to insert.
 
I know the pin is set as an input by measuring the voltage on the pin to see if it is high. I have tried all the examples I have found in the forum ( mostly refer to port c) but I cannot get it to work,
All I want to do is wait until the input is low to start the while loop.  | 
  May 28, 2012  
  by pcbolt
  
  
     
    
    
    
    
     
    
    
 | 
Hi Heno2au - 
If you would like to have the loop execute it's code ONLY when PD7 is low, all you'd need is something like this: 
while(1) {
  if (PIND & (1<<PD7)) continue;  // if PD7 is high -> go to the start of the loop
  // the rest of the LED code follows...
 
If you want to execute the loop code every time AFTER PD7 goes low, do something like this: 
uint8_t loop_flag = 0;
while (1) {
   if ((PIND & (1<<PD7)) && (loop_flag == 0)) continue;
   loop_flag = 1;    // once PD7 goes low, the LED code will always execute
   // the rest of the LED code follows...
  | 
Post a Reply
Please log in to post a reply.