To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
-
Laik
- Użytkownik
- Posty: 242
- Rejestracja: 21 maja 2007, 19:19
- Lokalizacja: z nienacka
Post
autor: Laik » 24 sie 2008, 12:44
Witam. Uczę się z tego kursu i widzę problem. Otóż wyskakują błędy po wpisaniu tego programu:
Kod: Zaznacz cały
////////////////////////////////////////////////////////
// Nauka programowania uC AVR //
// //
// At90s2123 - Wyswietlacz 4x7seg //
////////////////////////////////////////////////////////
#include <avr/io.h>
#include <inttypes.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
//Definicje wyprowadzeń
#define LED_A 0
#define LED_B 1
#define LED_C 2
#define LED_D 3
#define LED_E 4
#define LED_F 5
#define LED_G 6
#define LED_DP 7
#define LEDPORT PORTB
#define LEDDDR DDRB
#define COM1 6
#define COM2 5
#define COM3 4
#define COM4 3
#define COMPORT PORTD
#define COMDDR DDRD
//Koniec definicji wyprowadzeń
uint8_t g_AktWyswietlacz = 0;
uint8_t g_DaneWyswietlacza[4];
uint8_t g_DaneCom[4] = {~(1<<COM1), ~(1<<COM2), ~(1<<COM3), ~(1<<COM4)};
int main(void)
{
////////////////////
// Inicjacja
LEDDDR = 0xff;
COMDDR = 1<<COM1 | 1<<COM2 | 1<<COM3 | 1<< COM4;
// Timer 0
TCCR0 = 1<<CS01|1<<Cs00;
TIMSK = 1<<TOIE0;
// Globalne zezwolenie przerwania
sei();
// Koniec inicjacji
////////////////////
// Wpisanie do tablicy próbnych wartości
g_DaneWyswietlacza[0] = (1<<LED_B | 1<<LED_C);
g_DaneWyswietlacza[1] = (1<<LED_A | 1<<LED_B | 1<<LED_D | 1<<LED_E| 1<<LED_G);
g_DaneWyswietlacza[2] = (1<<LED_A | 1<<LED_B | 1<<LED_C | 1<<LED_D| 1<<LED_G);
g_DaneWyswietlacza[3] = (1<<LED_B | 1<<LED_C | 1<<LED_F | 1<<LED_G);
//OBSLUGA PRZERWAN
SIGNAL(SIG_OVERFLOW0)
{
//Wygaszenie wyswietlaczy
COMPORT = 1<<COM1 | 1<<COM2 | 1<< COM3 | 1<<COM4;
//Wysylanie odpowiedniej danej
LEDPORT = g_DaneWyswietlacza[g_AktWyswietlacz];
//Wlaczenie odpowiedniego wyswietlacza
COMPORT = g_DaneCom[g_AktWyswietlacz];
//Zwiększenie stanu zmiennej wskazujacej na obslugiwany wyswietlacz
++g_AktWyswietlacz;
if(g_AktWyswietlacz >3) g_AktWyswietlacz = 0;
}
return 0;
}
Błędy to :
Kod: Zaznacz cały
> "make.exe" all
avr-gcc -g -Wall -O2 -mmcu=at90s2313 -c -o wys.o wys.c
In file included from wys.c:10:
c:/winavr-20080610/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."
wys.c: In function 'main':
wys.c:45: error: 'Cs00' undeclared (first use in this function)
wys.c:45: error: (Each undeclared identifier is reported only once
wys.c:45: error: for each function it appears in.)
wys.c:62: error: static declaration of '__vector_6' follows non-static declaration
wys.c:62: error: previous declaration of '__vector_6' was here
make.exe: *** [wys.o] Error 1
> Process Exit Code: 2
> Time Taken: 00:01
Program jest dobrze spisany. Jak to naprawić ?
-
spark
- Użytkownik
- Posty: 412
- Rejestracja: 25 lis 2004, 15:50
- Lokalizacja: Wrocław
Post
autor: spark » 24 sie 2008, 12:53
Zobacz jaki uC używa program:
At90s2123 - Wyswietlacz 4x7seg
a jaki masz ustawiony w makefile:
avr-gcc -g -Wall -O2 -mmcu=at90s2313 -c -o wys.o wys.c
Po prostu kompilator dołącza nie ten plik naŋłówkowy dla nie tego mikrokontrolera co powienien i występuje konflikt w użytych przerwaniach.
[ Dodano: 2008-08-24, 13:54 ]
no i obsługa przerwania w funkcji
main?
jeszcze się z czymś takim nie spotkałem, zazwyczaj funkcja obsługująca przerwanie znajduje się poza ciałem funkcji main stanowiąc oddzielną funkcję...
[ Dodano: 2008-08-24, 13:56 ]
i brak pętli
for{} w main...
[ Dodano: 2008-08-24, 13:58 ]
i usuń plik nagłówkowy
#include <avr/signal.h> jest przestarzały...
-
snow
- Użytkownik
- Posty: 794
- Rejestracja: 16 sty 2007, 3:44
- Lokalizacja: lubelskie
-
Kontakt:
Post
autor: snow » 24 sie 2008, 12:59
W kodzie nie jest nigdzie napisane że procesor ma używać at90s2132 przecież - pewnie literówka przy przepisywaniu
Przede wszystkim masz błąd:
powinno być
CS00
-
Laik
- Użytkownik
- Posty: 242
- Rejestracja: 21 maja 2007, 19:19
- Lokalizacja: z nienacka
Post
autor: Laik » 24 sie 2008, 13:02
Spark89 to było za komentowane te At90s2123 więc nie w tym problem. Faktycznie z tym for i signalem miales rację

Dzięki
snow o to chodziło Dzięki

[/b]
-
spark
- Użytkownik
- Posty: 412
- Rejestracja: 25 lis 2004, 15:50
- Lokalizacja: Wrocław
Post
autor: spark » 24 sie 2008, 13:05
Laik pisze:Spark89 to było za komentowane te At90s2123 więc nie w tym problem. Faktycznie z tym for i signalem miales rację

Dzięki
snow o to chodziło Dzięki

[/b]
Zakomentowanie bo to jest opis programu i to wiem doskonale jednak program został przystosowany dla innego mikrokontrolera niż ten który chciałeś zaprogramować. Gdybyś miał program dla AT90S2123 a chcialbyś zaprogramować ATmega8515 nie wiem czy byłoby tak kolorowo... dlatego zwracaj na to uwagę w przyszłośći
pzdr.
-
Laik
- Użytkownik
- Posty: 242
- Rejestracja: 21 maja 2007, 19:19
- Lokalizacja: z nienacka
Post
autor: Laik » 24 sie 2008, 15:05
W kursie przeczytałem że można ściągnąć kody źródłowe ze strony EDW. Wiecie gdzie dokładnie??
-
Ertew
- Użytkownik
- Posty: 1414
- Rejestracja: 03 lip 2005, 10:36
- Lokalizacja: Leszno
-
Kontakt:
Post
autor: Ertew » 24 sie 2008, 15:29
Elportal pisze:Informacje i dodatkowe materiały na ten temat programowania procesorów w języku C można znaleźć na stronie autora kursu C
Oto ta strona (link).