4 Wyswietlacze 7seg - kurs AVT

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!
ODPOWIEDZ
Laik
Użytkownik
Posty: 242
Rejestracja: 21 maja 2007, 19:19
Lokalizacja: z nienacka

4 Wyswietlacze 7seg - kurs AVT

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

[ 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:

Kod: Zaznacz cały

TCCR0 = 1<<CS01|1<<Cs00;
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??

Awatar użytkownika
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).

ODPOWIEDZ