Operácie

MiniMEXLE Hodiny na orientačný beh: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentDVPS (diskusia | príspevky)
StudentDVPS (diskusia | príspevky)
Riadok 109: Riadok 109:


<source lang="c">
<source lang="c">
/* A nezabudnite zdroják hojne komentovať  */


int main(void) {
 
   
/****************************************************************
    printf("Hello, World!\n");
File name - Zadanie_final.c
    return(0);
Compiler - WinAVR / AVR GCC
Author - David Lesko
*****************************************************************/
 
#include<avr/io.h>
#include<util/delay.h>
#include"lcd.h"
#include<avr/interrupt.h>
 
#define SET_BIT(PORT,BIT) ((PORT)|=(1<<BIT))
#define CLR_BIT(PORT,BIT) ((PORT)&=~(1<<BIT))
#define ENABLE 7
 
#define PC_PORT PORTC
#define PC_PIN1 0
#define PC_PIN2 1
#define bit(m) ((1<<m))
#define bit_get(p,m) ((p) & bit(m))
#define MIN_PER 100
#define MAX_PER 255
#define WAIT_TIME 2000
 
 
#define PIN(x) (*(&x - 2))
 
bool sw1 = 0;
bool sw2 = 0;
int s=0,secondss=0;
 
static volatile seconds,minutes;
 
void readButtons(void); // Nacitanie stavu tlacidiel
void inkrement(void); // Inkrementacia sekundy
void sekundy(void); // Seconds function
void minuty(void); // Minutes function
void short_beep(void); // Short beep function
void long_beep(void); // Long beep function
 
void short_beep(void)
{
int i=0;
 
for(i=0;i<=800;i++)
{
PORTD |= 0x20;
_delay_us(300);
PORTD &= 0xDF;
_delay_us(300);
}
}
 
ISR(TIMER1_COMPA_vect)
{
inkrement();
}
 
void inkrement(void)
{
if(seconds!=60)
{
seconds++;
}
else
{
minutes++;
seconds = 0;
}
TCNT1=0; // Reset TIMER1
}
 
 
 
 
void sekundy(void)
{
switch(seconds)
{
case 0:
lcd_gotoxy(1,14);
lcd_putstr(" ");
break;
case 3:
short_beep();
break;
case 55:
lcd_gotoxy(1,14);
lcd_putstr("55");
break;
case 56:
lcd_gotoxy(1,14);
lcd_putstr("56");
break;
case 57:
lcd_gotoxy(1,14);
lcd_putstr("57");
break;
case 58:
lcd_gotoxy(1,14);
lcd_putstr("58");
break;
case 59:
lcd_gotoxy(1,14);
lcd_putstr("59");
break;
}
 
}
 
void minuty(void)
{
switch(minutes)
{
case 0:
lcd_gotoxy(1,9);
lcd_putstr("00");
break;
case 1:
lcd_gotoxy(1,9);
lcd_putstr("01");
break;
case 2:
lcd_gotoxy(1,9);
lcd_putstr("02");
break;
case 3:
lcd_gotoxy(1,9);
lcd_putstr("03");
break;
case 4:
lcd_gotoxy(1,9);
lcd_putstr("04");
break;
case 5:
lcd_gotoxy(1,9);
lcd_putstr("05");
break;
case 6:
lcd_gotoxy(1,9);
lcd_putstr("06");
break;
case 7:
lcd_gotoxy(1,9);
lcd_putstr("07");
break;
case 8:
lcd_gotoxy(1,9);
lcd_putstr("08");
break;
}
 
}
 
void readButtons(void)
{
CLR_BIT(PORTD,ENABLE);
DDRC = DDRC & 0xf0;
PORTC = 0x0f;
 
_delay_us(10);
 
sw1 = !bit_get(PIN(PC_PORT),PC_PIN1);
_delay_ms(10);
sw2 = !bit_get(PIN(PC_PORT),PC_PIN2);
_delay_ms(10);
 
DDRC = DDRC|0x0f;
}
}
int main()
{
int tl=0;
lcd_init(); // Inicializacia displeja
LCD_initialise();
lcd_gotoxy(1,9);
lcd_putstr("--");
DDRD |= (1<<DDD5); // Initialisation of Buzzer
TCCR1A = 0; // Normal Mode Timer1
TCCR1B = (1<<CS12)|(1<<CS10); // Prescaler 1024
TCNT1 = 0; // Start count from 0
OCR1A = 15625; // 1 second
TIFR1 = (1<<OCF1A); // Clear Pending Interrupt
TIMSK1 = 0; // Disable Compare A Interrupt
sei();
while(1) // loop forever
{
lcd_gotoxy(0,0);
    lcd_putstr(" O");
readButtons();
if(sw1 && tl==0){
tl=1; // Osetrenie zdvojeneho stlacenia SW1
TCNT1 = 0;
TIMSK1 = (1<<OCIE1A); // Enable Compare A Interrupt
}
else if(sw2 && tl==1)
{
lcd_gotoxy(1,9);
lcd_putstr("--");
tl=0; // Osetrenie zdvojeneho stlacenia SW2
TCNT1 = 0; // Reset Timer
TIMSK1 = 0; // Disable Compare A Interrupt
seconds = 0; // Reset sekund
minutes = 0; // Reset minut
sekundy();
}
else if(tl==1)
{
sekundy();
minuty();
}
}
}
</source>
</source>



