Netušené chyby - warning: implicit declaration of function

Dobrý den, s mikročipy začínám, mám tady zjevně několik chyb, ale nemůžu přijít na to, kde a proč jsou to chyby, mohli byste mi poradit prosím? Program má dvě funkce, přes RS232 pošle nebo přijme údaje a zkontroluje je. Dva z údajů jsou PWM.

[code]#include <avr/io.h> // definice periferii procesoru
#include <avr/interrupt.h> // definice funkci pro rizeni preruseni

int pwml,pwmp,l1,p1,l2,p2,pwml1,pwmp1,l11,p11,l21,p21;

int posli(){
int a;
a = getchar();
putchar(a);
PORTA.0 = PINA.0 ^ 0b00000001;
return a;
}

void posli2(int a){
int a1;
putchar(a);
a1 = getchar();
if (a == a1){
PORTA.0 = PINA.0 ^ 0b00000001;
}
}

int main(void){
DDRA=0b00000001;
DDRD=0b11111111;
//UART initialization
//Comunication Parameters: 8 Data, 1 Stop, No Parity
//UART Receiver: Off
//UART Transmitter: On
//UART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
DDRD=0b00001010
TCCR1A=0x33;
TCCR1B=0x1D;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x55;
OCR1AL=0x55;
OCR1BH=0x00;
OCR1BL=0x50;
TCCR1B |= ( 1 << WGM13 ) | ( 1 << WGM12 );
TCCR1A |= ( 0 << WGM11 ) | ( 0 << WGM10 );
// top pro citac
ICR1 = 12500 - 1;
// clk / 64
TCCR1B |= ( 0 << CS12 ) | ( 1 << CS11 ) | ( 1 << CS10 );
// povoleni preruseni IC
TIMSK |= ( 1 << TICIE1 );

// globalni maska preruseni
sei();
while( 1 );
return 0;

}

SIGNAL ( SIG_INPUT_CAPTURE1 ){
l1=PIND.2;
l2=PIND.3;
pwml=OCR1B;
p1=PIND.6;
p2=PIND.7;
pwmp=OCR1A;

l1=posli();
l2=posli();
pwml=posli();
p1=posli();
p2=posli();
pwmp=posli();

PORTD.2=l1;
PORTD.3=l2;
OCR1B=pwml;
PORTD.6=p1;
PORTD.7=p2;
OCR1A=pwmp;

}[/code]

chyby jsou:

Build started 6.2.2010 at 20:25:26 avr-gcc -mmcu=atmega16 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT auto.o -MF dep/auto.o.d -c ../auto.c ../auto.c: In function 'posli': ../auto.c:8: warning: implicit declaration of function 'getchar' ../auto.c:9: warning: implicit declaration of function 'putchar' ../auto.c:10: error: expected ';' before numeric constant ../auto.c: In function 'posli2': ../auto.c:19: error: expected ';' before numeric constant ../auto.c: In function 'main': ../auto.c:37: error: called object '10' is not a function ../auto.c: In function '__vector_5': ../auto.c:61: error: expected ';' before numeric constant ../auto.c:62: error: expected ';' before numeric constant ../auto.c:64: error: expected ';' before numeric constant ../auto.c:65: error: expected ';' before numeric constant ../auto.c:75: error: expected ';' before numeric constant ../auto.c:76: error: expected ';' before numeric constant ../auto.c:78: error: expected ';' before numeric constant ../auto.c:79: error: expected ';' before numeric constant make: *** [auto.o] Error 1 Build failed with 11 errors and 2 warnings...

Děkuji za odpověď.

:arrow_right: administrator: přejmenováno z "Netušené chyby"

:arrow_right: administrator: příspěvek byl upraven

Před deklaraci globální proměnné, se kterou pracuješ v přerušení dej “volatile”.
Pro použití getchar() je nutný hlavičkový soubor stdio.h. V C nejde pracovat s jednotlivými bity přímo jako PORTA.0 = PINA.0 ^ 0b00000001;. Předpokládám, že to má být negace bitu. Tu provedeš buď zapsáním 1 do registru PIN patřičného portu na patřičné místo (pokud toto daný procesor podporuje - viz. datasheet) nebo následujícím kódem:

if(PINA & (1<<PA0)) { PORTA &= ~(1<<PA0); } else { PORTA |= 1<<PA0; }

Takže ani v tom přerušení nemůžu dělat jen s bity? proto mi to hází ty středníky?

ještě jsou tam potom tyhle tři:

…/auto.c:8: warning: implicit declaration of function ‘getchar’
…/auto.c:9: warning: implicit declaration of function ‘putchar’
…/auto.c: In function ‘main’:
…/auto.c:51: error: called object ‘10’ is not a function
…/auto.c: In function ‘__vector_5’:

Vypadá to, že tam stále nemáš includovaný stdio.h Vlož sem opravený kód (pokud moždo do tagu code).

Je to divný, ale hlásí, že stdio.h není v tý složce, jako ty ostatní… musim to udělat tahle, aby se to zlepšilo:

#include <avr/io.h>		// definice periferii procesoru
#include <avr/interrupt.h>	// definice funkci pro rizeni preruseni
#include <stdio.h>

volatile int pwml,pwmp,l1,p1,l2,p2,pwml1,pwmp1,l11,p11,l21,p21;

int posli(){
	int a;
	a = getchar();  
	putchar(a);
	if(PINA & (1<<PA0)) 
	{ 
	   PORTA &= ~(1<<PA0); 
	} 
	else 
	{ 
	   PORTA |= 1<<PA0; 
	};
	return a;
}

void posli2(int a){
	int a1;
	putchar(a);
	a1 = getchar();  
	if (a == a1){
		if(PINA & (1<<PA0)) 
		{ 
		   PORTA &= ~(1<<PA0); 
		} 
		else 
		{ 
		   PORTA |= 1<<PA0; 
		};
	}
}

int main(void){
	DDRA=0b00000001;
	DDRD=0b11111111;
	//UART initialization
	//Comunication Parameters: 8 Data, 1 Stop, No Parity
	//UART Receiver: Off
	//UART Transmitter: On
	//UART Baud rate: 9600
	UCSRA=0x00;  
	UCSRB=0x18;  
	UCSRC=0x86;  
	UBRRH=0x00;  
	UBRRL=0x33;
	DDRD=0b00001010
!	TCCR1A=0x33;
	TCCR1B=0x1D;
	TCNT1H=0x00;
	TCNT1L=0x00;
	OCR1AH=0x55;
	OCR1AL=0x55;
	OCR1BH=0x00;
	OCR1BL=0x50;
	TCCR1B	|= ( 1 << WGM13 ) | ( 1 << WGM12 );
	TCCR1A	|= ( 0 << WGM11 ) | ( 0 << WGM10 );
	// top pro citac
	ICR1	= 12500 - 1;
	// clk / 64
	TCCR1B	|= ( 0 << CS12 ) | ( 1 << CS11 ) | ( 1 << CS10 );
	// povoleni preruseni IC
	TIMSK	|= ( 1 << TICIE1 );

	// globalni maska preruseni
	sei();
	while( 1 );
	return 0;
}

SIGNAL ( SIG_INPUT_CAPTURE1 ){
!   l1=PIND.2;
!   l2=PIND.3;
   pwml=OCR1B;
!  p1=PIND.6;
!   p2=PIND.7;
   pwmp=OCR1A;

   l1=posli();
   l2=posli();
   pwml=posli();
   p1=posli();
   p2=posli();
   pwmp=posli(); 

!   PORTD.2=l1;
!   PORTD.3=l2;
   OCR1B=pwml;
!   PORTD.6=p1;
!   PORTD.7=p2;
   OCR1A=pwmp;

}


Build started 7.2.2010 at 10:06:06
avr-gcc  -mmcu=atmega16 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT auto.o -MF dep/auto.o.d  -c  ../auto.c
../auto.c: In function 'main':
../auto.c:52: error: called object '10' is not a function
../auto.c: In function '__vector_5':
../auto.c:76: error: expected ';' before numeric constant
../auto.c:77: error: expected ';' before numeric constant
../auto.c:79: error: expected ';' before numeric constant
../auto.c:80: error: expected ';' before numeric constant
../auto.c:90: error: expected ';' before numeric constant
../auto.c:91: error: expected ';' before numeric constant
../auto.c:93: error: expected ';' before numeric constant
../auto.c:94: error: expected ';' before numeric constant
make: *** [auto.o] Error 1
Build failed with 9 errors and 0 warnings...

