This is an old revision of the document!


Digito i/o with Studyboard

Studyboard ‚Basic’ includes three outputs (LED) and three inputs (microswitch) LEDs are connected to PORTC[3..5] and switches PORTC[0..2].

This simple examples demonstrates how to switch on LED when pushing appropriate switch.

Connection schema:

Example C code:

/* Labor 1 example
Example works with Studyboard Basic v3
 
Press S1 - LED1 goes ON
Press S2 - LED2 goes ON
Press S31 - LED3 goes ON
Raivo Sell 2008
 
LED = 0 (ON)  		LED = 1 (OFF)
S	= 0 (ON) 	S	= 1 (OFF)
 
PORT direction: 1-output	0-input */
 
#include <avr\io.h>
 
//Definitions for easier bit manipulations
#define SET(x) |= (1<<x)  //bit high in port x
#define CLR(x) &=~(1<<x)  //bit low in port x
 
int main(void) { //main program
 
    DDRC  = 0x38;  // DDRC  0bXX111000
    PORTC = 0x3F;  // PORTC 0bXX111111
 
	//endless loop
	while(1) {
		// if button is pressed (pin is low)
		if (bit_is_clear(PINC, 0))	//Switch S1
			PORTC CLR(3); //LED 1 ON
		else if (bit_is_clear(PINC, 1))//Switch S2
			PORTC CLR(4); //LED 2 ON
		else if (bit_is_clear(PINC, 2))//Switch S3
			PORTC CLR(5); //LED 3 ON
		else // If nothing is pressed
			PORTC=0xFF;		//All LEDs OFF (LED=1)
	}
}

Same example in short form:

/* Lab 1 example
Author: Mikael Hellgren
Date: 080429
*/
 
#include <avr\io.h>
 
int main(void) {
	unsigned char temp;
    DDRC  = 0x38;  // DDRC  0bXX111000
    PORTC = 0x3F;  // PORTC 0bXX111111
 
	while(1) {
		temp=PINC;
		temp&=0x07;
		temp<<=3;
		PORTC &= (0xC7 | temp);
		PORTC |= (0x38 & temp);	
	}
}

Elliminating bouncing

Source: Micah Carrick tutorial

#define BUTTON_PORT PORTC       /* PORTx - nupu register */
#define BUTTON_PIN PINC         /* PINx - nupu sisendi register */
#define BUTTON_BIT PC0          /* nupu sisend/väljund bit */
 
#include <avr/io.h>;
#include <util/delay.h>;
 
int nupuvajutus()
{
        /* button is on when BIT is low (0) */
        if (bit_is_clear(BUTTON_PIN, BUTTON_BIT))
        {
                _delay_ms(25); /* de-bouncing delay time */
                if (bit_is_clear(BUTTON_PIN, BUTTON_BIT)) return 1;
        }
 
        return 0;
}
 
int main (void){
 
        /* switch on internel pull-ups */
        BUTTON_PORT |= _BV(BUTTON_BIT)
        if (button_is_pressed()){
                        //  do somthing
                        // wait if needed
        }
}
en/examples/digi/io.1237817527.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0