Verzia z 21:24, 10. január 2014

Autori: Bc.Dávid Leško, Bc.Vladimír Biath
Študijný odbor: Aplikovaná mechatronika 2. Ing. (2013)

Zadanie

LCD displej na doske MiniMEXLE treba pripojiť k mikroprocesoru a naprogramovať tak, aby po zapnutí odpočítaval minúty nasledujúce po štarte, pričom posledných 5 sekúnd pred každou celou minútou odpípa. Posledné pípnutie bude dlhšie a bude sprevádzané inkrementovaním čísla na displeji. Pred časom 00 bude displej zobrazovať pripravenosť symbolmi --.

K zapojeniu treba vypracovať dokumentáciu, popis programu, schému zapojenia displeja a riadiacej jednotky. Ako bonus doplňte riadenie intenzity displeja na základe vonkajšieho osvetlenia.

Vývojová doska MiniMEXLE.


Literatúra:


Analýza - hardware

MiniMexle:

- Microcontroller ATmega48/88 (pre naše riešenie sme použili Microcontroller ATmega328P programované cez USB rozhranie)

- Display DEM16216, 2x16 LCD-Display,

- 4 push buttons

- Analógové rozhranie : 2 A/D a 2 D/A kanály

Hardware MiniMexle:

Na obrázku nižšie sú označené jednotlivé prvky dosky MiniMexle:

Doska MiniMEXLE

Display:

Na zobrazovanie odpočítavania času sme použili display s označením DEM16216, ktorý pozostáva z 2 x 16 znakového displeja.
- 16 pin konektor pre pripojenie k doske MiniMexle

Display DEM16216, 2x16


Write mode Display16216:

Write mode DEM16216

Read mode Display16216:

Read mode DEM16216


  • bližšie informácie k displeju viď literatúra

Popis riešenia

Bloková schéma

  • blokova schema dosky MiniMexle
Bloková schéma


Užívateľské rozhranie:

  • x16 LCD displej s podsvietením

(Spojený 4 bity)
(RS: Data / Control)
(E = 1: Enable Display)
(R premenná: Kontrast)

  • 4 tlačidlá pripojená na rovnaké piny ako LCD displej

(E = 0: Read buttons)
(Port μC obojsmerný)

Užívateľské rozhranie


Programovateľné rozhranie

  • SPI Interface

(Serial Peripheral Interface) to programmer (PROGI)
(programming active for RESET = 0)

  • Visual interface by LED3
  • SPI signal names:

MISO = Master IN, Slave OUT
MOSI = Master OUT, Slave IN
SCLK = Serial Clock
SS = Slave Select

Programming Interface


Algoritmus a program

Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili. Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu. Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.

Vyberte podstatné časti zdrojového kódu, použite na to prostredie source:

/****************************************************************
File name - Zadanie_final.c 
Compiler - WinAVR / AVR GCC
Author - David Lesko
*****************************************************************/

#include<avr/io.h>
#include<util/delay.h>
#include"lcd.h"
#include<avr/interrupt.h>

#define SET_BIT(PORT,BIT) ((PORT)|=(1<<BIT))
#define CLR_BIT(PORT,BIT) ((PORT)&=~(1<<BIT))
#define ENABLE	7

#define PC_PORT		PORTC
#define PC_PIN1		0
#define PC_PIN2		1
#define bit(m)			((1<<m))
#define bit_get(p,m)	((p) & bit(m))
#define MIN_PER	100
#define MAX_PER	255
#define WAIT_TIME	2000


#define PIN(x)			(*(&x - 2))

bool	sw1 = 0;
bool	sw2 = 0;
int	s=0,secondss=0;

static volatile seconds,minutes;

