Histereza aTtiny13

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!
Awatar użytkownika
dondu
Użytkownik
Posty: 211
Rejestracja: 24 maja 2005, 9:47
Lokalizacja: Śląskie
Kontakt:

Post autor: dondu » 06 maja 2013, 21:25

To program dla ATiny13?

1. Nie włączyłeś przerwań z przetwornika ADC. Patrz program podany przeze mnie wyżej.
2. Odczytuj pomiar do zmiennej i ją i ją używaj w if().
3. Ustawić tryb snu wystarczy raz.
4. Zegar definiuj w opcjach projektu z tych powodów: http://mikrokontrolery.blogspot.com/201 ... iowac.html


Czyli Twój program powinien wyglądać mniej więcej tak:

Kod: Zaznacz cały

//#define F_CPU 4800000UL  //patrz punkt 4 w opisie powyżej
//#include <stdio.h>                   // zbędny
#include <avr/io.h> 
//#include <util/delay.h>          // zbędny
#include <avr/interrupt.h> 
#include <avr/sleep.h>
     
#define LED1 PB1
#define LED2 PB2
#define ADCIN PB4  


unsigned int pomiar;

int main(void)  
{ 

  DDRB  |= (1<<LED1)|(1<<LED2);
  DDRB &=~ (1<<ADCIN); 
  ADCSRA |= (1<<ADEN)  | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1);   
  ADMUX  |= (1<<MUX1)|(1<<REFS0);

  set_sleep_mode(SLEEP_MODE_ADC);    
  sleep_enable();

  sei();
     
  
   for(;;) 
    {          

     //rozpocznij pomiar przez uśpienie mikrokontrolera
     sleep_cpu();          
    pomiar = ADC;   

    if(pomiar<700)      
    { 
         PORTB  &=~ (1<<LED1); 
        PORTB  &=~ (1<<LED2); 
    } 
    else if(pomiar<750)      
    { 
        PORTB  &=~ (1<<LED1); 
        PORTB  |=  (1<<LED2); 
    } 
    else                  
    { 
       PORTB  |=  (1<<LED1);
	   PORTB  |=  (1<<LED2);
    } 


     }   
} 

ISR(ADC_vect){

} 

Awatar użytkownika
Dawid2379
Użytkownik
Posty: 318
Rejestracja: 17 lis 2010, 19:42
Lokalizacja: Kluczbork
Kontakt:

Post autor: Dawid2379 » 07 maja 2013, 20:21

Tak dalej jestem przy tiny13.
Naprawde jestem wdzięczny. Program działa.

Odnośnie punktu 4 - było to powodem że poprzednie kody nie chciały działać. Po prostu zapomiałem o tym, na szczęście cos mnie pokusiło zajrzec do książki Mirosława K.

Zostaje mi przeanalizowac kod, dlaczego tak, a nie inaczej, aby wyciagnąć jakąś naukę.

Jeżeli chodzi o działanie przy ADC Noise Reduction a przy uśrednianiu wyniku, to drugie jest lepsze, przy Noise reduction jescze troche diody migają, ale zasze można zrobic mały mix:)

Nastepny krok sterowanie dwoma serwami za pomocą potencjometrów (ADC).

Awatar użytkownika
dondu
Użytkownik
Posty: 211
Rejestracja: 24 maja 2005, 9:47
Lokalizacja: Śląskie
Kontakt:

Post autor: dondu » 08 maja 2013, 8:56

Dawid2379 pisze:Jeżeli chodzi o działanie przy ADC Noise Reduction a przy uśrednianiu wyniku, to drugie jest lepsze, przy Noise reduction jescze troche diody migają, ale zasze można zrobic mały mix:)
Uśrednianie zawsze będzie dawało wygładzenie pomiarów, stąd w niektórych przypadkach warto stosować. Ale Noise Reduction daje stabilniejsze wyniki niż brak tego trybu, a uśrednianie stabilniejszych wyników daje jeszcze stabilniejsze, czyli MAŁY MIX (jak to napisałeś) często jest wskazany :-)

ODPOWIEDZ