Odlavění programu

Dobrý den,
Bojuju s rozběháním programu a pořád se mi nedaří nalézt chybu.
Mám vytvořený program, který mi načítá dvě analogové hodnoty a přes ADC mi je převádí na hodnotu adcKola a adcNapravainverz. tyto vstupy mám nastavené na portA piny 6 a 7 označení v programu jako čísla kanálu. nevím jestli mám tyto piny vybrány správně, protože mi nefungují výstupy při nahráni programu do AVR.

Jako vystupy volím portC kde na PIN 3 a 5 se mi střídá stav vysoké impedance a 0. a na PIN 4 a 6 se mi mění 1 a 0. Na PIN 7 přivádím výstup PWM (PIN7 je TOSC2) nevím jestli mi to bude fungovat jako PWM výstup nebo mám raději použít výstup např OC1 nebo jiné OC.

Když nahraju tento program tak mám na výstupech PIN 7-4 okolo 0,5V a na PIN 3 mám 5V.

Nevím si s tím rady vsázím na to že mám špatně ty čísla kanálů zvolené, ale vůbec nevím jak je nastavit jinak v AtmelStudiju mi ten program jede bez ERRORU a WARNINGU takže jsem bezradný.

#define F_CPU 16000000UL // Definice hodinoveho signalu
#include <avr/io.h>
#include <util/delay.h> // Hlavickovy soubor pro zpozdeni
#include <avr/interrupt.h> // Hlavickovy soubor pro preruseni

#define buzeni ((255/5)*(125/100)); //Definovana hodnota buzeni na 1,25V

unsigned int Read_ADC(unsigned char channel)
{
ADMUX &= 0b01100111; // Cisla kanalu
ADMUX |= channel & 0b01100110;

ADCSRA |= (1 << ADSC);						// Start prevodu A/D


while(!(ADCSRA & (1<<ADIF)));				// Cekej na priznak skonceni prevodu


return ADC;									//  Navratova hodnota - vysledek A/D prevodu

}

double rozdilCidel=0; // Pro nacetni hodnoty do PWM

