Zdrojový kód v C pro VU metr

7. června 2010 v 11:15 | Petr Hawliczek "Hawelson" |  SVĚTLO

/*
MCU: ATmega8, ATmega8L
Program pro stereo VU metr 2x32 LED
Program napsal Petr Hawliczek
Vytvořeno pro web: http://HAWELSON.blog.cz/
*/
//********************************************
#define F_CPU 1000000UL // NASTAVENÍ VNITŘNÍHO OSCILÁTORU NA 1MHz (defaultní)
#include <avr/io.h>
#include <util/delay.h>

//********************************************

void cekani(); // podprogram rychle nastavitelneho cekani (delka bliknuti LED)

unsigned char a; // proměnná do které se bude ukládat hodnota z A/D převodníku
// je typu char, tedy 256 hodnot

char b=0; // konstanta posunu pro potlační šumu
// (posun od nuly, aby neblikaly LED bez sign.)
//********************************************

void main()
{

DDRB = 0xFF; // inicializace portů
DDRC = 0b11111100;
DDRD = 0xFF;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;


//********************************************



while (1) { // nekonečná smyška vykreslování


// Levý kanál

// Nastavení A/D převodníku -->

ADMUX = 0x00; // ozkačení z kterého kanálu chceme brát (kanál 0)
ADMUX = ADMUX | 0b11000000; // aktivace REFS0 a 1
//(Internal 2,56V reference with external capacitor at AREF pin)
ADMUX = ADMUX | 0x20; // aktovace ADLAR: ADC Left Adjust Result

ADCSRA = 0x00; // volba nejrychlejšího A/D převodu krystal/2
ADCSRA = ADCSRA | 0x80; // zapnutí A/D převodníku


//Přečtení hodnoty z A/D převodníku -->

ADCSRA = ADCSRA | 0x40; // start převodu

while( (ADCSRA & 0x10) == 0); // počká až je připravená hodnota z A/D (pak se tato hodnota dostane do 0)

a = ADCH; // převede se hodnota z A/D do proměnné a
ADCSRA = ADCSRA | 0x10; // vymaže, že je hodnota připravená - pro další nové měření


//---------------------------------------------
// podrprogram pro rozsvěcení led umístěn zde -->


if (a <= b+0 ) { // 0 LED
// spodní část LED
PORTB=0b00010000; // všechny LED zhasnuty
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b00000000;
cekani();
// horní část LED
PORTB=0b00100000;
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b00000000;
cekani();
}

else if (a <= b+1 ) { // 1 LED
// spodní část LED
PORTB=0b00010010; // první LED rozsvícena ve spodní části
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b00000000;
cekani();
// horní část LED
PORTB=0b00100000;
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b00000000;
cekani();
}

else if (a <= b+2) { // 2 LED
// spodní část LED
// spodní část LED
PORTB=0b00010010; // první LED rozsvícena ve spodní části
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b00000000;
cekani();
// horní část LED
PORTB=0b00100010; // první LED rozsvícena ve spodní části
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b00000000;
cekani();
}


else if (a <= b+3) { // 3 LED
// spodní část LED
PORTB=0b00010011; // celková třetí LED rozsvícena
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b00000000;
cekani();
// horní část LED
PORTB=0b00100010; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b00000000;
cekani();
}

else if (a <= b+4) { // 4 LED
// spodní část LED
PORTB=0b00010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b00000000;
cekani();
// horní část LED
PORTB=0b00100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b00000000;
cekani();
}

else if (a <= b+5) { //
// spodní část LED
PORTB=0b00010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b10000000;
cekani();
// horní část LED
PORTB=0b00100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b00000000;
cekani();
}

else if (a <= b+6) { //
// spodní část LED
PORTB=0b00010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b10000000;
cekani();
// horní část LED
PORTB=0b00100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b10000000;
cekani();
}
else if (a <= b+7) { //
// spodní část LED
PORTB=0b00010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11000000;
cekani();
// horní část LED
PORTB=0b00100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b10000000;
cekani();
}

else if (a <= b+8) { //
// spodní část LED
PORTB=0b00010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11000000;
cekani();
// horní část LED
PORTB=0b00100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11000000;
cekani();
}

else if (a <= b+9) { //
// spodní část LED
PORTB=0b00010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11100000;
cekani();
// horní část LED
PORTB=0b00100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11000000;
cekani();
}

else if (a <= b+10) { // 10 LED
// spodní část LED
PORTB=0b00010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11100000;
cekani();
// horní část LED
PORTB=0b00100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11100000;
cekani();
}

else if (a <= b+12) { //
// spodní část LED
PORTB=0b10010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11100000;
cekani();
// horní část LED
PORTB=0b00100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11100000;
cekani();
}


else if (a <= b+14) { //
// spodní část LED
PORTB=0b10010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11100000;
cekani();
// horní část LED
PORTB=0b10100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11100000;
cekani();
}

else if (a <= b+16) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11100000;
cekani();
// horní část LED
PORTB=0b10100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11100000;
cekani();
}

else if (a <= b+18) { //
PORTB=0b11010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11100000;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11100000;
cekani();
}

else if (a <= b+20) { // 15 LED
// spodní část LED
PORTB=0b11010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11110000;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11100000;
cekani();
}

else if (a <= b+23) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11110000;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11110000;
cekani();
}

