Skocz do zawartości

Pomoc w poprawności napisanego programy.Sterowanie silnikami.


Pomocna odpowiedź

Napisano

Jestem dopiero początkujący w programowaniu w C i chciałbym się dowiedzieć co zrobiłem żle w programie.

silniki.c

//atmega8

#include <avr/io.h>
#include <avr/interrupt.h>

#include "silniki.h"

volatile uint8_t silnik_L, silnik_P;

int jazda_przod(L_silnik,P_silnik);
int jazda_tyl(L_silnik,P_silnik);
int obrot_lewo(L_silnik,P_silnik);
int obrot_prawo(L_silnik,P_silnik);

void silniki_init(void);

void silniki_init(void){
TCCR0 |= (1<<WGM01); //tryb CTC
TCCR0 |= (1<<CS01); //preskaler 1
OCR0=200;
TIMSK |= (1<<OCIE0);

sei();
}


ISR(TIMER0_COMP_vect)
{
DDRB |=(1<<PB0)|(1<<PB1);
PORTB|=(1<<PB0)|(1<<PB1);

  static uint8_t cnt=1;
  if(cnt<=silnik_L)PORTB|=(1<<PB0);else PORTB &= ~(1<<PB0);
  if(cnt<=silnik_P)PORTB|=(1<<PB1);else PORTB &= ~(1<<PB1);

  cnt++;
  if(cnt>100)cnt=1;
}

int jazda_przod(L_silnik,P_silnik,){
   DDRB|=S1_L|S2_L|S1_P|S2_P;
   silnik_L=L_silnik;
   PORTB &= ~S1_L;
   PORTB |= S2_L;

   silnik_P=P_silnik;
   PORTB &= ~S1_P;
   PORTB |= S2_P;


}
int jazda_tyl(L_silnik,P_silnik,){
DDRB|=S1_L|S2_L|S1_P|S2_P;
silnik_L=L_silnik;
   PORTB |= S1_L;
   PORTB &= ~S2_L;

   silnik_P=P_silnik;
   PORTB |= S1_P;
   PORTB &= ~S2_P;
}
int obrot_lewo(L_silnik,P_silnik,){
DDRB|=S1_L|S2_L|S1_P|S2_P;
silnik_L=L_silnik;
   PORTB |= S1_L;
   PORTB &= ~S2_L;

   silnik_P=P_silnik;
   PORTB &= ~S1_P;
   PORTB |= S2_P;
}
int obrot_prawo(L_silnik,P_silnik,){
DDRB|=S1_L|S2_L|S1_P|S2_P;
silnik_L=L_silnik;
   PORTB &= ~S1_L;
   PORTB |= S2_L;

   silnik_P=P_silnik;
   PORTB |= S1_P;
   PORTB &= ~S2_P;
}

silniki.h

#ifndef _silniki_h
#define _silniki_h

#define S1_L (1<<PB2)
#define S2_L (1<<PB3)
#define S1_P (1<<PB4)
#define S2_P (1<<PB5)

void silniki_init(void);

int jazda_przod(L_silnik,P_silnik);
int jazda_tyl(L_silnik,P_silnik);
int obrot_lewo(L_silnik,P_silnik);
int obrot_prawo(L_silnik,P_silnik);

#endif

__________

Komentarz dodany przez: Treker

Program się nie kompiluje czy kompiluje ale nie chce działać?? Czy kompilator daje jakiś komunikat?? Jakie są w ogóle objawy złego działania programu??

Nie kompiluje.

Wywala:

**** Build of configuration Debug for project silniki ****

make all

Building file: ../silniki.c

Invoking: AVR Compiler

avr-gcc -Wall -g2 -gstabs -O0 -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=8000000UL -MMD -MP -MF"silniki.d" -MT"silniki.d" -c -o"silniki.o" "../silniki.c"

In file included from ../silniki.c:6:

../silniki.h:11: warning: parameter names (without types) in function declaration

../silniki.h:12: warning: parameter names (without types) in function declaration

../silniki.h:13: warning: parameter names (without types) in function declaration

../silniki.h:14: warning: parameter names (without types) in function declaration

../silniki.c:10: warning: parameter names (without types) in function declaration

../silniki.c:11: warning: parameter names (without types) in function declaration

../silniki.c:12: warning: parameter names (without types) in function declaration

../silniki.c:13: warning: parameter names (without types) in function declaration

../silniki.c: In function 'silniki_init':

../silniki.c:18: error: 'WGM01' undeclared (first use in this function)

../silniki.c:18: error: (Each undeclared identifier is reported only once

../silniki.c:18: error: for each function it appears in.)

../silniki.c:20: error: 'OCR0' undeclared (first use in this function)

../silniki.c:21: error: 'OCIE0' undeclared (first use in this function)

../silniki.c: At top level:

../silniki.c:27: warning: 'TIMER0_COMP_vect' appears to be a misspelled signal handler

../silniki.c: In function 'jazda_przod':

../silniki.c:40: warning: type of 'L_silnik' defaults to 'int'

../silniki.c:40: warning: type of 'P_silnik' defaults to 'int'

../silniki.c:40: warning: type of 'czas' defaults to 'int'

../silniki.c:51: warning: control reaches end of non-void function

../silniki.c: In function 'jazda_tyl':

../silniki.c:52: warning: type of 'L_silnik' defaults to 'int'

../silniki.c:52: warning: type of 'P_silnik' defaults to 'int'

../silniki.c:52: warning: type of 'czas' defaults to 'int'

../silniki.c:61: warning: control reaches end of non-void function

../silniki.c: In function 'obrot_lewo':

../silniki.c:62: warning: type of 'L_silnik' defaults to 'int'

../silniki.c:62: warning: type of 'P_silnik' defaults to 'int'

../silniki.c:62: warning: type of 'czas' defaults to 'int'

../silniki.c:71: warning: control reaches end of non-void function

../silniki.c: In function 'obrot_prawo':

../silniki.c:72: warning: type of 'L_silnik' defaults to 'int'

../silniki.c:72: warning: type of 'P_silnik' defaults to 'int'

../silniki.c:72: warning: type of 'czas' defaults to 'int'

../silniki.c:81: warning: control reaches end of non-void function

make: *** [silniki.o] Error 1

int jazda_przod(L_silnik,P_silnik); 
int jazda_tyl(L_silnik,P_silnik); 
int obrot_lewo(L_silnik,P_silnik); 
int obrot_prawo(L_silnik,P_silnik); 

A gdzie typy zmiennych parametrycznych?

I po kiego czorta deklarujesz dwa razy? Poćwicz najpierw programowanie konsolowe w C/C++ dla Windows (np. środowisko Visual C++), żeby ogarnąć język, a dopiero potem wróć do mikrokontrolerów.

Zrobiłem tak:

silniki.c

#include <avr/io.h>
#include <avr/interrupt.h>

#include "silniki.h"

volatile uint8_t silnik_L, silnik_P;




void silniki_init(void){
TCCR0 |= (1<<WGM01); //tryb CTC
TCCR0 |= (1<<CS01); //preskaler 1
OCR0=200;
TIMSK |= (1<<OCIE0);

sei();
}


ISR(TIMER0_COMP_vect)
{
   DDRB |=(1<<PB0)|(1<<PB1);
   PORTB|=(1<<PB0)|(1<<PB1);

  static uint8_t cnt=1;
  if(cnt<=silnik_L)PORTB|=(1<<PB0);else PORTB &= ~(1<<PB0);
  if(cnt<=silnik_P)PORTB|=(1<<PB1);else PORTB &= ~(1<<PB1);

  cnt++;
  if(cnt>100)cnt=1;
}

int jazda_przod(char L_silnik,char P_silnik,){
   DDRB|=S1_L|S2_L|S1_P|S2_P;
   silnik_L=L_silnik;
   PORTB &= ~S1_L;
   PORTB |= S2_L;

   silnik_P=P_silnik;
   PORTB &= ~S1_P;
   PORTB |= S2_P;


}
int jazda_tyl(char L_silnik, char P_silnik,){
   DDRB|=S1_L|S2_L|S1_P|S2_P;
   silnik_L=L_silnik;
   PORTB |= S1_L;
   PORTB &= ~S2_L;

   silnik_P=P_silnik;
   PORTB |= S1_P;
   PORTB &= ~S2_P;
}
int obrot_lewo(char L_silnik,char P_silnik,){
   DDRB|=S1_L|S2_L|S1_P|S2_P;
   silnik_L=L_silnik;
   PORTB |= S1_L;
   PORTB &= ~S2_L;

   silnik_P=P_silnik;
   PORTB &= ~S1_P;
   PORTB |= S2_P;
}
int obrot_prawo(char L_silnik,char P_silnik,){
   DDRB|=S1_L|S2_L|S1_P|S2_P;
   silnik_L=L_silnik;
   PORTB &= ~S1_L;
   PORTB |= S2_L;

   silnik_P=P_silnik;
   PORTB |= S1_P;
   PORTB &= ~S2_P;
}

silniki.h

#ifndef SILNIKI_H_
#define SILNIKI_H_

#define S1_L (1<<PB2)
#define S2_L (1<<PB3)
#define S1_P (1<<PB4)
#define S2_P (1<<PB5)

void silniki_init(void);

#define jazda_przod( L_silnik, P_silnik)
#define jazda_tyl( L_silnik, P_silnik)
#define obrot_lewo( L_silnik, P_silnik)
#define obrot_prawo( L_silnik, P_silnik)