Udělám nahoře vykřičníky, u čeho to je. Jestli teda za to můžou ty piny, a mám nastavovat celý port, tak mi poraďte, co na portu D s těmi prvními dvěma, na průchod USARTu?

uz sme ti hovorili ze PORT.2 nefunguje musis pouzit to co ti poradil kolega vysie

DDRD=0b00001010 tu ti chyba bodkociarka…
! TCCR1A=0x33;

Teď jsou to ty negace před názvy registrů a opět jakási snaha o bitový přístuk, který, opakuji, v C NELZE.
V main máš toto:
DDRD=0b00001010
! TCCR1A=0x33;
Za prvním řádkem ti chybí středník, druhý řádek určitě nebude dělat co chceš. “!” je totiž logická nehace. TCCR1A je adresa registru, tedy nějaké nenulové číslo. Po logické negaci z něho bude nula a to bínární číslo tedy zapíšeš na adresu 0. To pravděpodobně nechceš :wink:
! PORTD.7=p2; // pokud ten řádek má znamenat zápis negované logické hodnoty a “p2” na pin PD7, bude ód následující

if(p2) { // p2 je true (=neni nula) PORTD &= ~(1<<PD7); // zápis nuly na pin } else { PORTD |= 1<<PD7; }
A ještě detail - za složenými závorkami se nepíše středník, ten se píše jen za příkazy.

edit: hmm, zas jsem pomalej :slight_smile:

Ale na atmega16 jena protu D první dva piny TDX a RDX na komunikaci a já nevím, co jim nastavit za hodnotu.

Pokud sériovou linku nepouíváš, tak tě ty piny nemusejí zajímat. Každopádně zápis “PORTD &= ~(1<<PD7); // zápis nuly na pin” modifikuje JEN pin 7 portu D.

Už to funguje, předělal jsem to takhle, je to správně? Děkuju za pomoc.

if (l1 == 0) PORTD &= ~(1<<PD2);
if (l1 == 1) PORTD |= (1<<PD2);

ide to aj takto:
if (l1) PORTD |= (1<<PD2); else PORTD &= ~(1<<PD2);

tyka sa if a podmienok

Este toto #define tl (PINB & (1<<PB0))

if (tl) pri log 1 vykona funkciu
if (tl==0) pri log 0 vykona funkciu - to by malo ist napisaj aj ako to prve len pouzitim negacie.

a co při smyčce… nebude se to jen měnit? potřebuju, aby to nastavovalo portu 1 nebo 0 přesně

Preco by sa to malo menit dokedy plati podmienka tak sa vvykonava dany prikaz.

ak si narazal na toto if (tl) pri log 1 vykona funkciu
if (tl==0) pri log 0 vykona funkciu - to by malo ist napisaj aj ako to prve len pouzitim negacie.

myslel som to takto if (!tl) pri log 0 vykona funkciu

prosím vysvětlil bys mi, co ty dva příkazy vlastně dělají?

No tie dva skoro nic, ale ked pouzijes aj definiciu pre TL co je vysie tak umoznuje testovat stav na porte respektive konkretnom pine konkretne PINe PB0 na porte B.

Napriklad tlacitko ako v tomto pripade. Na zaklade podmienky sa vykona prikaz bud ked je tlacidlo stlacene, alebo uvolnene, Samozrejme k tomu patri este nastavenie daneho pinu do vstupneho rezimu.

Atlan: tilda (~) je bitová negace, ta tu nelze použít. Do if se dává logická (!). if(!tl)…

mě jde o tu změnu pinů, co v tom vlastně dělá:
PORTD &= ~(1<<PD2)
a co:
PORTD |= (1<<PD2);

pity mas pravdu chybicka se vlodi…a teda riadna >D

PORTD &= ~(1<<PD2) nastavy vystup PD2 do log0
a co:
PORTD |= (1<<PD2); nastavi vystup PD2 do log1

děkuju

A není tam špatně to getchat, kam se snažim narvat int?