else if (a <= b+26) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111000;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11110000;
cekani();
}

else if (a <= b+29) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111000;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111000;
cekani();
}

else if (a <= b+32) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111100;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111000;
cekani();
}

else if (a <= b+36) { // 20 LED
// spodní část LED
PORTB=0b11010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111100;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111100;
cekani();
}

else if (a <= b+40) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111110;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111100;
cekani();
}

else if (a <= b+44) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111110;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111110;
cekani();
}

else if (a <= b+48) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111110;
cekani();
}

else if (a <= b+52) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+57) { // 25 LED
// spodní část LED
PORTB=0b11010011;
PORTC=0b00100000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+62) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00100000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00100000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+67) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00110000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00100000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+73) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00110000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00110000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+79) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00111000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00110000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+86) { // 30 LED
// spodní část LED
PORTB=0b11010011;
PORTC=0b00111000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00111000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+93) { //
// spodní část LED
PORTB=0b11010011;
PORTC=0b00111100; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00111000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else { // 32 LED (2x 16 LED)
// spodní část LED
PORTB=0b11010011;
PORTC=0b00111100; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11100011; //
PORTC=0b00111100; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

// Na konci nastavení nul, aby LED nesvítily v čase měření A/D převodníkem

PORTB=0x00; //
PORTC=0x00; // spodní část LED aktivní
PORTD=0x00;




// ---------------------------------------------------------------
// ---------------------------------------------------------------
// ****************************************************

// Pravý kanál -->

// Nastavení A/D převodníku -->

ADMUX = 0x01; // ozkačení z kterého kanálu chceme brát (kanál 1)
ADMUX = ADMUX | 0b11000000; // aktivace REFS0 a 1
//(Internal 2,56V reference with external capacitor at AREF pin)
ADMUX = ADMUX | 0x20; // aktovace ADLAR: ADC Left Adjust Result

ADCSRA = 0x00; // volba nejrychlejšího A/D převodu krystal/2
ADCSRA = ADCSRA | 0x80; // zapmutí A/D ppřevodníku


//Přečtení hodnoty z A/D převodníku -->

ADCSRA = ADCSRA | 0x40; // start převodu

while( (ADCSRA & 0x10) == 0); // počká až je připravená hodnota z A/D (pak se tato hodnota dostane do 0)

a = ADCH; // převede se hodnota z A/D do proměnné a
ADCSRA = ADCSRA | 0x10; // vymaže, že je hodnota připravená - pro další nové měření


//--------------------------------------------------------------
// podrprogram pro rozsvěcení led umístěn zde -->


if (a <= b+0) { // 0 LED
// spodní část LED
PORTB=0b00000100; // všechny LED zhasnuty
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b00000000;
cekani();
// horní část LED
PORTB=0b00001000;
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b00000000;
cekani();
}

else if (a <= b+1) { // 1 LED
// spodní část LED
PORTB=0b00000110; // první LED rozsvícena ve spodní části
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b00000000;
cekani();
// horní část LED
PORTB=0b00001000;
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b00000000;
cekani();
}

else if (a <= b+2) { // 2 LED
// spodní část LED
// spodní část LED
PORTB=0b00000110; // první LED rozsvícena ve spodní části
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b00000000;
cekani();
// horní část LED
PORTB=0b00001010; // první LED rozsvícena ve spodní části
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b00000000;
cekani();
}


else if (a <= b+3) { // 3 LED
// spodní část LED
PORTB=0b00000111; // celková třetí LED rozsvícena
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b00000000;
cekani();
// horní část LED
PORTB=0b00001010; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b00000000;
cekani();
}

else if (a <= b+4) { // 4 LED
// spodní část LED
PORTB=0b00000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b00000000;
cekani();
// horní část LED
PORTB=0b00001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b00000000;
cekani();
}

else if (a <= b+5) { //
// spodní část LED
PORTB=0b00000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b10000000;
cekani();
// horní část LED
PORTB=0b00001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b00000000;
cekani();
}

else if (a <= b+6) { //
// spodní část LED
PORTB=0b00000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b10000000;
cekani();
// horní část LED
PORTB=0b00001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b10000000;
cekani();
}
else if (a <= b+7) { //
// spodní část LED
PORTB=0b00000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11000000;
cekani();
// horní část LED
PORTB=0b00001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b10000000;
cekani();
}

else if (a <= b+8) { //
// spodní část LED
PORTB=0b00000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11000000;
cekani();
// horní část LED
PORTB=0b00001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11000000;
cekani();
}

else if (a <= b+9) { //
// spodní část LED
PORTB=0b00000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11100000;
cekani();
// horní část LED
PORTB=0b00001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11000000;
cekani();
}

else if (a <= b+10) { // 10 LED
// spodní část LED
PORTB=0b00000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11100000;
cekani();
// horní část LED
PORTB=0b00001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11100000;
cekani();
}

else if (a <= b+12) { //
// spodní část LED
PORTB=0b10000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11100000;
cekani();
// horní část LED
PORTB=0b00001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11100000;
cekani();
}

else if (a <= b+14) { //
// spodní část LED
PORTB=0b10000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11100000;
cekani();
// horní část LED
PORTB=0b10001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11100000;
cekani();
}

else if (a <= b+16) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11100000;
cekani();
// horní část LED
PORTB=0b10001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11100000;
cekani();
}

else if (a <= b+18) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11100000;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11100000;
cekani();
}

else if (a <= b+20) { // 15 LED
// spodní část LED
PORTB=0b11000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11110000;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11100000;
cekani();
}

else if (a <= b+23) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11110000;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11110000;
cekani();
}

else if (a <= b+26) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111000;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11110000;
cekani();
}

else if (a <= b+29) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111000;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111000;
cekani();
}

else if (a <= b+32) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111100;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111000;
cekani();
}

else if (a <= b+36) { // 20 LED
// spodní část LED
PORTB=0b11000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111100;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111100;
cekani();
}

else if (a <= b+40) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111110;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111100;
cekani();
}

else if (a <= b+44) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111110;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111110;
cekani();
}

else if (a <= b+48) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111110;
cekani();
}

else if (a <= b+52) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00000000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+57) { // 25 LED
// spodní část LED
PORTB=0b11000111;
PORTC=0b00100000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00000000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+62) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00100000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00100000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+67) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00110000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00100000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+73) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00110000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00110000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+79) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00111000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00110000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+86) { // 30 LED
// spodní část LED
PORTB=0b11000111;
PORTC=0b00111000; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00111000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else if (a <= b+93) { //
// spodní část LED
PORTB=0b11000111;
PORTC=0b00111100; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00111000; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

else { // 32 LED (2x 16 LED)
// spodní část LED
PORTB=0b11000111;
PORTC=0b00111100; // spodní část LED aktivní
PORTD=0b11111111;
cekani();
// horní část LED
PORTB=0b11001011; //
PORTC=0b00111100; // horní část LED aktivní
PORTD=0b11111111;
cekani();
}

// Na konci nastavení nul, aby LED nesvítily v čase měření A/D převodníkem

PORTB=0x00; //
PORTC=0x00; // spodní část LED aktivní
PORTD=0x00;

}
}


// vypsaný podprogram cekani (dela bliknutí)

void cekani() {

_delay_us(2000); // délka čekání v mikrosekundách

}

 

5 lidí ohodnotilo tento článek.

Komentáře

1 :D :D | 9. června 2010 v 14:57 | Reagovat

na mna trochu dlhy a neprehladny, no az ked som sa kukol znovu na schemu som zistil ze tebe islo hlavne o jednoduchost dosky plosnych spojov a sak mas pravdu naco si komplikovat navrh ked to mozes programovo doriesit,
program by sa dal napisat aj jednoduchsie, ale na zaciatocnika to je vykon hoden medaili, len tak dalej

