Witam.
Jestem poczatkujacym programista atmeg (8 i 16). Jeżeli chodzi o liczniki/timery - umiem zrobić wyzwalanie wyjść po określonym przedziale czasu. Podstawy tez juz znam.
Mam taki problem: chciałbym zliczać impulsy z wejścia atmegi 8. Gdy licznik zliczy do 2, nastepuje jakas tam akcja i bit na okreslonym wyjsciu zmienia sie na przeciwny. Sygnaly sterujace (te dwa do zliczenia) musza byc podane w okreslonym czasie. Algorytm jaki sobie omyslilem:
- deklaracja in/out.
- petla if (wejscie)=1 to wlacza sie timer, ktory odlicza do 1sek. (wyzwalanie 1 sygnalem z wejscia)
- Gdy w czasie, w którym timer odlicza czas zostanie wyzwolone wejscie jeszcze raz - ustaw na wyjsciu stan przeciwny.
- Jezeli nie, zeruj licznik impulsow wyzwalajacych.
Moglby mnie ktos tak troszke nakierowac, jak odpowiednio posterowac timerami by taki zabieg sie udal
Pozdrawiam
Licznik - prośba o wytłumaczenie;)
-
Sevotharte
- -
- Posty: 3
- Rejestracja: 08 wrz 2009, 11:43
- Lokalizacja: warszawa
-
Sevotharte
- -
- Posty: 3
- Rejestracja: 08 wrz 2009, 11:43
- Lokalizacja: warszawa
-
keruseykaryu
Sevotharte, użyłbyś kolego kalkulatora AVR do timerów i byś miał gotowe.
http://frank.circleofcurrent.com/cache/avrtimercalc.htm
http://frank.circleofcurrent.com/cache/avrtimercalc.htm
-
Sevotharte
- -
- Posty: 3
- Rejestracja: 08 wrz 2009, 11:43
- Lokalizacja: warszawa
Witam. Wymyslilem cos takiego, ale niezbyt chce mi to chodzić. Czy coś źle w tym kodzie jest?
Kod: Zaznacz cały
include <avr/io.h>
#include <util/delay.h>
int main (void)
{
DDRB=0x01; //ustawienie pinu 0 portu B na wyjście
DDRC=0x00; //wejscie klaskacza z portu B
PORTC=0x01;
TCCR0 |= ((1 << CS00) | (1 << CS01));
unsigned char licznik = 0;
while(1)
{
if((PINC & 0x01)&(licznik==0))
{
licznik=0;
licznik++;
PORTB = 0x00;
}
_delay_ms(80);
if (licznik == 1)
{
TCNT0=0x00;
if(TCNT0 <= 15625)
{
if ((PINC & 0x01)&(licznik==1))
{
licznik++;
TCNT0=0x00;
}
}
}
while (licznik == 2)
{
PORTB ^=0x01;
}
}
}-
keruseykaryu
A i owszem. Brak komentarzy nie pozwala nam śledzić Twojego toku pojmowania tego programu.Sevotharte pisze:Czy coś źle w tym kodzie jest?
I jeszcze jedno nie mieszaj sobie operatorów bitowych z logicznymi.
Kod: Zaznacz cały
if((PINC & 0x01)&(licznik==0))