Jesses följetång om AVR programmering i C...
Re: lite undringar om AVR progrannering i C
Jo, för att ibland när jag ville debugga koden i AVR Studio så vill jag stänga av kod optimeringen så att singel steppningen ska funka enligt C-koden. Och då kanske man inte vill hålla på och ändra tillbaks till optimering igen för att testa i hårdvara.
Så därför klippte jag in det som assemblerkod för att alltid vara säker på att jag får den kod som jag vill ha (som funkar).
Så därför klippte jag in det som assemblerkod för att alltid vara säker på att jag får den kod som jag vill ha (som funkar).
Re: lite undringar om AVR progrannering i C
För att få den optimerade versionen oavsett vad man ber kompilatorn om?
edit: Mr M hann emellan...
edit: Mr M hann emellan...
Re: lite undringar om AVR progrannering i C
Mr M. Precis så gjorde jag också, av ren lathet. Jag kan assemböer, men orkade inte slå upp adressen för det register jag skulle ändra i
(Ni andra: läs lite längre upp i tråden så förstår du varför jag och Mr M klistade in assemberkoden.)

(Ni andra: läs lite längre upp i tråden så förstår du varför jag och Mr M klistade in assemberkoden.)
#include "blabla.h"
Nu blir jag tokig när jag ska dela upp programmet i flera filer!
Jag har gjort ett program som ligger i en fil : uarttest.c, där jag gjort några buffrade uart-funktioner samt ett huvudprogram som testar dem.
Nu är jag nöjd med uart-funktionerna och tänkte lyfta in dem i mitt lilla projekt. Därför vill jag separera dem från huvudfilen och skapa
uart.c
uart.h
Men hur sjutton jag än fixar och donar så kommer grejerna i fel ordning.
Jag har också delat upp huvudprogrammet uarttest i två delar: uarttest.h och uarttest.c.
Dessa innehåller bl.a:
uarttest.h:
uarttest.c
och mina uart-funktioner i:
uart.h
uart.c
Error: ../uart.c:6: error: 'F_OSC' undeclared (first use in this function)
(i avr-gcc's projektfönster har jag lagt uattest.c och uart.c i "källfiler" och uarttest.h och uart.h i "header files")
Efter att ha gjort lite ändringar, bl.a. lagt in #include "uarttest.h" även i uart.c så får jag andra fel...
nu blir jag tokig... det blir mer och mer kaos... 
Jag har gjort ett program som ligger i en fil : uarttest.c, där jag gjort några buffrade uart-funktioner samt ett huvudprogram som testar dem.
Nu är jag nöjd med uart-funktionerna och tänkte lyfta in dem i mitt lilla projekt. Därför vill jag separera dem från huvudfilen och skapa
uart.c
uart.h
Men hur sjutton jag än fixar och donar så kommer grejerna i fel ordning.
Jag har också delat upp huvudprogrammet uarttest i två delar: uarttest.h och uarttest.c.
Dessa innehåller bl.a:
uarttest.h:
Kod: Markera allt
#ifndef UARTTEST_H
#define UARTTEST_H
#define F_OSC 8000000UL
#define BAUDRATE 19200UL
#include "eeprom.h" // används för att skicka konstanta textsträngar från eeprom.
....
#endif
Kod: Markera allt
#include <avr/interrupt.h>
#include <stdint.h>
#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include "uarttest.h"
#include "uart.h"
#include "eeprom.h"
....
int main( void ) { ...
uart.h
Kod: Markera allt
.... diverse globala variabler ....
.... funktionsdeklarationerna ....
Kod: Markera allt
#include "uart.h"
void uart0_init(void){ // ----- initiera UART0 -----
#define BAUD_PRESCALE (F_OSC/(16*BAUDRATE)-1)
UBRR0L = BAUD_PRESCALE & 0xff;
.... osv....
}
.... osv ...
Error: ../uart.c:6: error: 'F_OSC' undeclared (first use in this function)
(i avr-gcc's projektfönster har jag lagt uattest.c och uart.c i "källfiler" och uarttest.h och uart.h i "header files")
Efter att ha gjort lite ändringar, bl.a. lagt in #include "uarttest.h" även i uart.c så får jag andra fel...
Kod: Markera allt
avr-gcc -mmcu=atmega324p -Wl,-Map=uarttest.map uarttest.o uart.o -o uarttest.elf
uart.o: In function `uart0_init':
C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uart.c:7: multiple definition of `uaflag'
uarttest.o:C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uarttest.c:20: first defined here
uart.o: In function `uart0_init':
C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uart.c:7: multiple definition of `uartInbufpos'
uarttest.o:C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uarttest.c:20: first defined here
uart.o: In function `uart0_init':
C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uart.c:7: multiple definition of `uartInbufRead'
uarttest.o:C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uarttest.c:20: first defined here
uart.o:(.eeprom+0x13e): multiple definition of `retur'
uarttest.o:(.eeprom+0x13e): first defined here
uart.o:(.eeprom+0x0): multiple definition of `welcome'
uarttest.o:(.eeprom+0x0): first defined here
uart.o:(.eeprom+0x137): multiple definition of `BMSprompt'
uarttest.o:(.eeprom+0x137): first defined here
uart.o: In function `uart0_init':
C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uart.c:7: multiple definition of `uartSendbufWrite'
uarttest.o:C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uarttest.c:20: first defined here
uart.o: In function `uart0_init':
C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uart.c:7: multiple definition of `uartSendbufRead'
uarttest.o:C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uarttest.c:20: first defined here
make: *** [uarttest.elf] Error 1
Build failed with 1 errors and 0 warnings...

Re: lite undringar om AVR progrannering i C
Hur definieras F_OSC för user.c ?
(D.v.s i första fallet)
De andra "felen" kan man väl undvika genom ifdef/endif i h-filerna.
(D.v.s i första fallet)
De andra "felen" kan man väl undvika genom ifdef/endif i h-filerna.
Re: lite undringar om AVR progrannering i C
jag tänker mig att F_OSC definieras i huvudprogrammets uarttest.h och ska inte behöva deklarareras i uart.c
De andra fallen: jag har ifndef... i alla .h-filer.
Men den verkar tycka att variablerna definieras igen inne i koden där de används!
De andra fallen: jag har ifndef... i alla .h-filer.
Men den verkar tycka att variablerna definieras igen inne i koden där de används!
Re: lite undringar om AVR progrannering i C
Om man BÅDA inkludera i projektet OCH inkluderar filerna via #include kan man få detta fenomen.
Välj alltså ena eller andra vägen, inte båda.
Välj alltså ena eller andra vägen, inte båda.
Re: lite undringar om AVR progrannering i C
> jag tänker mig att F_OSC definieras i huvudprogrammets uarttest.h och ska inte behöva deklarareras i uart.c
Är det inte separatkompilering ?
D.v.a att uart.c kompileras fristående från övriga c filer ?
D.v.s att när uart kompileras så är det enbart uart.c och uart.h som används,
övriga filer känner kompilatorn inte till vid det tillfället.
Är det inte separatkompilering ?
D.v.a att uart.c kompileras fristående från övriga c filer ?
D.v.s att när uart kompileras så är det enbart uart.c och uart.h som används,
övriga filer känner kompilatorn inte till vid det tillfället.
Re: lite undringar om AVR progrannering i C
Helt rätt sodjan, varje .c-fil kompileras i helt skiljda kontexter. F_OSC defineras automatiskt i AVR Studio om man anger klockfrekvensen i projektinställningarna.
Re: lite undringar om AVR progrannering i C
>Är det inte separatkompilering ?
Jo, det verkar det vara. Därför har jag med #include "uarttest.h" inne i "uart.h" för att få med definitionerna från huvudprogrammet. Så det löste jag.
Nu verkar resten ha löst sig också. Förvirringen är stor kring vad som ska vara i .h erspektive .c filerna!
Jag definierade globala variabler i uart.h - det var felet. De ska ligga i en .c-fil. Jag lade dem i uarttest.h men då kom jag inte åt dem från funktioner i uart.c.... Efter lite sökande på nätet lärde jag mig ett nytt ord: extern!
Globala variabler som ska användas i mer än en programfil måste deklareras i .h med "extern" före och sedan initieras i .c ....
t.ex.
main.h:
och main.c:
så löste sig det också
.... men det tar rejält med tid att fastna i sådana här detaljer
och errorkoderna talar ju sällan om vad ursprungsfelet ligger...
>F_OSC defineras automatiskt i AVR Studio om man anger klockfrekvensen i projektinställningarna.
Nja.... jag har skrivit in en klockfrekvens i projektbeskrivningen, men F_OSC definieras inte. Den verkar istället heta någonting annat (hittar den inte just nu).
Jo, det verkar det vara. Därför har jag med #include "uarttest.h" inne i "uart.h" för att få med definitionerna från huvudprogrammet. Så det löste jag.
Nu verkar resten ha löst sig också. Förvirringen är stor kring vad som ska vara i .h erspektive .c filerna!
Jag definierade globala variabler i uart.h - det var felet. De ska ligga i en .c-fil. Jag lade dem i uarttest.h men då kom jag inte åt dem från funktioner i uart.c.... Efter lite sökande på nätet lärde jag mig ett nytt ord: extern!
Globala variabler som ska användas i mer än en programfil måste deklareras i .h med "extern" före och sedan initieras i .c ....
t.ex.
main.h:
Kod: Markera allt
extern uint8_t EEMEM welcome[];
Kod: Markera allt
uint8_t EEMEM welcome[]="Välkommen!";


>F_OSC defineras automatiskt i AVR Studio om man anger klockfrekvensen i projektinställningarna.
Nja.... jag har skrivit in en klockfrekvens i projektbeskrivningen, men F_OSC definieras inte. Den verkar istället heta någonting annat (hittar den inte just nu).
Re: lite undringar om AVR progrannering i C
Det är väl liksom så det alltid fungerar med flera källkodsfiler.
Filerna kompileras var för sig och länkas sen ihop.
Och för att de ska kunna länkas ihop så måste gemensamma symboler vara deklararade i alla "kompilationer".
Filerna kompileras var för sig och länkas sen ihop.
Och för att de ska kunna länkas ihop så måste gemensamma symboler vara deklararade i alla "kompilationer".
Re: lite undringar om AVR progrannering i C
> men F_OSC definieras inte. Den verkar istället heta någonting annat
Då kanske det är det där "någonting annat" som du ska använda istället för F_OSC...
Då kanske det är det där "någonting annat" som du ska använda istället för F_OSC...
Re: lite undringar om AVR progrannering i C
Inte helt ovanligt att den heter F_CPU i vissa projekt.
Re: lite undringar om AVR progrannering i C
Det jesse behöver är en grundkurs i C, det är på tok för många förvirringar på en och samma gång för att på ett sakligt sätt kunna räta ut dem en och en och förklara varför det blir si och varför det blir så.
Jag rekommenderar den här boken. Läs den pärm till pärm.
Jag rekommenderar den här boken. Läs den pärm till pärm.
Re: lite undringar om AVR progrannering i C
Problemet att grundkurser i C oftast inte kommer till dessa saker. Jag har tre böcker hemma just nu, inte i någon av dem nämns hur man gör ett projekt med mer än en källfil! Ändå är en av dem på 595 sidor!
Men du ar väl rätt, jag skulle vilja ha en bra grundöversikt på över språket och programmeringsmiljön.
Boken du hänvisar till verkar finnas även på svenska!
Men du ar väl rätt, jag skulle vilja ha en bra grundöversikt på över språket och programmeringsmiljön.
Boken du hänvisar till verkar finnas även på svenska!