2 Hawelson Hawelson | E-mail | Web | 9. června 2010 v 21:49 | Reagovat

[1]: Nj, taky jsem se snažil ušetřit co nejvíce pinů, aby něco takového zvládl MCU za 34Kč. Samozřejmě slo by to udělat mnohem jednodušeji, ale já jsem si raději všechny ify pěkně rozepsal.

3 Honz Honz | 1. července 2010 v 12:46 | Reagovat

skvělý, skvělý a skvělý sem rád že je tu konečně nějaký program v cecku takhle pěkně rozepsaný, jen tak dál :-)

4 Mard Mard | E-mail | Web | 4. srpna 2010 v 12:59 | Reagovat

Pane kolego, dovolil jsem si o vašem projektu napsat zmínku na serveru mcu.cz! Bohužel jsem si musel malinko do Vás v textu rýpnout, kvůli tomu provedení C programu, snad mi to odpustíte. Jsem rád že se o HW zajímáte, pokud něco dalšího zajímavého zkonstruujete, rád o tom budu informovat. Přeji mnoho úspěchů!

5 Hawelson Hawelson | E-mail | Web | 29. srpna 2010 v 13:02 | Reagovat

Vážený pane kolego, oceňuji vaši snahu napsat zmínku na serveru. Opravdu krásný článek, vlastně kromě toho rýpance tam nebylo nic. Jo a asi Vám pane kolego nic neříká schválení autora při šíření jeho díla, že?
Ne že bych chtěl oplácet rýpanec, takový nejsem, ale myslel jsem, že vy jako člověk znaly jazyka C upraví a vylepší můj program a tím dá svému článku účel. Ale já jsem zvykly na takové kolegy z předmětů na které jsem už přestal chodit, protože jsem nechtěl dopadnout stejně.
Také přeji mnoho úspěchů.

6 nusik nusik | 1. září 2010 v 20:25 | Reagovat

ze pane kolego:D , tak tipujem ze pan kolega:D nadviazal na smaelovu kritku (a urcite by si bez nej ani nevsimol ze je kod trosku dlhsi), no s tim rozdielom ze smaelo ta chcel pochvalit ,povzbudit v tvorbe a povedat ti ze takto by to on nespravil , ale ved kolkimi sposobmi mozes nakreslit duhu??(pre mana kolegu - toto je recnicka otazka:D)
moja analiza - co pan kolega zabudol doplnit ked uz chce ripat
kod je menej prehladny a dlhy, ano chibaju matematicke funkcie ktore by riesili spinanie diod kedze niesu porty pouzite priamo za sebou ale striedavo (tim myslim ze multiplexovane mas napr pin C1 pripojeny na dve diodi za sebou co by urcite kazdy urobil inac)cim si si skomplikoval navrh programu ale zjednodusil DPS , a urcite si velmo vela pouzival Ctrl+C a rovnako vela Ctrl+V :-) aj ja by som to tak spravil a rovnako by to spravilo aj vela inych programatorov bo mikrokontroleru je jedno ci ma plny 1kB panati alebo 2 ked je pouziti na jednoucelovu aplikaciu.

vdaka ludom ako pan kolega " velkym odbornikom " muzom slova ale nie cinov sa znovu zamislame nad nasimi pracami a uvedomujeme si ze su fakt dobre ... :-) :-)

7 Hawelson Hawelson | E-mail | Web | 7. září 2010 v 21:40 | Reagovat

[6]: Ano o tom to je, udělat co nejjednodušeji plošný spoj a program může už být jakýkoli, důležitá je funkce. I když beru v potaz to, že matematickými funkcemi by se ušetřilo hodně psaní a paměti, ale paměti je v tomto případě dostatek.
Pokud tedy pak kolega je mužem slova, tak by se neměl nechat zahanbit a mohl by ukázat i jakým je mužem činu, to však už ukázal :).

8 Hawelson Hawelson | E-mail | Web | 7. září 2010 v 21:43 | Reagovat

Jinak pro ukázku zde dávám odkaz na článek, který napsal pak kolega Mard: http://mcu.cz/news.php?extend.2010.3

9 Soifong Soifong | Web | 15. listopadu 2010 v 15:34 | Reagovat

Zdrojový kód pro VU, nebo UV metr? Ale tak dlouhý? Jak funguje? A co to vůbec je? 8-O

