Witam
Jestem dopiero początkujący w tej dziedzinie techniki, i przez to niestety, ale ciągle pojawiają się jakieś
problemy. Niektóre udało mi się rozwiązać samemu, jednak teraz nie mam pojęcia co mógłbym mieć źle(a błąd jest z
pewnością banalny). Robię ćwiczenie z książki pana Mirosława o multipleksowaniu wyświetlacza LED. Wydaje mi się że
wszystko przepisałem dokładnie jak jest w książce (dostosowując to tylko do mojego mikroprocesora Atmega88pa,
ustawiając tryb CTC na timerze 0A). Tutaj kody programów:
Main.c
Cytuj:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "d_led.h"
int main(void)
{
uint8_t cyfry[4] =
{
~(SEG_A|SEG_B|SEG_C|SEG_D),
~(SEG_E|SEG_F|SEG_A|SEG_B|),
~(SEG_A|SEG_C|SEG_D|),
~(SEG_Ą|SEG_B|),
};
d_let_init(); //inicjalizacja wyswietlacza multipleksowego
cy1=0;
cy2=1;
cy3=2;
cy4=3;
sei();
while (1)
{
}
}
d_led.c
Cytuj:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "d_led.h"
volatile uint8_t cy1;
volatile uint8_t cy2;
volatile uint8_t cy3;
volatile uint8_t cy4;
void d_led_init(void)
{
LED_DATA_DIR = 0xFF; //wszystkie piny portu jako wyjscia
LED_DATA= 0xFF; //wygaszenie wszystkich katod - stan wysoki
//4 piny portu C jako wyjscia (anody)
ANODY_DIR |= CC1 | CC2 | CC3 | CC4;
//wygaszenie wszystkich wyswietlaczy - anody
ANODY |= CC1 | CC2 | CC3 | CC4;
//ustawienie TIMER
TCCR0A |= (1<<WGM01); //tryb CTC
TCCR0B |= (1<<CS00) | (1<<CS02); //preskaler 1024
OCR0A = 39; //podział przez 39
TIMSK0 |= (1<<OCIE0A); //zezwolenie na przerwanie Compare Match
}
/////////===============PROCEDURA OBSŁUGI PRZERWANIA COMPARE MATCH
ISR(TIMER0_COMPA_vect)
{
//zmienna do przelaczania kolejno anod wyswietlacza
static uint8_t licznik=1;
//cykliczne przelaczanie w kazdym przerwaniu anod kazdego wyswietlacza(negacja aby krazylo zero)
ANODY_PORT= ~licznik;
//gdy zapalony wysw. 1 podaj stan zmiennej c1
if(licznik==1) LED DATA = cyfry[cy1];
if(licznik==2) LED DATA = cyfry[cy2];
if(licznik==4) LED DATA = cyfry[cy3];
if(licznik==8) LED DATA = cyfry[cy4];
licznik <<=1; //przesuniecie zawartosci bitow licznika o 1 w lewo
if(licznik>8) licznik=1 ;
}
d_led.h
Cytuj:
#ifndef D_LED_H_
#define D_LED_H_
//definicje portów i pinów wyswietlacza uzywanych dla ulatwienia w programie
#define LED_DATA PORTD //port z podlaczonymi segmentami
//port z podlaczonymi anodami
#define ANODY_PORT PORTC
#define CC1 (1<<PC0)
#define CC2 (1<<PC1)
#define CC3 (1<<PC2)
#define CC4 (1<<PC3)
//definicje segmentów
#define SEG_A (1<<7)
#define SEG_B (1<<5)
#define SEG_C (1<<3)
#define SEG_D (1<<1)
#define SEG_E (1<<0)
#define SEG_F (1<<6)
#define SEG_G (1<<4)
#define SEG_DP (1<<2)
extern volatile uint8_t cy1;
extern volatile uint8_t cy2;
extern volatile uint8_t cy3;
extern volatile uint8_t cy4;
void d_led_init(void)
#endif /* D_LED_H_ */
i błędy
Cytuj:
**** Build of configuration Release for project wys_led ****
make all
Building file: ../d_led.c
Invoking: AVR Compiler
avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega88p -
DF_CPU=8000000UL -MMD -MP -MF"d_led.d" -MT"d_led.d" -c -o "d_led.o" "../d_led.c"
../d_led.c: In function 'd_led_init':
../d_led.c:20: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
../d_led.c:39: warning: 'signal' attribute only applies to functions
../d_led.c:39: warning: 'used' attribute ignored
../d_led.c:39: warning: 'externally_visible' attribute ignored
../d_led.c:40: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
../d_led.c:57: error: old-style parameter declarations in prototyped function definition
../d_led.c:55: error: expected '{' at end of input
make: *** [d_led.o] Error 1
**** Build Finished ****
linia 20sta to ta PO pogrubionej czesci
Nie mam pojęcia gdzie brakuje jakiegoś znaku, ponieważ wydaje się że jest okej.
I drugie pytanie, w książce nie ma nic napisane o zmiennej ANODA w d_led.h. Domyślam się że to błąd w druku i w
kodzie powinno byc coś takiego?
Cytuj:
//4 piny portu C jako wyjscia (anody)
ANODY_PORT_DIR |= CC1 | CC2 | CC3 | CC4;
//wygaszenie wszystkich wyswietlaczy - anody
ANODY_PORT |= CC1 | CC2 | CC3 | CC4;
Pozdrawiam