#endif /* SILNIKI_H_ */

Ale przy funkcjach pisze że

Multiple markers at this line

- Macro usage error for macro : jazda_przod

- macro "jazda_przod" passed 3 arguments, but

takes just 2

- expected '=', ',', ';', 'asm' or '__attribute__' before

'{' token

- Syntax error

int jazda_przod(char L_silnik,char P_silnik,)
int jazda_tyl(char L_silnik, char P_silnik,)
int obrot_prawo(char L_silnik,char P_silnik,)
int obrot_lewo(char L_silnik,char P_silnik,)

Usuń przecinki z końców.

I w deklaracjach chyba też warto napisać typy zmiennych. No i nie rozumiem, dlaczego używasz #define. Może wytłumaczysz? Od razu mówię, że mało się znam i może tak się robi.

Poprawiłem:

silniki.c

#include <avr/io.h>
#include <avr/interrupt.h>

#include "silniki.h"

volatile uint8_t silnik_L, silnik_P;




void silniki_init(void){
TCCR0 |= (1<<WGM01); //tryb CTC
TCCR0 |= (1<<CS01); //preskaler 1
OCR0=200;
TIMSK |= (1<<OCIE0);

sei();
}


ISR(TIMER0_COMP_vect)
{
   DDRB |=(1<<PB0)|(1<<PB1);
   PORTB|=(1<<PB0)|(1<<PB1);

  static uint8_t cnt=1;
  if(cnt<=silnik_L)PORTB|=(1<<PB0);else PORTB &= ~(1<<PB0);
  if(cnt<=silnik_P)PORTB|=(1<<PB1);else PORTB &= ~(1<<PB1);

  cnt++;
  if(cnt>100)cnt=1;
}

int jazda_przod(uint8_t L_silnik, uint8_t P_silnik){
   DDRB|=S1_L|S2_L|S1_P|S2_P;
   silnik_L=L_silnik;
   PORTB &= ~S1_L;
   PORTB |= S2_L;

   silnik_P=P_silnik;
   PORTB &= ~S1_P;
   PORTB |= S2_P;


}
int jazda_tyl(uint8_t L_silnik, uint8_t P_silnik){
   DDRB|=S1_L|S2_L|S1_P|S2_P;
   silnik_L=L_silnik;
   PORTB |= S1_L;
   PORTB &= ~S2_L;

   silnik_P=P_silnik;
   PORTB |= S1_P;
   PORTB &= ~S2_P;
}
int obrot_lewo(uint8_t L_silnik, uint8_t P_silnik){
   DDRB|=S1_L|S2_L|S1_P|S2_P;
   silnik_L=L_silnik;
   PORTB |= S1_L;
   PORTB &= ~S2_L;

   silnik_P=P_silnik;
   PORTB &= ~S1_P;
   PORTB |= S2_P;
}
int obrot_prawo(uint8_t L_silnik, uint8_t P_silnik){
   DDRB|=S1_L|S2_L|S1_P|S2_P;
   silnik_L=L_silnik;
   PORTB &= ~S1_L;
   PORTB |= S2_L;

   silnik_P=P_silnik;
   PORTB |= S1_P;
   PORTB &= ~S2_P;
}

silniki.h

#ifndef SILNIKI_H_
#define SILNIKI_H_

#define S1_L (1<<PB2)
#define S2_L (1<<PB3)
#define S1_P (1<<PB4)
#define S2_P (1<<PB5)

void silniki_init(void);

int jazda_przod(uint8_t L_silnik, uint8_t P_silnik);
int jazda_tyl(uint8_t L_silnik, uint8_t P_silnik);
int obrot_lewo(uint8_t L_silnik, uint8_t P_silnik);
int obrot_prawo(uint8_t L_silnik, uint8_t P_silnik);

#endif /* SILNIKI_H_ */

Tylko przy zmiennych dotyczący przerwań:

TCCR0 |= (1<

TCCR0 |= (1<

OCR0=200;

TIMSK |= (1<

Pisze przy nich:

'WGM01' undeclared (first use in this function)

Mam ściągnięte biblioteki.

[ Dodano: 15-11-2012, 20:00 ]

W końcu mi się udało.

[ Dodano: 15-11-2012, 20:00 ]

W końcu mi się udało.

Napisz gdzie był błąd, żeby inni wiedzieli.

Wg mnie timer0 nie ma trybu CTC. Ale nie chciało mi się zagłębiać w datasheet.

Napisz gdzie był błąd, żeby inni wiedzieli.

Wg mnie timer0 nie ma trybu CTC. Ale nie chciało mi się zagłębiać w datasheet.

Dokładnie.

Na początku pisałem ten kod na Atmega32, i zapomniałem przestawić timer0 na timer2, gdy chciałem użyć go na Atmega8.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...