10 Hawelson Hawelson | E-mail | Web | 28. listopadu 2010 v 2:47 | Reagovat

VU metr, jako Volume Units Meter. Je to program který slouží pro čip v http://hawelson.blog.cz/1005/vu-metr-2x32led-s-mikrokontrolerem

11 Nic Nic | 10. srpna 2011 v 21:30 | Reagovat

/*
http://hawelson.blog.cz/1005/vu-metr-2x32led-s-mikrokontrolerem

MCU: ATmega8, ATmega8L
avr-gcc -I".\Program Files\WinAVR-20100110\avr\include"  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT ind.o -MF dep/ind.o.d -c ind.c
*/

/*************************************
* Назначение выводов для линейки
* светодиодов.
    PC2
    PC3
    PC4
    PC5
    PD0
    PD1
    PD2
    PD3
    PD4
    PB6
    PB7
    PD5
    PD6
    PD7
    PB0
    PB1
* Выводы управления секциями
    PB2 - правая чётная
    PB3 - правая нечётная
    PB4 - левая  чётная
    PB5 - левая  нечётная
*************************************/

/* При компиляции не в AVR Studio
* надо раскомментировать следующую строку */
    #define F_CPU 1000000UL
#warning Check F CPU
#include <avr/io.h>
#include <util/delay.h>

#define LOOP_DELAY  2328

/* Константы для АЦП
*******************************/
#define ADC_MODE    0b10000000
#define ADC_START   0b01000000
#define ADC_FINISH  0b00010000
/* Выбор предделителя частоты АЦП */
/*#define ADC_SCALER  0b00000001   :2   */
/*#define ADC_SCALER  0b00000010   :4   */
#define ADC_SCALER  0b00000011  /* :8   */
/*#define ADC_SCALER  0b00000100   :16  */
/*#define ADC_SCALER  0b00000101   :32  */
/*#define ADC_SCALER  0b00000110   :64  */
/*#define ADC_SCALER  0b00000111   :128 */

/* Задержки индикации
*******************************/
#define LINE_DELAY  5
#define DOT_DELAY   11
#define DOT_HOLD    199

/* Управление секциями шкалы
*******************************/
#define LEFT_BOTTOM     0b00010000;
#define RIGHT_BOTTOM    0b00000100;
#define LEFT_TOP        0b00100000;
#define RIGHT_TOP       0b00001000;

/* Глобальные переменные */
unsigned char ucCount=0;        /* Счётчик для динамической индикации */
unsigned char ucLine[2]:={};  /* Результат АЦП для каналов */
unsigned char ucDot[2]:={};
unsigned char ucCountLine[2]:={};
unsigned char ucCountDot[2]:={};

/* Линейная шкала
unsigned int tLog[]={
        4,   5,   6,   7,   9,   11,  13,  15,
        18,  21,  25,  30,  35,  42,  50,  59,
        70,  84,  99,  118, 141, 167, 199, 236,
        280, 333, 396, 471, 559, 665, 790, 939,
        1023};*/

/* Логарифмическая шкала */    
unsigned int tLog[]={
        16,  48,  80,  112, 144, 176, 208, 240,
        272, 304, 336, 368, 400, 432, 464, 496,
        528, 560, 592, 624, 656, 688, 720, 752,
        784, 816, 848, 880, 912, 944, 976, 1008,
        1023};

unsigned char tIndik[]={
        0b00000000, 0b00000000, 0b00000000,
        0b00000000, 0b00000000, 0b00000000,
        0b00000010, 0b00000000, 0b00000000,
        0b00000011, 0b00000000, 0b00000000,
        0b00000011, 0b00000000, 0b10000000,
        0b00000011, 0b00000000, 0b11000000,
        0b00000011, 0b00000000, 0b11100000,
        0b10000011, 0b00000000, 0b11100000,
        0b11000011, 0b00000000, 0b11100000,
        0b11000011, 0b00000000, 0b11110000,
        0b11000011, 0b00000000, 0b11111000,
        0b11000011, 0b00000000, 0b11111100,
        0b11000011, 0b00000000, 0b11111110,
        0b11000011, 0b00000000, 0b11111111,
        0b11000011, 0b00100000, 0b11111111,
        0b11000011, 0b00110000, 0b11111111,
        0b11000011, 0b00111000, 0b11111111,
        0b11000011, 0b00111100, 0b11111111};

