Skocz do zawartości

Pomoc w poprawności napisanego programy.Sterowanie silnikami.


polopoiu

Pomocna odpowiedź

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

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.