Ismételten egy vizuális effekt. Kivezérlésjelzőt már mindenki látott. Ám a valóságban kevés olyan van, amiben lenne látványos és hasznos funkció, pl. peak-hold.
Az áramkör nagyon egyszerű. Igazából, aki megépítette a hőmérőt annak szinte semmin nem kell módosítani.
![](/cikkek/files/236/kivez_sch_kicsi.gif)
Kattints a képre, a nagyobb mérethez!
Megépítve:
![](/cikkek/files/236/kivez.jpg)
Majd, működés közben:
A videó megtekintéséhez Flash lejátszó szükséges!
A zene itt, egyik fejleszésemről szól, mp3. A kivezérlésjelzőhöz nem tartozik szervesen.
A kód igazából egy kis ötlet adó. Komolyabb animációk számolások, stb. Erre is van lehetőség, de ezeket most idő hiányában nem ismertetném.
#include <avr/io.h>
#include <util/delay.h>
#include <math.h>
#define MR PB3
#define ST_CP PB1
#define SH_CP PB2
#define SD PB0
#define STROBE_SH_CP() PORTB |= (1<<SH_CP);PORTB &= ~(1<<SH_CP)
#define STROBE_ST_CP() PORTB |= (1<<ST_CP);PORTB &= ~(1<<ST_CP)
#define STROBE_MR() PORTB &= ~(1<<MR);PORTB |= (1<<MR)
#define SD_HIGH() PORTB |= (1<<SD)
#define SD_LOW() PORTB &= ~(1<<SD)
unsigned short m_abs(signed short v1) {
if(v1<0) return -v1;
return v1;
}
//-------------------------------------
void m_delay_10ms(unsigned short val) {
//-------------------------------------
while(val--) _delay_ms(10);
}
//-------------------------------------
void SendByte(unsigned char data) {
//-------------------------------------
unsigned char i;
i = 7;
do {
if(data & (1<<i)) SD_HIGH(); else SD_LOW();
STROBE_SH_CP();
} while (i--);
}
//-------------------------------------
short GenerateBar(unsigned char value,unsigned char peak) {
//-------------------------------------
unsigned short result;
unsigned char i;
result = 0;
for(i=0;i<16;i++) {
if(value>i) result |= (1<<i);
}
result |= (1<<peak);
return result;
}
//-------------------------------------
void init() {
//-------------------------------------
DDRB = (1<<MR)|(1<<ST_CP)|(1<<SH_CP)|(1<<SD); //kimenetek
//Init ADC
ADMUX = 0x00;
ADCSRA = (1<<ADEN)
| (0<<ADATE)
| (0<<ADSC)
| (1<<ADPS2)
| (1<<ADPS1)
| (1<<ADPS0)
;
}
//-------------------------------------
unsigned short ADConvert(unsigned char channel) {
//-------------------------------------
ADMUX &= ~(1<<MUX1|1<<MUX0);
ADMUX |= channel;
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
return ADC;
}
//-------------------------------------
int main(void) {
//-------------------------------------
unsigned short data;
unsigned short adc, counter,counter_peak;
unsigned short peak_hold,adc_c;
init();
peak_hold = 0;
adc_c = 0;
counter = 0;
counter_peak = 0;
for(;;) {
if(counter) counter--;
adc = ADConvert(2);
if(adc>256) adc -= 256;
adc >>= 5;
if(adc>adc_c) adc_c = adc;
if(adc>peak_hold) peak_hold = adc;
if(counter==0) {
counter = 100;
data = GenerateBar(adc_c,peak_hold);
STROBE_MR();
SendByte(data>>8);
SendByte(data);
STROBE_ST_CP();
if(adc_c)adc_c--;
}
if(counter_peak==0) {
counter_peak = 800;
if(peak_hold)peak_hold--;
}
if(counter_peak)counter_peak--;
}
}
A cikk még nem ért véget, lapozz!
Értékeléshez bejelentkezés szükséges!