void readButtons(void);		// Nacitanie stavu tlacidiel
void inkrement(void);		// Inkrementacia sekundy
void sekundy(void);			// Seconds function
void minuty(void);			// Minutes function
void short_beep(void);		// Short beep function
void long_beep(void);		// Long beep function

void short_beep(void)
{
	int	i=0;

	for(i=0;i<=800;i++)
	{
		PORTD |= 0x20;
		_delay_us(300);
		PORTD &= 0xDF;
		_delay_us(300); 
	}
}

ISR(TIMER1_COMPA_vect)
{
	inkrement();
}

void inkrement(void)
{
	if(seconds!=60)
	{
		seconds++;
	}
	else
	{
		minutes++;
		seconds = 0;
	}
	TCNT1=0;		// Reset TIMER1
}




void sekundy(void)
{
	switch(seconds)
		{	
			case 0:
			lcd_gotoxy(1,14);
			lcd_putstr("  ");
			break;
			case 3:
			short_beep();
			break;
			case 55:
			lcd_gotoxy(1,14);
			lcd_putstr("55");
			break;
			case 56:
			lcd_gotoxy(1,14);
			lcd_putstr("56");
			break;
			case 57:
			lcd_gotoxy(1,14);
			lcd_putstr("57");
			break;
			case 58:
			lcd_gotoxy(1,14);
			lcd_putstr("58");
			break;
			case 59:
			lcd_gotoxy(1,14);
			lcd_putstr("59");
			break;
		}	

}

void minuty(void)
{
	switch(minutes)
		{	
			case 0:
			lcd_gotoxy(1,9);
			lcd_putstr("00");
			break;
			case 1:
			lcd_gotoxy(1,9);
			lcd_putstr("01");
			break;
			case 2:
			lcd_gotoxy(1,9);
			lcd_putstr("02");
			break;
			case 3:
			lcd_gotoxy(1,9);
			lcd_putstr("03");
			break;
			case 4:
			lcd_gotoxy(1,9);
			lcd_putstr("04");
			break;
			case 5:
			lcd_gotoxy(1,9);
			lcd_putstr("05");
			break;
			case 6:
			lcd_gotoxy(1,9);
			lcd_putstr("06");
			break;
			case 7:
			lcd_gotoxy(1,9);
			lcd_putstr("07");
			break;
			case 8:
			lcd_gotoxy(1,9);
			lcd_putstr("08");
			break;
		}	

}

void readButtons(void)
{
	CLR_BIT(PORTD,ENABLE);
	DDRC = DDRC & 0xf0;
	PORTC = 0x0f;

	_delay_us(10);

	sw1 = !bit_get(PIN(PC_PORT),PC_PIN1);
	_delay_ms(10);
	
	sw2 = !bit_get(PIN(PC_PORT),PC_PIN2);
	_delay_ms(10);	

	DDRC = DDRC|0x0f;
}



int	main()
{
	int	tl=0;

	lcd_init();				// Inicializacia displeja
	LCD_initialise();

	lcd_gotoxy(1,9);
	lcd_putstr("--");

	DDRD |= (1<<DDD5);		// Initialisation of Buzzer

	TCCR1A = 0;				// Normal Mode Timer1
	TCCR1B = (1<<CS12)|(1<<CS10);	// Prescaler 1024
	TCNT1 = 0;				// Start count from 0
	OCR1A = 15625;			// 1 second

	TIFR1 = (1<<OCF1A);		// Clear Pending Interrupt
	TIMSK1 = 0;				// Disable Compare A Interrupt



	sei();
	



	while(1) // loop forever
	{

		lcd_gotoxy(0,0);
	    lcd_putstr(" O");
		readButtons();

		if(sw1 && tl==0){
			tl=1;			// Osetrenie zdvojeneho stlacenia SW1
			TCNT1 = 0;
			TIMSK1 = (1<<OCIE1A);	// Enable Compare A Interrupt
		}
		else if(sw2 && tl==1)
		{
			lcd_gotoxy(1,9);
			lcd_putstr("--");
			tl=0;			// Osetrenie zdvojeneho stlacenia SW2
			TCNT1 = 0;		// Reset Timer
			TIMSK1 = 0;		// Disable Compare A Interrupt
			seconds = 0;	// Reset sekund
			minutes = 0;	// Reset minut
			sekundy();
		}
		else if(tl==1)
		{
		sekundy();
		minuty();
		}
	}
}

Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!

Zdrojový kód: serial.h a main.c

program.c

Overenie

Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí, ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje). Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji, odfotografujte ho.


Médiá:MojSubor.pdf



Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.