licznik w attiny2313 - kod w C

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
mlody_elfan
-
Posty: 32
Rejestracja: 31 sty 2008, 12:18
Lokalizacja: z internetu

licznik w attiny2313 - kod w C

Post autor: mlody_elfan » 24 lut 2008, 22:56

Próbuję uruchomić licznik 8bitowy attiny2313. Chciałem do tego celu użyć przykładu z książki "Mikrokontrolery AVR w praktyce" J. Dolińskiego. Oczywiście przykład nie chciał działać, więc postanowiłem troche go przerobić.

Kod: Zaznacz cały

#include <avr/io.h>

#define tau0 6;	//stała czasowa dla 1kHZ @8MHz

int main( void )
{
 unsigned char licznik=2;

 DDRB=0x01;     // wyjsciem generatora będzie PB0
 TCNT0=tau0;    //wpisz stała czasowa dla zadanego interwału
 TCCR0A=2;       //timer0 będzie pracował z preskalerem Fosc/8

 while(1)
 {

  while(bit_is_set(TIFR,TOV0));	//czekaj na ustawienie flagi
		//TOV0 (przekręcenie licznika)

  TCNT0=tau0;	//wpisz stała czasowa
  if(--licznik==0)	//zmiana polaryzacji wyjscia wymaga
		//2-krotnego przekręcenia się licznika
  {
   PORTB^=0xff;	//zmień stan wyjscia
   licznik=2;	//odswież stan licznika
  }
 TIFR=1<<TOV0; //kasuj flagę przepełnienia
 }
}
Jedyne co zmieniłem to TCCR0 na TCCR0A, bo kompilator wywalał błąd o niezdefiniowanej zmiennej TCCR0. Użyłem również

Kod: Zaznacz cały

bit_is_set(TIFR,TOV0)
zamiast

Kod: Zaznacz cały

inp(TIFR)&0x02)!=0x02
, ponieważ kompilator krzyczał coś z funkcją inp().
Efekt jest taki, że jedna dioda cały czas pozostaje zgaszona, i nie reaguje jakimi kolwiek zmianami.

Korzystam z avr-gcc 4.2.1-1 i avr-libc 1.4.5-2

Czy ktoś mógłby mi napisać co jest źle, ewentualnie podać jakiś przykładowy kod poprawnego wykorzystania licznika?? Może być kod w C jak i assembler.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 25 lut 2008, 9:23


mlody_elfan
-
Posty: 32
Rejestracja: 31 sty 2008, 12:18
Lokalizacja: z internetu

Post autor: mlody_elfan » 25 lut 2008, 16:07

Kody z tamtej strony również są przestarzałe, a ja niestety dopiero zaczynam przygodę z avrami i C więc sam nie potrafię i nie wiem jak niektóre rzeczy zastąpić nowszymi.

Przykład z manuala avr-gcc działa. Np. w tej wersji WinAVR-20071221/doc/avr-libc/examples/demo/

Timer z PWM działa.
Na stronie, którą podałeś http://avr.elektroda.eu/?q=node/26

używana jest np. funkcja inb(); którą nie wiem jak obsłużyć w najnowszym avr-gcc :/
Do tej pory nie wiem dlaczego nie można użyć TCCR0 tylko TCCR0A i TCCR0B. Z tego co wiem to attiny2313 ma tylko jeden rejestr TCCR0.

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Re: licznik w attiny2313 - kod w C

Post autor: alaris » 25 lut 2008, 18:21

mlody_elfan pisze:

Kod: Zaznacz cały

 TCCR0A=2;       //timer0 będzie pracował z preskalerem Fosc/8
Preskaler ustawia sie w TCCR0B. W Twoim programie nie ma zadnego zapisu do tego rejestru, wiec licznik nie pracuje. Zajrzyj do noty ukladu ATtiny2313.

[ Dodano: 2008-02-25, 18:23 ]
A jak chcesz korzystac w prosty sposob z operacji bitowych, to na samej gorze programu wklej sobie:

Kod: Zaznacz cały

#define sbi(port, bit) port|=(1<<bit)
#define cbi(port, bit) port&=~(1<<bit)
i masz:

Kod: Zaznacz cały

sbi(DDRB, 0)  ; //ustaw bit zerowy
cbi(PORTD,3) ; //zeruj bit trzeci

mlody_elfan
-
Posty: 32
Rejestracja: 31 sty 2008, 12:18
Lokalizacja: z internetu

Post autor: mlody_elfan » 25 lut 2008, 18:32

Chodzi o operacjie inp(), która jest obsolete :), a nie sbi() i cbi();

Przykładowy kod ( działający :)). Może komuś się przyda:

Kod: Zaznacz cały

#include <avr/io.h>

int main (void)
{
   DDRB |= (1 << 0);

   TCCR0B |= (1 << CS02); // Set up timer

   for (;;)
   {
      // Check timer value in if statement, true when count matches 1/20 of a second
      if (TCNT0 >= 250)
      {
         PORTB ^= (1 << 0); // Toggle the LED

         TCNT0 = 0; // Reset timer value
      }
   }
}
Kod został znaleziony tu i przerobiony dla licznika 8bitowego.

ODPOWIEDZ