Vývojová deska ATMEL včetně AVR ATmega16 v2: Porovnání verzí
Skočit na navigaci
Skočit na vyhledávání
Bez shrnutí editace |
|||
(Není zobrazeno 5 mezilehlých verzí od stejného uživatele.) | |||
Řádek 20: | Řádek 20: | ||
==Na desce modulu je:== | ==Na desce modulu je:== | ||
[[Soubor:ATmega32-logo.jpg|120px|link=AVR|AVR]] | [[Soubor:ATmega32-logo.jpg|120px|link=AVR|AVR]] | ||
* Mikrokontrolér: [[AVR]] ATMEGA16 16PU | * Mikrokontrolér: [[AVR]] ATMEGA16 16PU (ATmega32) | ||
* Quartz rezonátor: 16MHz | * Quartz rezonátor: 16MHz | ||
* Tlačítko RESET | * Tlačítko RESET | ||
Řádek 46: | Řádek 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:== | ||
Řádek 100: | Řádek 100: | ||
=== Řízení LED podle tlačítka === | === Ří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]] | [[Soubor:VYV50_push-led.jpg|right|300px]] | ||
Řádek 113: | Řádek 143: | ||
void delay(int); | void delay(int); | ||
int main() { | int main() | ||
{ | |||
DDRB = (1<<PB5); | DDRB = (1<<PB5); // put PortB bit 5 as output | ||
GIMSK |= (1<<INT0); // Enable INT0 External Interrupt | GIMSK |= (1<<INT0); // Enable INT0 External Interrupt | ||
MCUCR |= (1<<ISC01); | MCUCR |= (1<<ISC01); // Falling-Edge Triggered INT0 | ||
sei(); // Enable Interrupts | sei(); // Enable Interrupts | ||
for(;;){ | for(;;){ // nothing happens. | ||
} | |||
} | } | ||
SIGNAL(SIG_INTERRUPT0) | |||
{ | |||
SIGNAL(SIG_INTERRUPT0) { | |||
// this function is called when INT0 bit (PD2) is interrupted. | // this function is called when INT0 bit (PD2) is interrupted. | ||
Řádek 135: | Řádek 165: | ||
// While Button is pressed, LED is on | // While Button is pressed, LED is on | ||
PORTB |= (1<<PB5); // Put PortB bit 5 HIGH | 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 | |||
} | |||
} | } | ||
void delay( | </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> | </source> | ||
=== Počítadlo impulsů === | === Počítadlo impulsů === |
Aktuální verze z 23. 4. 2013, 05: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
-
MegaLoad
-
WIN správce zařízení
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ů
/*
* 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;
}
}