Operácie

Počítadlá a časovače AVR: Rozdiel medzi revíziami

Z SensorWiki

(Počítadlo T1)
(Počítadlo T1)
Riadok 66: Riadok 66:
 
         PORTB |= (1<<LED1);   }
 
         PORTB |= (1<<LED1);   }
  
 
        /* cursor is now on second line, write second line */
 
 
 
 
 
sprintf(riadok,"D5: %d TCNT: %04X",value,TCNT1);    // bolo tu aj (PIND&(1<<SW1))>>SW1
+
sprintf(riadok,"D5: %d TCNT: %04X",value,TCNT1);    // vytvoríme kombinovaný text
     lcd_puts(riadok);  
+
     lcd_puts(riadok);         // zobrazíme ho na displeji
     lcd_command(0xC0 + 0); // 0b1000 0000 + 40 + 0
+
     lcd_command(0xC0 + 0); // a vrátime kurzor na začiatok 2. riadku (0b1000 0000 + 40 + 0)
  
 
     }
 
     }

Verzia zo dňa a času 21:05, 7. marec 2021

16-bitové počítadlo a časovač T1 s prerušením

Máte k dispozícii vývojovú dosku Arduino s procesorom ATmega328P (datasheet).

V tejto úlohe sa predpokladá znalosť funkcie časovača T1 z prednášky (datasheet, str.114 -- 141). Procesor je nakonfigurovaný na prácu s externým kryštálovým oscilátorom 16,000 MHz.


Počítadlo T1

K vývojovej doske budeme mať pripojený LCD displej ako na minulom cvičení a pripojíme aj tlačítko na vstup PD5 (Arduino D5). Schémy zapojenia tu nebudeme opakovať, použijete tie z minulého cvičenia.

Ukážeme si, ako treba nakonfigurovať počítadlo T1, aby registrovalo počet stlačení tohoto tlačítka. Okrem tlačítka (čo nemá veľký praktický význam) môžeme počítať napr. počet impulzov z nejakého snímača za pevnú periódu a tým zistiť frekvenciu, alebo počítať kroky z inkrementálneho snímača a zistiť tak polohu pohonu, alebo počítať napr. počet výrobkov, ktoré prepadli cez optickú závoru. Zároveň budeme tlačítkom ovládať zabudovanú LED diódu aby ste videli, že vstupy sú skutočne multifunkčné.

Na pripojenom LCD displeji si zobrazíme aktuálny stav tlačítka (0/1) a stav počítadla TCNT1 v hexadecimálnom tvare.

Na prvom obrázku je časť vnútornej štruktúry počítadla a časovača T1. Ako vidno, konfigurácia do režimu počítania impulzov z externého vstupu spočíva len v nastavení príslušných bitov v registri TCCR1B. Ostatné bity a konfiguračné registre si zatiaľ nebudeme všímať.

AVR Timer T1 Counter.png


Na druhom obrázku vidno, že nastavenie sa vykoná spodnými troma bitmi registra TCCR1B. Žiadne ďalšie nastavenie v tejto chvíli nie je potrebné. Môžeme však pre istotu vynulovať aj register počítadla TCNT1.

AVR Timer TCNT1 Counter.png
#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>
#include "lcd_ch.h"             // using our LCD library

#define LED1 PB5                // internal LED
#define SW1  PD5                // pushbutton on PD5 (Arduino D5)

int main(void)
{
	  char riadok[]= {"                "};	
	  int value = 0;
	  
	   DDRB |= (1<<LED1);       // PORTB: LED1 na PB5  je output

	   DDRD &= ~(1<<SW1);       // PORTD: SW2 (PD5) input
      PORTD |=  (1<<SW1);       //                  pull-up ON
   
     TCCR1B = 0b00000111;             // T1 clk = external clock source on pin T1, rising edge
									
    /* initialize LCD display */
    ini_ports();
    lcd_init();
	
	lcd_puts("-Button counter-\n");        
    
    while(1)
    {
         /* test the switch first */
  	 
	 if ( PIND&(1<<SW1) )
	  { value = 1; 
		PORTB &= !(1<<LED1);  }
	 else 
	  { value = 0;
        PORTB |= (1<<LED1);	  }

		 
	 sprintf(riadok,"D5: %d TCNT: %04X",value,TCNT1);    // vytvoríme kombinovaný text
     lcd_puts(riadok);          // zobrazíme ho na displeji
     lcd_command(0xC0 + 0);	// a vrátime kurzor na začiatok 2. riadku (0b1000 0000 + 40 + 0)

    }
	
 return(0);
 
}
</source>

Časovač T1

Pozri AVR ExampleT1pooled.c


Nasledovny kus programu nastavi pocitadlo na 5 impulzov pred pretecenim (0xFFFF - 5) a potom sleduje v hlavnej slucke, kedy nastane pretecenie. Ako hodinky je pouzity externy signal na T1, cize tlacitko alebo 555.


Úlohy

  1. Program doplňte podľa pokynov asistenta a odsimulujte.
    Pozn.: Treba vypnúť optimalizáciu! (Project/Project options Pozri obr.)
  2. Doplňte chýbajúce časti programu tak, aby LED blikala s frekvenciou 1 s.
  3. Vyskúšajte na svojej doske.
  4. Jednotlivé skupiny prepočítajú a nastavia interval na 1 ms, 10 ms resp. 100 ms.


Literatúra:


Odkazy