Vývojová deska ATMEL včetně AVR ATmega16 v2

Z MediaWiki SPŠ a VOŠ Písek
Verze z 23. 4. 2013, 05:52, kterou vytvořil JA (diskuse | příspěvky) (→‎Test switch 1)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Skočit na navigaci Skočit na vyhledávání

Univerzální modul je vhodný pro výuku programování mikroprocesorů ATMEL řady AVR řady.


Na desce modulu je:

AVR

  • Mikrokontrolér: AVR ATMEGA16 16PU (ATmega32)
  • Quartz rezonátor: 16MHz
  • Tlačítko RESET
  • Konektor pro programování ISP
  • Potenciometr pro napětí Vref
  • Vyvedení všech portů mikroprocesoru
  • HD44780 2x16 LCD s podsvícením
  • LCD displej na konektoru - možnost výměny
  • Nastavení kontrastu displeje LCD
  • MMC / SD karta s vyhazovačem
  • Multiplexní 7-segment LED 4ks
  • LED 8 ks
  • 8ks tlačítka mikrospínače klávesnice.
  • Čtyři potenciometry pro nastavení napětí kapaliny 0-5V
  • Výkonové tranzistory s otevřeným kolektorem (8 výstupů) ULN2803
  • Reproduktor - bzučák
  • Digitální teploměr DS1820 1-wire
  • TSOP4836 infračervený přijímač
  • Hodiny reálného času PCF8583
  • I2C sběrnice s restorami 4K7
  • Sériové paměti EEPROM 24C16
  • Převodník RS485 - SN75176
  • Baterie - baterie CR232
  • USB - možnost napájení modulu
  • USB-RS232 - postaven na systému FR232RL
  • Napájecí zdroj (usměrňovač most, filtr kapacitní, stabilizátor 7805
  • 132 podložky pro vlastní potřebu - univerzální deska:

Fotografie:


Postup:

  • Bootloader - je program kterým je ATmega naprogramovaný z výroby. Tento firmware umožňuje nahrát vyvíjenou aplikace do paměti Flash pomocí seriové linky USB.
  • Konfigurace musí být nastavena propojkami u FT232 Txd<-->PD0 a Rxd<---> PD1
  • Nainstalujte si program MegaLoad
  • Po spuštění vyberte soubor formátu *.hex, kterým chcete naprogramovat MCU, vyberte příslušný port (např. Port11) a nastavte přenosovou rychlost 57 600bps. Pozn. Správný port najdete ve WIN ve správci zařízení v řádku Porty (COM a LPT)
  • K naprogramování mikroprocesoru, stiskněte tlačítko RESET

www:

VYV50 AVR ATmega32

Dokumentace

Prodej: Gotronik.pl Carpro.cz

SW:MegaLoad

Ukázkové programy:

Blikání LED

Soubor:VYV50 blik.jpg


Řízení LED podle tlačítka 1

Soubor:VYV50 botton-led .jpg
#include <avr/io.h>

int main(void)
{
   DDRD |= 1 << PIND0;       //PIN 0 on port D out
   DDRB &= ~(1 << PINB0);    //PIN 0 on port B in
   PORTB |= 1 << PINB0;      //PIN 0 on port B pull-out

   while (1)
     {
     PORTD ^= 1 << PIND0;
     if (bit_is_clear(PINB, 0)) //test PIN 0 on port B
       {
       PORTD &= ~(1 << PIND0); // will be "0"
       }
     else
       {
      PORTD |= 1 << PIND0); // will be "1"
       }
    }
}


Řízení LED podle tlačítka 2

Soubor:VYV50 push-led.jpg
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <util/delay.h>

void delay(int);

int main() 
{

DDRB = (1<<PB5);          // put PortB bit 5 as output
GIMSK |= (1<<INT0);       // Enable INT0 External Interrupt
MCUCR |= (1<<ISC01);      // Falling-Edge Triggered INT0
sei(); // Enable Interrupts

for(;;){                  // nothing happens.
       }

}

SIGNAL(SIG_INTERRUPT0) 
{

// this function is called when INT0 bit (PD2) is interrupted.
// You can also use INTERRUPT() function instead.
// SIG_INTERRUPT0 -> INT0 (PD2)
// SIG_INTERRUPT1 -> INT1 (PD3)
// While Button is pressed, LED is on

       PORTB |= (1<<PB5);     // Put PortB bit 5 HIGH
       delay(1000);
       PORTB &= ~(1<<PB5);     // Put PortB bit 5 LOW
       delay(1000);
}

void delay(int ms) 
{
       ms /= 100;
       char i;
       for(i = 0; i < ms; i++)
       {
       _delay_ms(100);      // max is 262.14 ms / F_CPU in MHz
       }
}

zdroj informací: Control LED by pressing button (using interrupts function in AVR)

Traffic Light

#include <avr/io.h>   
#include <util/delay.h>  
  
int main(void)  
{  
  DDRB = 0xFF;        // set DDRB all pins on PORT B will be OUT  

  while (1)  
    {  
    PORTB = 0b00000001; //LED RED set ON  
    _delay_ms(1000);       
    PORTB = 0b00000011; //LED RED and ORANGE set ON  
    _delay_ms(200);       
    PORTB = 0b00000100; //LED GREEN set ON  
    _delay_ms(1000);       
    PORTB = 0b00000010; //LED ORANGE set ON  
    _delay_ms(500);       
    }  
}

Control bits

*  Author: KB 2012

#include <avr/io.h>  
#include <util/delay.h>  
  
int main(void)  
{  
DDRB = 0b00000001;          //set pin. 0 to "1" (will be OUT), others will be "0"   
DDRB = DDRB | 0b00000001;   //set pin. 0 to "1", another pin stay same  
	      
DDRB |= 0b00000001;         //same statesmen   
	                                  
DDRB = 0b00100001;          // set pin. 0 and 5. to "1" others will be "0"  
 
PORTB |= 1 << PINB0;      //set only pin 0. to "1" (on output pin 0 will be "1")  

PORTB |= 1 << PINB5;      //set only pin 5. to "1"  
	                                  
PORTB &= ~(1 << PINB0);       //set only pin 0. to "0" (on output pin 0 will be "0")  

    while (1)  
    {  
        PORTB ^= 1 << PINB0;  //turn pin 0. to a “1” if it is “0” and vice versa  
        _delay_ms(100);         //delay 100 ms  
    }  
}

How to use a display 1

#include <avr/io.h>			//AVR header

int main(void) 
{
	uint8_t tab[] = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F";	//define tab
	uint8_t i;	    //set data type variable i 
	
	DDRA=0XFF;		//PORTA OUTPUT	
	
 while(1)			 //Forewer 
	{
	for (i=0; tab[i];i++)   //repeat 16 times increment i
	PORTA= tab[i];	    //send the character to PORTA
	}
}

How to use a display 2

#define F_CPU 1600000UL
#include <avr/io.h>			//AVR header, hlavička
#include <util/delay.h>

int main(void) 
{
	unsigned char tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};	
	uint8_t i;
	
	DDRA=0XFF;		//PORTA OUTPUT 

 while(1)
	{
	for (i=0; tab[i];i++) //repeat 16 times increment i
	PORTA= tab[i];	      //send the character to PORTA
	_delay_ms(500);       //delay, zpoždění
	}
}

LED on PORTA

#include <avr/io.h>

int main(void)
{
    DDRA = 0b11111111;   //All pin on PORTA will be OUT, všechny piny na bráně A budou výstupní

    char LEDs[14] = {0b00000001, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 
                     0b00100000, 0b01000000, 0b10000000, 0b01000000, 0b00100000,
                     0b00010000, 0b00001000, 0b00000100, 0b00000010 };
    uint8_t i;                  
    
    while(1)
    {
    for (i=0; i<14; i++)
    PORTA = LEDs[i];
    }
}

Test switch 1

#define F_CPU 1600000UL
#include <avr/io.h>			//AVR header //načtení hlavičkového souboru
#include <util/delay.h>
#define BUTTON 0			//define BUTTON on PIN0
#define LED 7				//define LED on PIN7

int main(void) 
{
	DDRA &= ~(1 << BUTTON);	//set PIN 0 on PORTA as INPUT    
	PORTA |= 1 << BUTTON;	//PIN 0 on PORTA set Pull-UP     
	DDRB |= 1 << LED;		//set LED on PORTB as OUTPUt
	PORTB &= ~(1 << LED);	//set LED LOW								
	
 while(1)
	{
	if (PINA & (1<<BUTTON)) // test BUTTON 
		PORTB &= ~(1 << LED);	//switch LED on if BUTTON activated	  		
	else
		PORTB |= (1 << LED);	//switch LED off 
	}
}

Stepper motor

Soubor:VYV50 stepper.jpg
#include <avr/io.h>
#include <util/delay.h>

// Low level port/pin definitions 
#define sbit(x,PORT) (PORT) |= (1<<x)
#define cbit(x,PORT) (PORT) &= ~(1<<x)
#define pin(x,PIN) (PIN)&(1<<x)

// Pins definition
#define pos pin(0,PINC) 
#define neg pin(1,PINC) 
#define out PORTD

uchar PROGMEM turn[] = {0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03};

int main(void)
 { uchar i=0;
   // Initialize Stack Pointer
   SPL = 0x5f;
   SPH = 0X04;
   // Configure Ports
   DDRD = 0xff;
   DDRC = 0x00;
   out  = 0xff;
   while(1)
    { if(!(pos))
       { i = i<8? i+1: 0;
         out = pgm_read_byte(&turn[i]);
         _delay_ms(50);
       }
      else if(!(neg))
	    { i = i>0? i-1: 7;
	      out = pgm_read_byte(&turn[i]);
	      _delay_ms(50);	
	    }
	 }
 }

info Proteus

Test switch 2

#include <avr/io.h>

int main(void)  
{
    DDRB=0XFF;                                  //All pins on PORTB is OUT
    PORTD &= ~(1 << PIND3) & ~(1 << PIND2);     //PIN3 and PIN2 on PORTD is input      
    PORTD |= 1 << PINB3 | 1 << PINB2;           //PIN3 and PIN2 on PORTD is high
 
 while(1)
    {
    PORTD=PIND;                 //taking input from PIN D
    if(PORTD==0x00)             //no switch
    PORTB=0x01;
    else if(PORTD==0x04)        //pin2 
    PORTB=0x02;
    else if(PORTD==0x08)        //pin3
    PORTB=0x04;
    else if(PORTD==0x08 | 0x40) //both pin3 and pin2
    PORTB=0x08;
    }
}


Obsluha priférií - LED, 1 digit display

  1. LED diody budou řízeny pomocí poloviny brány A
  2. segmenty budou řízeny pomocí brány B
  3. zobrazovaná hodnota bude cyklicky narůstat v rozsahu 0-F (0-15)
  4. po dosažení maxima bude hodnota nulována a cyklus bude probíhat znovu
* Created: 13.11.2012 
*  Author: CSI Lukáš 2012

#include <avr/io.h>		//knihovna pro práci se vstupními/výstupními bránami
#define F_CPU 16000000		//makro pro zadefinování pracovní frekvence mikroprocesoru
#include <util/delay.h>		//knihovna pro práci se zpožděním

void segmenty(int znak){	//funkce pro zobrazování znaků na displeji
	switch(znak){		//tento příkaz odkáže program na část rovnající se 
                                // hodnotě v podmínce (v tomto případě hodnotě ve znak)
		case 0:	PORTB=~(0b00111111);	//je-li znak=0 vykoná se toto 1 znamená svítí, společná anoda 
				break;		//pomocí break ukončíme seznam vykonávaných instrukcí pro znak=0
		case 1:	PORTB=~(0b00000110);
				break;
		case 2:	PORTB=~(0b01011011);
				break;
		case 3:	PORTB=~(0b01001111);
				break;
		case 4:	PORTB=~(0b01100110);
				break;
		case 5:	PORTB=~(0b01101101);
				break;
		case 6:	PORTB=~(0b01111101);
				break;
		case 7:	PORTB=~(0b00000111);
				break;
		case 8:	PORTB=~(0b01111111);
				break;
		case 9:	PORTB=~(0b01101111);
				break;
		case 10:PORTB=~(0b01110111);	//A
				break;
		case 11:PORTB=~(0b01111100);	//b
				break;
		case 12:PORTB=~(0b00111001);	//C
				break;
		case 13:PORTB=~(0b01011110);	//d
				break;
		case 14:PORTB=~(0b01111001);	//E
				break;
		case 15:PORTB=~(0b01110001);	//F
				break;

		default:PORTB=~(0b01000000);	//obsahuje-li znak hodnotu, která není definována, vykonají se instrukce v default
				break;
	}
}


int main(void){
	DDRA=0b00001111;	//nastavíme 4 spodní piny na bráně A jako výstup (pro LED diody)
	DDRB=0b01111111;	//nastavíme 7 spodních pinů na bráně B jako výstupních (pro všechny segmenty)
	PORTA=~0;		//nastavíme počáteční hodnotu brány A...
	PORTB=~0;		//...a brány B (negace -> ~0b0000 0000 = 0b1111 1111)


	volatile uint8_t cislo=0;	//vytvoříme si 8-bit číselnou proměnnou a nastavíme její počáteční hodnotu

	while(1){			//nekonečný cyklu
		segmenty(cislo);	//obsah proměnné číslo odešleme jako parametr do funkce segmenty
		PORTA=~cislo;		//obsah proměnné číslo zobrazíme pomocí LED diod jako binární číslo

		cislo++;		//zvětšíme hodnotu proměnné číslo o jednu
		if(cislo>15)		//jestli že bude hodnota proměnné číslo větší než 15...
			cislo=0;	//...proměnnou vynulujeme

		_delay_ms(1000);	//zpoždění 1s
	}
}


Počítadlo impulsů

Chyba při vytváření náhledu: Chybějící soubor

Download hex

/*
 * impulzy.c
 *
 * Created: 13.4.2012 10:28:29
 *  Author: Novotný Jan D4 2012
 * Brána A bity 3 -0 řídí Anody
 * Brána C řídí jednotlivé segmenty v pořadí: -GFEDCBA na bitech 7 až 0 (7. bit neobsazen) 
 * Vstup počítadla 0.bit na PORTB
 * Reset 2. bit na bráně PORTD
 */ 

#define F_CPU 16000000

#define SETBIT(BRANA, BIT) ((BRANA) |= (1<<(BIT))) 
#define CLRBIT(BRANA, BIT) ((BRANA) &= ~(1<<(BIT))) 
#define NEGBIT(BRANA, BIT) ((BRANA) ^= (1<<(BIT))) 
#define TESTBIT(BRANA, BIT) ((BRANA) & (1<<(BIT)))

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <stdlib.h>
void napiscislo(uint8_t numero);

volatile uint32_t pocet=0;
volatile uint8_t digits[4]={0,0,0,0};
void LED_Print(uint32_t num);

int main(void)
{
	DDRC=0xff;
	DDRA=0xff;
	PORTC=0xff;
	PORTA=0xff;
	SETBIT(PORTB,PB0);
	SETBIT(PORTD,PD2);
	MCUCR|=(1<<ISC01);
	GICR|=(1<<INT0);
	TCCR1B|=(1<<WGM12)|(1<<CS11);
	TCCR0|=(1<<CS01);
	TIMSK|=(1<<TOIE0)|(1<<OCIE1A);
	OCR1A=19999;
	sei();
    while(1)
    {
    }
}

void napiscislo(uint8_t numero)
{
	if (numero==1)
		PORTC=0b11111001;
	else if (numero==2)
		PORTC=0b10100100;
	else if (numero == 3)
		PORTC=0b10110000;	
	else if (numero==4)
		PORTC=0b10011001;
	else if (numero==5)
		PORTC=0b10010010;
	else if (numero==6)
		PORTC=0b00000010;
	else if (numero==7)
		PORTC=0b11111000;
	else if (numero==8)
		PORTC=0b10000000;
	else if (numero==9)
		PORTC=0b10010000;
	else if (numero==0)
		PORTC=0b11000000;
}

void LED_Print(uint32_t num)
{
	cli();
	uint8_t i=0,j;
	while(num)
	{
		digits[i]=num%10;
		i++;
		num=num/10;
	}
	for(j=i;j<4;j++) 
		digits[j]=0;
	sei();
}

ISR(INT1_vect)
{
	pocet=0;
}

ISR(TIMER1_COMPA_vect)
{
	static char port=0;
	port*=2;
	if (!TESTBIT(PINB,PB0))
		port+=1;
	if(port==0x07)
		pocet++;
	LED_Print(pocet);
		/*
	if (pocet==10)
		pocet=0;*/
}

ISR(TIMER0_OVF_vect)
{
	static uint8_t display=0;
	PORTC=0xff;
	PORTA=0x00;
	switch (display)
	{
		case 4:
			display=1;
			PORTA=0b1110;
			napiscislo(digits[0]);
			break;
		case 1:
			display=2;
			PORTA=0b1101;
			napiscislo(digits[1]);
			break;
		case 2:
			display=3;
			napiscislo(digits[2]);
			PORTA=0b1011;
			break;
		case 3:
			display=4;
			PORTA=0b0111;
			napiscislo(digits[3]);
			break;
		default:
			display=4;
	}		
}