forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
ATmega16 stopky - nastavení čítače

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> AVR
 
kalmar
Nováček
Nováček


Založen: 26.12.2016
Příspěvky: 3

PříspěvekZaslal: 26 prosinec 2016, 18:25    Předmět: ATmega16 stopky - nastavení čítače Citovat

Zdravím, dělám projekt stopky s Atmega16 a chci si zde ověřit zda mám správně nastavený čítač. V obvodu mám 16 MHz krystal. Čítač je nastaven v CTC modu. A počet cyklů jsem vypočítal podle jednoho tutoriálu.

http://solarskit.wz.cz/avrprogramming.html

Chci aby se čítač inkrementoval každou ms, z toho vyplývá výpočet 1ms / 62,5 ns = 16000 cyklů a požil jsem 64predděličku, tak že 16000/64 = 250.


pokud vše chápu správně mělo by to být v pořádku Smile

Zde je kod:

kód:
/*
 * stopky.c
 *
 * Created: 22.12.2016 17:13:33
 *  Author: User
 */



#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>



volatile uint16_t   msec = 0;   // milisekundy
volatile uint8_t   sec = 0;   // sekundy
volatile uint8_t   min = 0;   // minuty
volatile uint8_t   start_stop_znak = 0; // nastavení start/stop




void tlacitka_beh(void);






int main(void)
{
   
   
   //------------------------------------------------------------------>porty
   
   DDRD &= ~((1 << PD2) | (1 << PD3) | (1 << PD4)); // nastavení vstupu start/stop/reset
   PORTD |= (1 << PD2) | (1 << PD3) | (1 << PD4) ; // nastavení pull up rezistoru
   
   
   
   
   
   //-------------------------------------------------------------------->časovač
   
   TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS01); // CTC mod a 64 dělička
   TIMSK | = (1 << TOIE0); // přerušení při přetečění TCNT0 
   
   OCR0 = 249;     // porovnavaci registr
   TCNT0 = 0x00;
   
   sei(); // povolí globální přerušení
   
   
   while(1)
    {
       
      //volani fci + multiplexni spinani dopsat
      tlacitka_beh();
         
   }
}




ISR(TIMER0_COMP_vect)
{
   if(start_stop_znak)
      msec++;
   
   if(msec >= 1000) // 1000 ms = 1 s
   {
      msec = 0;
      sec++;   
   }   
   
   if(sec >= 60) // 60 s = 1 m
   {
      sec = 0;
      min++;
   }
   
   if(min >= 100) // max 100 m
   {
      min = 0;
   }
}




void tlacitka_beh(void){
   
   
   if((PIND & (1 << PD2)) == 0) //stisk start
   {
      start_stop_znak = 1;
      TCCR0 |= (1 << CS00) | (1 << CS01);
   }

   
   
   
   if((PIND & (1 << PD3)) == 0) //stisk stop
   {
      start_stop_znak = 0;
      TCCR0 &= ~((1 << CS00) | (1 << CS01)); //zastavení čítače
   }
   
   
   
   if((PIND & (1 << PD4)) == 0) //stisk reset
   {
      start_stop_znak = 0;
      TCCR0 &= ~((1 << CS00) | (1 << CS01));
      msec = 0;
      sec = 0;
      min = 0;
      TCNT0 = 0;
   }
   
   return;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> AVR Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Copyright © 2020 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora.