Fórum témák

» Több friss téma
Cikkek » Nyolc lábbal AVR IV. rész
Nyolc lábbal AVR IV. rész
Szerző: Topi, ZsirosDani, idő: Dec 19, 2008, Olvasva: 45791, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   3 / 5

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.


Kattints a képre, a nagyobb mérethez!

Megépítve:

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.

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <math.h>
  4.  
  5. #define MR            PB3
  6. #define ST_CP            PB1
  7. #define SH_CP            PB2
  8. #define SD            PB0
  9.  
  10. #define STROBE_SH_CP()    PORTB |=  (1<<SH_CP);PORTB &= ~(1<<SH_CP)
  11. #define STROBE_ST_CP()    PORTB |=  (1<<ST_CP);PORTB &= ~(1<<ST_CP)
  12. #define STROBE_MR()        PORTB &= ~(1<<MR);PORTB |= (1<<MR)
  13. #define SD_HIGH()        PORTB |=  (1<<SD)
  14. #define SD_LOW()        PORTB &= ~(1<<SD)
  15.  
  16. unsigned short m_abs(signed short v1) {
  17.     if(v1<0) return -v1;
  18.     return v1;
  19. }
  20.  
  21. //-------------------------------------
  22. void m_delay_10ms(unsigned short val) {
  23. //-------------------------------------
  24.     while(val--) _delay_ms(10);
  25. }
  26.  
  27. //-------------------------------------
  28. void SendByte(unsigned char data) {
  29. //-------------------------------------
  30.     unsigned char i;
  31.     i = 7;
  32.     do {
  33.         if(data & (1<<i)) SD_HIGH(); else SD_LOW();
  34.         STROBE_SH_CP();
  35.     } while (i--);
  36. }
  37.  
  38. //-------------------------------------
  39. short GenerateBar(unsigned char value,unsigned char peak) {
  40. //-------------------------------------
  41.     unsigned short result;
  42.     unsigned char i;
  43.  
  44.     result = 0;
  45.     for(i=0;i<16;i++) {
  46.         if(value>i) result |= (1<<i);
  47.     }
  48.     result |= (1<<peak);
  49.     return result;
  50. }
  51.  
  52. //-------------------------------------
  53. void init() {
  54. //-------------------------------------
  55.     DDRB = (1<<MR)|(1<<ST_CP)|(1<<SH_CP)|(1<<SD);    //kimenetek
  56.  
  57.     //Init ADC
  58.     ADMUX = 0x00;
  59.     ADCSRA =  (1<<ADEN)
  60.            |  (0<<ADATE)
  61.            |  (0<<ADSC)
  62.            |  (1<<ADPS2)
  63.            |  (1<<ADPS1)
  64.            |  (1<<ADPS0)
  65.            ;
  66. }
  67.  
  68. //-------------------------------------
  69. unsigned short ADConvert(unsigned char channel) {
  70. //-------------------------------------
  71.     ADMUX &= ~(1<<MUX1|1<<MUX0);
  72.     ADMUX |= channel;
  73.     ADCSRA |= (1<<ADSC);
  74.     while(ADCSRA & (1<<ADSC));
  75.     return ADC;
  76. }
  77.  
  78. //-------------------------------------
  79. int main(void) {
  80. //-------------------------------------
  81. unsigned short data;
  82. unsigned short adc, counter,counter_peak;
  83. unsigned short peak_hold,adc_c;
  84.     init();
  85.  
  86.     peak_hold = 0;
  87.     adc_c = 0;
  88.     counter = 0;
  89.     counter_peak = 0;
  90.     for(;;)  {
  91.         if(counter) counter--;
  92.         adc = ADConvert(2);
  93.         if(adc>256) adc -= 256;
  94.         adc >>= 5;
  95.         if(adc>adc_c) adc_c = adc;
  96.         if(adc>peak_hold) peak_hold = adc;
  97.         if(counter==0) {
  98.             counter = 100;
  99.             data = GenerateBar(adc_c,peak_hold);
  100.             STROBE_MR();
  101.             SendByte(data>>8);
  102.             SendByte(data);
  103.             STROBE_ST_CP();
  104.             if(adc_c)adc_c--;
  105.         }
  106.         if(counter_peak==0) {
  107.             counter_peak = 800;
  108.             if(peak_hold)peak_hold--;
  109.         }
  110.         if(counter_peak)counter_peak--;
  111.     }
  112. }


A cikk még nem ért véget, lapozz!
Következő: »»   3 / 5
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem