Sida 2 av 2

Re: Hjälp med kod!

Postat: 18 november 2012, 20:51:52
av Excl
nodanolo:

Jojo det förstår jag men vad för argument ska placeras där? Varje gång jag placerar något i read_convert() parentesen får jag bara ett felmeddelande (spelar ingen roll vad jag placerar i parentesen).
Samtidigt får jag även varningen 'main is normally a non-static function'. Vad beror detta på?

Re: Hjälp med kod!

Postat: 18 november 2012, 21:04:01
av Icecap
Argumentet väljer vilken analog kanal som ska användas.
unsigned int read_convert(unsigned char ch)
{
ADMUX = (ADMUX & ~15) | ch;//Väljer ADCx kanal

Du har skrivit
int main(void) - men du har ingen return(nånting) i slutet på main.

Deklarera hellre main som:
void main(void)

Re: Hjälp med kod!

Postat: 18 november 2012, 21:08:23
av sodjan
> Jojo det förstår jag men vad för argument ska placeras där?

Har du ens kollat vad read_convert använder parametern till?
Du har ju svaret i ditt eget program:
> DMUX = (ADMUX & ~15) | ch;//Väljer ADCx kanal

> Varje gång jag placerar något i read_convert() parentesen får jag bara
> ett felmeddelande (spelar ingen roll vad jag placerar i parentesen).

Om du varken anger vad du har försökt med eller vilket fel du fick,
så behöver vi knappt veta alls att du har försökt... :-)

> Samtidigt får jag även varningen 'main is normally a non-static function'. Vad beror detta på?

Det beror på att main() i en mikrokontroller aldrig avslutas och då behöver
den inte ha någon datatyp. Prova med "void main()" istället.

Re: Hjälp med kod!

Postat: 18 november 2012, 21:41:26
av snigelen
Excl skrev:Samtidigt får jag även varningen 'main is normally a non-static function'. Vad beror detta på?
Det beror på att du inte avslutat föregående funktion read_convert (det saknas en avslutande }), så kompilatorn tror att det är main en lokal funktion i read_convert (man kan inte ha lokala funktioner i standard C, men gcc stödjer det).

Re: Hjälp med kod!

Postat: 18 november 2012, 22:48:49
av sodjan
Hm, borde man inte få något om "unbalanced {}" eller liknande?
Eller är det syntaxtiskt OK att inte ha lika många { som } ?

Re: Hjälp med kod!

Postat: 19 november 2012, 09:05:15
av snigelen
Det kommer senare, sista felmeddelandet blir

Kod: Markera allt

main.c:57: error: expected declaration or statement at end of input
viket antyder att det t.ex fattas en '}' där. Den skulle egentligen vara tidigare, men eftersom man kan ha lokala funktioner i gcc så blir det fel först här.

Re: Hjälp med kod!

Postat: 19 november 2012, 11:38:50
av sodjan
Jaha, men borde inte även Excl ha fått det felet !?
Det stog inte ett skit om det...

Re: Hjälp med kod!

Postat: 19 november 2012, 12:01:54
av Nerre
Så som C fungerar är det inte alltid som kompilatorn kan avgöra om man har glömt att avsluta något på rätt sätt eller om man har råka inleda något annat på fel sätt.

Re: Hjälp med kod!

Postat: 19 november 2012, 12:48:27
av stekern
Jo han borde ha fått det felet (och fick det förmodligen), det andra är ju dessutom "bara" en varning som med default inställningar inte ens syns.

Re: Hjälp med kod!

Postat: 19 november 2012, 12:55:03
av sodjan
Med "expected declaration or statement" får man väl inte ens någon objekt fil (?).
Vilket inte heller påstogs, men i alla fall... :-)

Re: Hjälp med kod!

Postat: 19 november 2012, 14:19:50
av snigelen
Excl skrev bara första felet, sedan första varningen i ett senare inlägg. Om jag tar sista programmet på förra sidan, i detta inlägg, och försöker kompilera får jag följande

Kod: Markera allt

$ avr-gcc -c -Os -Wall -mmcu=atmega328p test.c
test.c: In function ‘read_convert’:
test.c:41: warning: ‘main’ is normally a non-static function
test.c: In function ‘main’:
test.c:47: error: too few arguments to function ‘read_convert’
test.c: In function ‘read_convert’:
test.c:60: error: expected declaration or statement at end of input
så någon objektfil har inte genererats.

Om jag lägger till en avslutande } i read_convert och byter ut main till detta

Kod: Markera allt

int main(void)
{
    init_ADC();
    init_PWM();
    DDRB|=(1<<PB5);// Pin PB5(OCR1A) är output
    DDRB|=(1<<PB6);//Pin PB6(OCR1B) är output
       
    while(1)
    {
        // read_ADC() returns a left adjusted result (or?...)
        // use >> 8 to get upper eight bits (or >>6 to get upper 10)
        OCR1A=read_convert(4) >> 8;//converterad värde läses på pin PB5      
        OCR1B=read_convert(5) >> 8;//converterad värde läses på pinPB6
    }
}
blir det inga fel eller varningar.

Trots att denna rad i read_convert inte gör någonting

Kod: Markera allt

      ADMUX | (1<<ADLAR);//Vänsterjustering av ADC resultet
Det är en tom sats, men kompilatorn måste nog generera en läsning av ADMUX eftersom den är volatile. Det skall troligen stå

Kod: Markera allt

      ADMUX |= (1<<ADLAR);//Vänsterjustering av ADC resultet
i stället. (Om man nu vill ha vänsterjusterat resultat) (men det kan man lika gärna flytta till init_ADC() i så fall).