Vývojová deska ATMEL včetně AVR ATmega16 v2
Z MediaWiki SPŠ a VOŠ Písek
(Rozdíly mezi verzemi)
(→www:) |
(→Test switch 1) |
||
(Není zobrazeno 9 mezilehlých verzí od 1 uživatele.) | |||
Řádka 1: | Řádka 1: | ||
Univerzální modul je vhodný pro výuku programování mikroprocesorů ATMEL řady [[AVR]] řady. | Univerzální modul je vhodný pro výuku programování mikroprocesorů ATMEL řady [[AVR]] řady. | ||
+ | [[Soubor:VYV-deska-AVR-ATmega16-09.jpg|right|400px]] | ||
+ | [[Soubor:mobilni-robot-05.jpg|right]] | ||
+ | |||
+ | [[Soubor:VYV-deska-AVR-ATmega16-50.jpg|thumb]] | ||
+ | [[Soubor:VYV-deska-AVR-ATmega16-51.jpg|thumb]] | ||
+ | [[Soubor:VYV-deska-AVR-ATmega16-52.jpg|thumb]] | ||
+ | [[Soubor:VYV-deska-AVR-ATmega16-53.jpg|thumb]] | ||
+ | [[Soubor:VYV-deska-AVR-ATmega16-54.jpg|thumb]] | ||
+ | [[Soubor:VYV-deska-AVR-ATmega16-55.jpg|thumb]] | ||
+ | [[Soubor:VYV-deska-AVR-ATmega16-56.jpg|thumb]] | ||
+ | [[Soubor:VYV-deska-AVR-ATmega16-57.jpg|thumb]] | ||
+ | [[Soubor:VYV-deska-AVR-ATmega16-58.jpg|thumb]] | ||
+ | [[Soubor:VYV-deska-AVR-ATmega16-59.jpg|thumb]] | ||
+ | [[Soubor:VYV-deska-AVR-ATmega16-60.jpg|thumb]] | ||
− | |||
==Na desce modulu je:== | ==Na desce modulu je:== | ||
− | * Mikrokontrolér: [[AVR]] ATMEGA16 16PU | + | [[Soubor:ATmega32-logo.jpg|120px|link=AVR|AVR]] |
+ | * Mikrokontrolér: [[AVR]] ATMEGA16 16PU (ATmega32) | ||
* Quartz rezonátor: 16MHz | * Quartz rezonátor: 16MHz | ||
* Tlačítko RESET | * Tlačítko RESET | ||
Řádka 32: | Řádka 46: | ||
* USB-RS232 - postaven na systému FR232RL | * USB-RS232 - postaven na systému FR232RL | ||
* Napájecí zdroj (usměrňovač most, filtr kapacitní, stabilizátor 7805 | * Napájecí zdroj (usměrňovač most, filtr kapacitní, stabilizátor 7805 | ||
− | * 132 podložky pro vlastní potřebu - univerzální deska: | + | * 132 podložky pro vlastní potřebu - univerzální deska: |
==Fotografie:== | ==Fotografie:== | ||
Řádka 52: | Řádka 66: | ||
− | + | == Postup: == | |
− | + | ||
− | + | ||
− | + | ||
− | 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. | * 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. | ||
Řádka 64: | Řádka 74: | ||
* K naprogramování mikroprocesoru, stiskněte tlačítko RESET | * K naprogramování mikroprocesoru, stiskněte tlačítko RESET | ||
− | + | <gallery> | |
− | + | Soubor:VYV50_ATmega-01.jpg|MegaLoad | |
− | + | Soubor:VYV50_ATmega-02.jpg|WIN správce zařízení | |
− | + | </gallery> | |
== www: == | == www: == | ||
Řádka 78: | Řádka 88: | ||
[[Soubor:html.jpg]] [http://www.microsyl.com/index.php/2010/03/30/megaload/ SW:MegaLoad] | [[Soubor:html.jpg]] [http://www.microsyl.com/index.php/2010/03/30/megaload/ SW:MegaLoad] | ||
+ | |||
+ | == Ukázkové programy:== | ||
+ | |||
+ | === Blikání LED === | ||
+ | |||
+ | [[Soubor:VYV50_blik.jpg|right|300px]] | ||
+ | |||
+ | <source lang"C"> | ||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
+ | === Řízení LED podle tlačítka 1 === | ||
+ | |||
+ | [[Soubor:VYV50_botton-led_.jpg|right|300px]] | ||
+ | |||
+ | <source lang"C"> | ||
+ | |||
+ | #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" | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | |||
+ | === Řízení LED podle tlačítka 2 === | ||
+ | |||
+ | [[Soubor:VYV50_push-led.jpg|right|300px]] | ||
+ | |||
+ | <source lang"C"> | ||
+ | |||
+ | #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 | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | zdroj informací: [http://mlab.taik.fi/paja/?p=433 Control LED by pressing button (using interrupts function in AVR)] | ||
+ | |||
+ | === Traffic Light === | ||
+ | |||
+ | [[Soubor:VYV50_LED_Traffic Light.jpg|right|300px]] | ||
+ | [[Soubor:VYV50_LED_Traffic Light2.jpg|right|200px]] | ||
+ | |||
+ | <source lang"C"> | ||
+ | #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); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | === Control bits=== | ||
+ | |||
+ | <source lang"C"> | ||
+ | * 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 | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | === How to use a display 1 === | ||
+ | |||
+ | <source lang"C"> | ||
+ | #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 | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | === How to use a display 2 === | ||
+ | |||
+ | [[Soubor:VYV50_1Digit_Display.jpg|right|300px]] | ||
+ | |||
+ | <source lang"C"> | ||
+ | #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í | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | === LED on PORTA === | ||
+ | |||
+ | [[Soubor:VYV50_LED_tab.jpg|right|300px]] | ||
+ | |||
+ | <source lang"C"> | ||
+ | #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]; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | === Test switch 1 === | ||
+ | |||
+ | [[Soubor:VYV50_Test_switch.jpg|right|300px]] | ||
+ | |||
+ | <source lang"C"> | ||
+ | #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 | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | === Stepper motor === | ||
+ | |||
+ | [[Soubor:VYV50_stepper.jpg|right|300px]] | ||
+ | |||
+ | <source lang"C"> | ||
+ | #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); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | [http://www.labcenter.com/products/vsm/avr.cfm info Proteus] | ||
+ | |||
+ | === Test switch 2 === | ||
+ | |||
+ | [[Soubor:VYV50_Test_switch_2.jpg|right|300px]] | ||
+ | |||
+ | <source lang"C"> | ||
+ | #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; | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | |||
+ | === Obsluha priférií - LED, 1 digit display === | ||
+ | |||
+ | [[Soubor:VYV50_CSI_LED_Display.jpg|right|300px]] | ||
+ | |||
+ | # LED diody budou řízeny pomocí poloviny brány A | ||
+ | # segmenty budou řízeny pomocí brány B | ||
+ | # zobrazovaná hodnota bude cyklicky narůstat v rozsahu 0-F (0-15) | ||
+ | # po dosažení maxima bude hodnota nulována a cyklus bude probíhat znovu | ||
+ | |||
+ | <source lang"C"> | ||
+ | |||
+ | * 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 | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | |||
+ | === Počítadlo impulsů === | ||
+ | |||
+ | [[Soubor:VYV50_pocitadlo_impulsů.jpg|right|300px]] [[Soubor:FTP.jpg]][ftp://obelix.sps-pi.cz/N/janousek/mikroLAB/87_VYV%20Vyvojove%20sestavy/VYV50%20AVR%20ATmega32/02_Po%E8itadlo%20by%20Jan%20Nov/D4_14_Novotny_pocitadlo_impulzu_ATmega32.hex Download hex] | ||
+ | |||
+ | <source lang"C"> | ||
+ | |||
+ | /* | ||
+ | * 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; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> |
Aktuální verze z 23. 4. 2013, 07:52
Univerzální modul je vhodný pro výuku programování mikroprocesorů ATMEL řady AVR řady.
Na desce modulu je:
- 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:
Prodej: Gotronik.pl Carpro.cz
Ukázkové programy:
Blikání LED
Řízení LED podle tlačítka 1
#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
#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
#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); } } }
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
- LED diody budou řízeny pomocí poloviny brány A
- segmenty budou řízeny pomocí brány B
- zobrazovaná hodnota bude cyklicky narůstat v rozsahu 0-F (0-15)
- 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: Soubor patrně chybí: /var/www/wiki.sps-pi.cz/www/images/2/27/VYV50_pocitadlo_impulsů.jpg
/* * 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; } }