Uživatel:Veselon5

Z MAM wiki

Přejít na: navigace, hledání

Ondřej Veselý,

předmět MAM, cvičení ČT 9:15 (místnosto 362)


Obsah

[editovat] Semestrální práce

Téma

Wattmetr pro domácí solární elektrárnu, více informací na stránkách kolegy, se kteryým tuto semetrální práci realizuji. Jiří Polanský [1]


Programovací jazyk - Bascom

Pro programování jsme vybírali i vhodný jazyk. Asembler je pro naše účely nevhodný, bylo by nutné vše začít od nuly - to v našem případě není zapotřebí. Program v jazyku C by byl již více efektivní, existuje spoustu knihoven, které by práci velmi usnadnlili. Pro Atmel AVR ovšem existuje další programovací jazyk - BASCOM. Tento progr. jazyk je volně dostupný s jistým omezením velikosti výsledného programu.

Oproti jazyku C není objektově orientovaný, umí také volání rutin a funkcí, ale nejdůležitější je velké množství příkazů, které velmi usnadňují práci s periferiemi a jednotlivými částmi kontroléru. Obsahuje již v základu neskutečné množství podporovaných periférií, které se v kódu inicializují a dále se zachází pouze s funkcemi této periferie.

Ukázka z části kódu s praktickými příklady


% Konfigurace vstupu
Int_tlac Alias Portd.2
Config Int_tlac = Input

% Deklarace proměných
Dim Flag_a As Word
Dim _sec0 As Byte
Dim Pacs As String * 7 

% Inicializace přerušení čítače 1
Config Int0 = Rising
Load Timer1 , Timer1reload
Enable Interrupts
On Ovf1 Timer1_isr
Enable Timer1
Start Timer1

V první části je ukázka konfigurace pinu, první přádek přiřadí pod název "Int_tlac" PordD, bit 2. Druhý příkaz jej nastaví jako vstup. Konfigurace pull-up rezistorů je defaultně zapnutá, lze jej ale vypnout.

Druhý blok kódu obsahuje deklataci proměných. V ukázce jsou 3 typy, "WORD", které deklaruje dvoubajtové číslo bez znaménka (0-65535). Dále "BYTE", jednobajtové číslo 0 až 255 a jako poslední "STRING*7". Jedná se o proměnnou pro uložení textu, v tomto případě o velikosti 7 znaků.

V poslední části kódu je ukázka inicializace úřerušení od čítače. Je definovát typ čítání (rising = vzestupně), hodnota "Timer1reload", do které bude čítač čítat, než dojde k přetečení. Lze definovat také předdělička. Poté dojde k povolení přerušení, definici procedury "Timer1_isr", která se zavolá při přetečení. Poté povolení čítače a jeho start. Vše velmi jednoduché, ovšem účinné.

Pokračování příště

[editovat] Čtení maticové klávesnice

Inicializace


.include "m168def.inc"
//EQU
.equ bit0 =0
.equ bit1 =1
.equ bit2 =2
.equ bit3 =3
.equ bit4 =4
.equ bit5 =5
.equ bit6 =6
.equ bit7 =7

// MATICOVA KLAVESNICE

.equ col= portd
.equ row= portc

// nastaveni vystupu - sloupcu matice
sbi ddrd,bit0
sbi portd,bit0
sbi ddrd,bit1
sbi portd,bit1
sbi ddrd,bit2
sbi portd,bit2
sbi ddrd,bit3
sbi portd,bit3

// nastaveni vstupu - radku matice
sbi portc,bit0
sbi portc,bit1
sbi portc,bit2
sbi portc,bit3

Podprogram

- podprogram nahraje do registru R20 zmáčknuté číslo

- pokud není žádná klávesa stisknutá, registr zůstává bezezměn


klavesnice:
// prvni sloupec

	cbi portd,bit0
	call VERYSMALLWAIT
	
	sbis pinc,bit0	
	LDI r20,1

	sbis pinc,bit1
	ldi r20,4

	sbis pinc,bit2
	ldi r20,7

	sbis pinc,bit3
	ldi r20,10

	sbi portd,bit0

// druhy sloupec

	cbi portd,bit1
	call VERYSMALLWAIT
	
	sbis pinc,bit0	
	LDI r20,2

	sbis pinc,bit1
	ldi r20,5

	sbis pinc,bit2
	ldi r20,8

	sbis pinc,bit3
	ldi r20,0

	sbi portd,bit1

// treti sloupec

	cbi portd,bit2
	call VERYSMALLWAIT
	
	sbis pinc,bit0	
	LDI r20,3

	sbis pinc,bit1
	ldi r20,6

	sbis pinc,bit2
	ldi r20,9

	sbis pinc,bit3
	ldi r20,11

	sbi portd,bit2

// ctvrty sloupec

	cbi portd,bit3
	call VERYSMALLWAIT
	
	sbis pinc,bit0	
	LDI r20,12

	sbis pinc,bit1
	ldi r20,13

	sbis pinc,bit2
	ldi r20,14

	sbis pinc,bit3
	ldi r20,15

	sbi portd,bit3

	ret

[editovat] Kreslení na osciloskop

Kreslení obrázků na Osciloskop, dělič napětí odpory 1k a 2k mezi piny portB,1 a portB,0. Na vystup z delice pripojit osu X. To same pro osu Y na piny portB,5 a portB,4.

Pro vykreslení přechodů dejte na výstup děliče kondenzátor na zem, my jsme použili velikost 1n2 F.

Soubor:Schema2.jpg‎


Pro zobrazení odkomentujdte hodnoty pole x[]. Moznosti jsou vykresleni motylka, dvojteho W a domecku jednim tahem :-)

#include <avr/io.h> // zde je definovan napr. PORTB
#include <avr/iom168.h> // konstanty pro konkretni typ mikrokontroleru
#include <util/delay.h> // toto potrebuji pro pouziti funkce _delay_ms()

int main (void){ // hlavni funkce programu
  
  /* init */
  DDRB=0xFF; // Data Direction Register PORTB: kazda nozicka bude vystup

  //motylek
  //int x[] = {0x00,0x11,0x12,0x03,0x33,0x22,0x21,0x30};

  //dvojte w
  //int x[] = {0x30,0x00,0x11,0x12,0x03,0x33,0x03,0x12,0x11,0x00};
  
  //domecek
  int x[] = {0x00,0x02,0x20,0x22,0x31,0x20,0x00,0x22,0x02};

  /* hlavni smycka */
  while(1){ // nekonecna smycka
	int i;
	for (i=0;i<sizeof(x)/sizeof(x[0]);i++){
            PORTB=x[i]; // vystup na nozicky portu B
	} //konec for
  } // konec nekonecne smycky
} // konec main

Ukázka:

Soubor:osc.jpg

[editovat] Detektor světla

Dioda je připojena v závěrném směru na GND a PORTB, pin0. Výstup impulzů je na PORTC, pin0. Možno pozorovat na osciloskopu nebo připojit reproduktorek. Výsledná frekvence v místnosti cca 100 Hz. Po zakrytí se velmi zmenší, při osvětlení naopak :-)


/* main.c */
#include <avr/io.h> // zde je definovan napr. PORTB
#include <avr/iom168.h> // konstanty pro konkretni typ mikrokontroleru
#include <util/delay.h> // toto potrebuji pro pouziti funkce _delay_ms()

#define led_k 0b00000001;
#define led_a 0b00000010;

int main (void){ // hlavni funkce programu
  unsigned char a=0; // pomocna promenna
  
  volatile int tma;  
	
	DDRC=1;
  /* hlavni smycka */
  while(1){ // nekonecna smycka
	
	tma=0; 
	DDRB=1; //port b, pin 0 jako vystup
	PORTB=1; //nabiti kapacity led
	_delay_ms(1); // pockam na nabiti

	DDRB = 0; //port b, pin 1 jako vstup
	PORTB=0; // pull up vypnout
	PORTC=1; // generovani pulzu
	while(PINB & 1){ // pockam, dokud se kapacita nevybije
		
		tma ++; // pricitam tmu
	
	}
	PORTC=0; //konec pulzu



  } // konec nekonecne smycky
} // konec main


Osobní nástroje