Witam
Chce stworzyć prosty analizator widma oparty na ATmedze oraz wyświetlaczu LCD HD44780. Płytkę z filtrami stworzyłem wcześniej i przebadałem oscyloskopem i wszystko działa jak należy. Problemy zaczęły się dopiero przy programowaniu procesora. Poradziłem sobie z obsługą wyświetlacza i, z pomocą forumowiczów, z obsługą ADC. Mam teraz problem z przerwaniem.
Pliku z konfiguracją wyświetlacza nie wklejałem bo działa poprawnie.
Moje pytanie jest takie : Czy te przerwanie ma sens ? Bo szczerze powiedziawszy przeczytałem wszystkie możliwe poradniki i jakoś nie mogę sobie z tym poradzić. Bardzo prosił bym o pomoc.
Dodatkowo AVR Studio wywala mi takie błędy :
Chce stworzyć prosty analizator widma oparty na ATmedze oraz wyświetlaczu LCD HD44780. Płytkę z filtrami stworzyłem wcześniej i przebadałem oscyloskopem i wszystko działa jak należy. Problemy zaczęły się dopiero przy programowaniu procesora. Poradziłem sobie z obsługą wyświetlacza i, z pomocą forumowiczów, z obsługą ADC. Mam teraz problem z przerwaniem.
PLIK "analizator.c"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "HD44780.h"
#include <inttypes.h>
#include "znaki.h"
#include "adc.h"
int main(void)
{
loading();
znaki();
InitTimer();
InitADC();
sei();
while(1)
{
}
ISR(TIMER1_COMPA_vect){
gatherData();
displayResult();
showBar();
}
return 0;
}
----------------------------------------
PLIK "adc.h"
void InitADC(void)
{
ADMUX |= _BV(REFS0);
ADMUX |= _BV(ADLAR);
ADCSRA |= _BV(ADEN);
ADCSRA |= _BV(ADPS0);
ADCSRA |= _BV(ADPS2);
}
void InitTimer(void)
{
TCCR1B |= _BV(CS11);
TCCR1B |= _BV(WGM13);
TCCR1B |= _BV(WGM12);
TIMSK1 |= _BV(OCIE1B);
OCR1B = 12500;
}
----------------------------------------
PLIK "znaki.h"
#include <avr/io.h>
#include <util/delay.h>
#include <inttypes.h>
void znaki(void);
void loading(void);
----------------------------------------
PLIK "znaki.c"
//-------------------------------
//Deklaracja znaków
//-------------------------------
#include "HD44780.h"
#include <avr/io.h>
#include <util/delay.h>
#include <inttypes.h>
#include "znaki.h"
int rejestry[8];
void znaki(void)
{
//----------------------------------------------------
//Rysowanie znaków
//----------------------------------------------------
uint8_t jeden[] = {0,0,0,0,0,0,0,31};
uint8_t dwa[] = {0,0,0,0,0,0,31,31};
uint8_t trzy[] = {0,0,0,0,0,31,31,31};
uint8_t cztery[] = {0,0,0,0,31,31,31,31};
uint8_t piec[] = {0,0,0,31,31,31,31,31};
uint8_t szesc[] = {0,0,31,31,31,31,31,31};
uint8_t siedem[] = {0,31,31,31,31,31,31,31};
uint8_t osiem[] = {31,31,31,31,31,31,31,31};
//----------------------------------------------------
//Deklaracja znaków do pamiêci wyœwietlacza
//----------------------------------------------------
LCD_ProgrammChar(0,jeden);
LCD_ProgrammChar(1,dwa);
LCD_ProgrammChar(2,trzy);
LCD_ProgrammChar(3,cztery);
LCD_ProgrammChar(4,piec);
LCD_ProgrammChar(5,szesc);
LCD_ProgrammChar(6,siedem);
LCD_ProgrammChar(7,osiem);
}
void loading(void)
{
LCD_Initalize(); //inicjalizacja wyswietlacza
_delay_ms(300);
LCD_Clear(); //czyszczenie wyswietlacza
_delay_ms(300);
LCD_GoTo(4,0);
LCD_WriteText("Test");
LCD_GoTo(0,1);
int x=16;
while(x > 0)
{
_delay_ms(300);
LCD_WriteData(7);
x--;
}
LCD_Clear();
}
unsigned int pomcal(char kanal, char licznik) // funkcja pomiaru ADC
{
uint16_t pomiar(uint8_t); // deklaracja typu funkcji dla pomiar
unsigned int liczba = 0; // tu bedzie wynik pomiaru
char i;
for (i=0; i<licznik; ++i) // 'licznik' pomiarów sumowanych w liczba
{
liczba = liczba + pomiar(kanal); // 'licznik' x dodaæ do 'liczba' pomiar kana³u 'kanal'
_delay_us(200);
}
return (liczba/3);
}
uint16_t pomiar(uint8_t kanal)
{
ADMUX = kanal & 0x07 | 0x40; // ustaw kanal
ADCSRA |= _BV(ADSC); //rozpocznij konwersje
while(ADCSRA & _BV(ADSC)); //czekaj az skonczy
return ADCH; //zmierzona wartosc
}
void gatherData()
{
for (int i=0;i<8;i++)
{
int partialResult = pomcal(i, 3);
rejestry[i]=partialResult;
}
}
void showBar(int barNumber, int barHeight)
{
LCD_GoTo(0, barNumber);
LCD_WriteData(barHeight);
}
void displayResult()
{
for (int i=0;i<8;i++)
{
int value = rejestry[i];
int category = value/32;
showBar(i, category);
}
}
Pliku z konfiguracją wyświetlacza nie wklejałem bo działa poprawnie.
Moje pytanie jest takie : Czy te przerwanie ma sens ? Bo szczerze powiedziawszy przeczytałem wszystkie możliwe poradniki i jakoś nie mogę sobie z tym poradzić. Bardzo prosił bym o pomoc.
Dodatkowo AVR Studio wywala mi takie błędy :
Build started 21.8.2010 at 22:27:46
avr-gcc -mmcu=atmega644p -Wall -gdwarf-2 -std=gnu99 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT analizator.o -MF dep/analizator.o.d -c ../analizator.c
../analizator.c: In function 'main':
../analizator.c:23: error: static declaration of '__vector_13' follows non-static declaration
../analizator.c:23: error: previous declaration of '__vector_13' was here
../analizator.c: In function '__vector_13':
../analizator.c:25: warning: implicit declaration of function 'gatherData'
../analizator.c:26: warning: implicit declaration of function 'displayResult'
../analizator.c:27: warning: implicit declaration of function 'showBar'
make: *** [analizator.o] Error 1
Build failed with 2 errors and 3 warnings...