int main(void)
{

unsigned int adcVolant, adcNapravainverz, adcNaprava;

ADMUX |=  (1 << REFS0);						// Reference 5V + pridano ADLAR (pro rozliseni 8 bitu)

ADCSRA |= (1 << ADEN) | (1 << ADIF) | (1 <<ADPS2) | (1 <<ADPS1)  | (1 <<ADPS0);

											// Povoleni AD prevodniku, Interrupt flag, preddelicka 128 pri frekvenci hodin 8MHz

DDRA = 0x00;								// PORTA – nastaveni jako vstup
PORTA = 0x00;								// PORTA – vypnuti pull-up
DDRC = 0xFF;								// PORTC – nastaveni jako vystup
PORTC = 0x00;								// PORTC – vynulováni vystupu

DDRC |= (1<< PC7);							// Nastaveni vystup PWM

TCCR0 |= (1<< COM01)|(1<<WGM01)|(1<<WGM00);
TIMSK |= (1<<TOIE0);
OCR0 = (rozdilCidel/100)*255;				// Rozdil 0-255

sei();										// Povoleni globalniho preruseni

TCCR0 |= (1<<CS00);		
								
while(1)

{		
	adcVolant = Read_ADC(0);				// Mereni napeti volantu
	adcNapravainverz = Read_ADC(1);			// Mereni napeti napravy
	
	adcNaprava=5-adcNapravainverz;			// Otoceni smeru cidla
	
	_delay_ms(50);							// cekani 50ms


// Prepinani smeru toceni volantu			
if (adcVolant<adcNaprava)					// Zataceni doprava
	{						
		PORTC |= (0<<PC6);					// Vynulovani vystupu P1
		
		DDRC |= (1<<PC5);					// Vynulovani vystupu N1
		PORTC |= (0<<PC5);
				
		PORTC |= (0<<PC4);					// Vynulovani vystupu P2
		
		DDRC |= (1<<PC3);					// Vynulovani vystupu N2
		PORTC |= (0<<PC3);
		
		PORTC |= (1<<PC6);					// Zapnuti P1
		DDRC |= (0<<PC3);					// Stav vzsoke impedance N2
		
		rozdilCidel=(adcNaprava-adcVolant);	// Hodnota PWM
	}
else
	if (adcVolant>adcNaprava)				// Zataceni doleva	
	{
		PORTC |= (0<<PC6);					// Vynulovani vystupu P1
		
		DDRC |= (1<<PC5);					// Vynulovani vystupu N1
		PORTC |= (0<<PC5);
		
		PORTC |= (0<<PC4);					// Vynulovani vystupu P2
		
		DDRC |= (1<<PC3);					// Vynulovani vystupu N2
		PORTC |= (0<<PC3);
		
		PORTC |= (1<<PC5);					// Zapnuti P2
		DDRC |= (0<<PC4);					// Stav vzsoke impedance N1
		
		rozdilCidel=(adcVolant-adcNaprava);	// Hodnota PWM
	}
else
	if (adcVolant==adcNaprava)				// Bez pohybu, otevrenz smer pro buzeni motoru
	{
		if (adcVolant<0)
		{
			PORTC |= (0<<PC6);					// Vynulovani vystupu P1
			
			DDRC |= (1<<PC5);					// Vynulovani vystupu N1
			PORTC |= (0<<PC5);
			
			PORTC |= (0<<PC4);					// Vynulovani vystupu P2
			
			DDRC |= (1<<PC3);					// Vynulovani vystupu N2
			PORTC |= (0<<PC3);
			
			PORTC |= (1<<PC6);					// Zapnuti P1
			DDRC |= (0<<PC3);					// Stav vzsoke impedance N2
			
			rozdilCidel=buzeni;					// Nastaveni buzeni
		}
		else
			if (adcVolant>0)
			{
				PORTC |= (0<<PC6);					// Vynulovani vystupu P1
				
				DDRC |= (1<<PC5);					// Vynulovani vystupu N1
				PORTC |= (0<<PC5);
				
				PORTC |= (0<<PC4);					// Vynulovani vystupu P2
				
				DDRC |= (1<<PC3);					// Vynulovani vystupu N2
				PORTC |= (0<<PC3);
				
				PORTC |= (1<<PC5);					// Zapnuti P2
				DDRC |= (0<<PC4);					// Stav vzsoke impedance N1
				
				rozdilCidel=buzeni;					// Nastaveni buzeni
			}
		else
			if (adcVolant==0)
			{
				PORTC |= (0<<PC6);					// Vynulovani vystupu P1
				
				DDRC |= (1<<PC5);					// Vynulovani vystupu N1
				PORTC |= (0<<PC5);
				
				PORTC |= (0<<PC4);					// Vynulovani vystupu P2
				
				DDRC |= (1<<PC3);					// Vynulovani vystupu N2
				PORTC |= (0<<PC3);
									
				rozdilCidel=0;						// Rovna jizda
			}
	}
	
}

}
ISR (TIMER0_OVF_vect)
{
OCR0 = (rozdilCidel/100)*255;
}

Nabudúce ťa poprosím, aby si výpis programu dával do tagu “CODE”, ostanú tam odstredenia …

DDRC = 0xFF; // PORTC – nastaveni jako vystup 

Tu máš nastavený port c ako výstupný, nemusíš to písať pred každou zmenou na porte…

[code]if (adcVolant<adcNaprava) // Zataceni doprava
{
PORTC |= (0<<PC6); // Vynulovani vystupu P1

DDRC |= (1<<PC5); // Vynulovani vystupu N1
PORTC |= (0<<PC5);

PORTC |= (0<<PC4); // Vynulovani vystupu P2

DDRC |= (1<<PC3); // Vynulovani vystupu N2
PORTC |= (0<<PC3);

PORTC |= (1<<PC6); // Zapnuti P1
DDRC |= (0<<PC3); // Stav vzsoke impedance N2

rozdilCidel=(adcNaprava-adcVolant); // Hodnota PWM
} [/code]

Tak a teraz sa skúsme pozrieť na tento kód:

PORTC |= (0<<PC6); // Vynulovani vystupu P1
[/code] takto daný bit nevynuluješ, urobíš to príkazom [code]
PORTC = PORTC & ~(1 << PC6);

Skús si to naštudovať, celkom pekne je to popísané tuto : svetelektro.com/clanky/programujeme-avr-v-jazyku-c-2-cast-446.html

(snáď ma admin nezruší za odkaz na iné fórum)

Takže si to poupravuj v programe, poštuduj a ak bude nejaký problém, ozvi sa…

EDIT: Ako pozerám, rieši sa to už dlhšie v inom poste, čo som si nevšimol, takže toto poprosím zmazať, lebo tam to je tiež riešené.