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;
}