logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Generator i PWM w jednym, AVR, gdzie jest błąd w kodzie?

Hrzych 20 Lip 2009 20:47 1479 4
REKLAMA
  • #1 6802531
    Hrzych
    Poziom 11  
    Od pewnego czasu próbuje się uporać z programem jak poniżej. Zasadniczo program składa się z dwóch części generatora 36kHz na Timer0 i z PWM na Timer1. Osobno programy działają w 100 procentach. Jednak po złączeniu jak poniżej generator 36kHz jest nie aktywny natomiast PWM działa. Próbowałem różnych sztuczek, i nic ... Gdzie popełniam błąd. Podejrzewam że coś z przerwaniami jest sknocone. Programowaniem AVR-ów zajmuję się od nie dawna, może popełniam jakiś żłobkowy błąd.

    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    unsigned char Licz_50 ;
    
    SIGNAL(SIG_OVERFLOW0)
    {	
    	TCNT0 = 163 ;						//f=36kHz
    
    	Licz_50++ ;
    
    	if(Licz_50 < 50)
    	{
    		PORTB = PORTB ^ (1 << PB0);
    	}
    	else if((Licz_50 >= 50) && (Licz_50 < 100))
    		{
    			PORTB = 0x00 ;
    		}
    		else if(Licz_50 >= 100)
    		{
    			Licz_50 = 0 ;
    		}
    }
    
    int main(void)
    {
    	Licz_50 = 0 ;
    
    	DDRD  = 0x40 ;
    	PORTD = 0xA0 ;
    
    	DDRB  = 0x01;		
    	TCCR0 = 0x01;		//Prescale = clk / 1
    
    	DDRB    = (1 << PB2) ;		//PB2 = output
    
    	TCCR1A =  (1 << WGM10) | (1 << WGM11) | (1 << COM1B0) | (1 << COM1B1);	//Tryb 15
    	TCCR1B =  (1 << WGM12) | (1 << WGM13) | (1 << CS10)   | (1 << CS11) ;
    
    	OCR1AH = 0x0A ;
    	OCR1AL = 0x40 ;							//rozdzielczość 21ms
    	OCR1BH = 0x09 ;
    	OCR1BL = 0xC3 ;							//wypelnienie   20ms - '0'; 1ms - '1'
    	
    	TCNT0 = 163;		
    
    	sei();
    
    	while(1)
    	{
    	}
    
    	return 0 ;
    }
    
  • REKLAMA
  • #2 6802556
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 6802604
    Hrzych
    Poziom 11  
    Niestety nic się w działaniu programu się nie zmieniło.
  • REKLAMA
  • Pomocny post
    #4 6803333
    Brutus_gsm
    Poziom 25  
    Jeśli chodzi o generator 36kHz, to lepiej, niech timer zrobi to sprzętowo. Do tego jest specjalny tryb CTC. Wystarczy poczytać w nocie katalogowej.

    I zmień to:
    DDRB    = (1 << PB2) ;      //PB2 = output 

    na
    DDRB    |= (1 << PB2) ;      //PB2 = output 


    Ponieważ wtedy operujesz tylko na jednym wyprowadzeniu a nie na calym porcie.
  • #5 6805546
    Hrzych
    Poziom 11  
    Faktycznie kolega Brutus_gsm zwrócił uwagę na bardzo ważną sprawę, którą ja przegapiłem. Zapis na wyjścia powinien odbywać się przez sumę logiczną(tam gdzie trzeba to ANDa należy umieścić) a nie przez bezpośredni wpis.
    Dziękuję za tak szybkie rozwiązanie problemu.
    PS. Kto nic nie robi ten nie popełnia błedów :)
REKLAMA