/*************************************
* Запуск микроконтоллёра.
*************************************/
int main()
{
    unsigned char ucCanel, ucLog;
    unsigned char b, i, m;

    /* Инициализация портов для индикации*/
    DDRB=0b11111111;
    DDRC=0b11111100;
    DDRD=0b11111111;

    while (1)
    {
        ucCount=ucCount & 0x03;
        ucCanel=ucCount & 0x01;

        /* Подготовка для запуска АЦП */
        ADMUX=(ucCanel) | 0b11000000;

        switch(ucCount)
        {
            case 1:
                b=RIGHT_BOTTOM;
                break;
            case 2:
                b=LEFT_TOP;
                break;
            case 3:
                b=RIGHT_TOP;
                break;
            default:
                b=LEFT_BOTTOM;
        }

        i=ucLine[ucCanel];
        m=ucDot[ucCanel];
        if (ucCount & 0x02)
        {
            i=i+2;
            if (m & 0x01) m=0;
            else m=m+2;
        }
        else
        {
            i=i+3;
            if (m & 0x01) m=m+3;
            else m=0;
        };

        i=i & 0xfe;    
        i=i+(i>>1);
        m=m & 0xfe;    
        m=m+(m>>1);
        b=b | tIndik[i] | (tIndik[m] & (~tIndik[m-3]));

        PORTB=0;
        i++;
        m++;
        PORTC=tIndik[i] | (tIndik[m] & (~tIndik[m-3]));
        i++;
        m++;
        PORTD=tIndik[i] | (tIndik[m] & (~tIndik[m-3]));
        PORTB=b;

        /* Запуск АЦП и задержка */
        ADCSRA=ADC_MODE | ADC_SCALER | ADC_START;
        _delay_us(LOOP_DELAY);
        while (!(ADCSRA & ADC_FINISH));

        /* Преобразование результата АЦП */
        for (ucLog=0; ucLog <= 32; ucLog++)
        {
            if (tLog[ucLog] >= ADC) break;
        }

        /* Сброс флага прерывания АЦП */
        ADCSRA=ADC_MODE | ADC_SCALER | ADC_FINISH;

        /* Обновление значения линейки */
        if (ucLog >= ucLine[ucCanel])
        {
            ucLine[ucCanel]=ucLog;
            ucCountLine[ucCanel]=LINE_DELAY;
        }
        else
        {
            if (ucCountLine[ucCanel]) ucCountLine[ucCanel]--;
            else
            {
                ucLine[ucCanel]--;
                ucCountLine[ucCanel]=LINE_DELAY;
            }
        }

        /* Обновление значения точки (пика) */
        if (ucLine[ucCanel] >= ucDot[ucCanel])
        {
            ucDot[ucCanel]=ucLine[ucCanel];
            ucCountDot[ucCanel]=DOT_HOLD;
        }
        else
        {
            if (ucCountDot[ucCanel]) ucCountDot[ucCanel]--;
            else
            {
                ucCountDot[ucCanel]=DOT_DELAY;
                if (ucDot[ucCanel]) ucDot[ucCanel]--;
            }
        }

        ucCount++;
    }
}

12 Alfonso Alfonso | E-mail | Web | 13. října 2011 v 0:07 | Reagovat

Souhlas

13 RedD RedD | E-mail | Web | 21. října 2014 v 15:15 | Reagovat

To Nic заинтересовало, черкни на мышь есть вопросы или тел. оставь я позвоню

14 Nic Nic | 8. listopadu 2014 v 22:30 | Reagovat
15 RedD RedD | E-mail | 9. listopadu 2014 v 11:22 | Reagovat

Senk

16 RedD RedD | E-mail | 9. listopadu 2014 v 11:28 | Reagovat

А вот такое не пробовали делать ?
http://www.jnutthailand.com/FFT.html

17 RedD RedD | E-mail | Web | 17. listopadu 2014 v 19:57 | Reagovat
18 Andreycoeld Andreycoeld | E-mail | Web | 16. února 2017 v 16:28 | Reagovat

орехи и мед для потенции    http://moskvadgeneriki.blogspot.ru/2017/01/blog-post_393.html

19 ghkkll ghkkll | E-mail | Web | 2. dubna 2017 v 23:38 | Reagovat

заказать продвижение интернет ресурса логин скайпа pokras77777

Nový komentář

Přihlásit se
  Ještě nemáte vlastní web? Můžete si jej zdarma založit na Blog.cz.