Fórum témák

» Több friss téma
Cikkek » Nyolc lábbal AVR II. rész
Nyolc lábbal AVR II. rész
Szerző: Topi, idő: Aug 26, 2008, Olvasva: 46091, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   2 / 5

Látványos dolog tud lenni, egy tapskapcsoló. Vagy idézzem ide, a 80-90-es évekbeli visszafügyülős kulcstartót?

Itt az idő, hogy hangra indítsunk tetszőleges folyamatokat, és megismerkedjünk az ATtiny45 lábainak bemenetként való használatával.

Egyszerű mikrofon előerősítő, nem számít semmi torzítás, semmi szép hang. A lényeg, hogy erősítsen. Nagy kivezérlés esetén logikai 0-ának megfelelő szint jelenik meg a kimenetén.

A videó megtekintéséhez Flash lejátszó szükséges!

 

Az előzőekben már ismertettem a sípoló algoritmusokat, így azt most kihagyom.

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. //-------------------------------------
  5. void m_delay_10ms(unsigned long val) {
  6. //-------------------------------------
  7.     while(val--) _delay_ms(10);
  8. }
  9. //-------------------------------------
  10. void do_delay(uint16_t ms_delay, uint16_t num_ms, uint16_t us_delay, uint16_t num_us)  {
  11. //-------------------------------------
  12.         uint16_t i;
  13.  
  14.         for(i=0;i<num_ms;i++) _delay_ms(250);
  15.         for(i=0;i<ms_delay;i++) _delay_ms(1);
  16.         for(i=0;i<num_us;i++) _delay_us(250);
  17.         for(i=0;i<us_delay;i++) _delay_us(1);
  18. }
  19.  
  20.  
  21. //-------------------------------------
  22. void generate_tone(uint16_t frequency, uint16_t duration)
  23. //-------------------------------------
  24. {
  25.           uint32_t total_delay_time;
  26.           uint16_t total_ms_delay_time, total_us_delay_time;
  27.           uint16_t num_us_delays, num_ms_delays, ms_delay_time, us_delay_time;
  28.           uint16_t num_periods;
  29.  
  30.           total_delay_time = (1000000/frequency)/2-10;
  31.  
  32.           total_ms_delay_time = total_delay_time/1000;
  33.           num_ms_delays = total_ms_delay_time/250;
  34.           ms_delay_time = total_ms_delay_time%250;
  35.  
  36.           total_us_delay_time = total_delay_time%1000;
  37.           num_us_delays = total_us_delay_time/250;
  38.           us_delay_time = total_us_delay_time%250;
  39.  
  40.           num_periods = ((uint32_t)duration*1000)/(1000000/frequency);
  41.  
  42.           while((num_periods--) != 0)
  43.           {
  44.              do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
  45.              PORTB |=  (1<<PINB3);
  46.              do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
  47.              PORTB &= ~(1<<PINB3);
  48.           }
  49.  
  50.           return;
  51. }
  52.  
  53.  
  54. //-------------------------------------
  55. int main(void) {
  56. //-------------------------------------
  57.     DDRB = (1<<PINB3)|(0<<PINB4); //PB4 BEMENET!!
  58.     while(1) {
  59.         if(!(PINB & (1<<PINB4))) {
  60.             generate_tone(1400,150);
  61.             generate_tone(1000,150);
  62.             generate_tone(1400,150);
  63.             generate_tone(1000,150);
  64.             m_delay_10ms(1);
  65.         }
  66.     }
  67.     return 0;
  68. }

 

A DDRB-n a 0-ás bit bemenetet, az 1-es bit, kimenetet jelent. Igaz, hogy nullát shift-elni értelmetlen, de így jobban követhető.

Olvasni portról a PINB regiszterrel tudunk. A PINB ugyan úgy 8 bites regiszter, tehát ugyan úgy minden láb, 1-1 bit. Az 1<<PINB4-el megint előállítjuk a bájtot mint az előző részben: 0b00010000 majd bitenkénti ÉS-eljük a PINB-vel. Ennek a kifejezésnek akkor lesz igaz értéke, ha az adott bit pozícióban a PINB adott bitje is 1-es. De mivel nekünk alap esetben egyes, és aktív állapotban nulla, így a kifejezés elé egy !-et téve negáljuk a logikai kifejezést. Figyelem, ez nem egyenlő a ~ komplemens képzéssel.

Nézzük meg első igazi belső perifériánkat. A Timer PWM modulját.


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

Belépés

Hirdetés
XDT.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