Jestem zielony z tego, już nie wiem gdzie szukać błędu.
Kod: Zaznacz cały
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "d_led.h" //dołączenie pliku nagłówkowego (obsługa LED)
int main(void) {
//******* Inicjacja ********
d_led_init(); // inicjacja wyświetlacza multiplekserowego
uint16_t licznik=60000;
uint8_t d1,d2,d3,d4,d5,d6;
sei(); // Włączenie globalnej obsługi przerywań
//********************** pętla główna
while(1)
{
licznik--;
cy1=1;
cy2=3;
cy3=3;
cy4=4;
}
}Kod: Zaznacz cały
/*
* d_led.c
*
* Created on: 2011-10-13
* Author: sylwq
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h> // dołączenie pl. nagłówkowego potrzebnego do odczytu
// danych zawartych w pamięci programu FLASH
#include "d_led.h" // dołączenie pliku nagłówkowego
// w nim znajdują się definicje preprocesora
// definicje zmiennych globalnych przechowujacych cyfry do wyświetlenia
// volatile - ponieważ będą wykorzystywane do odczytu i zapisu zarówno
// dostępu do nich. (zmienne ulotne)
volatile uint8_t cy1;
volatile uint8_t cy2;
volatile uint8_t cy3;
volatile uint8_t cy4;
volatile uint8_t cy5;
volatile uint8_t cy6;
// definicja tablicy zawierającej definicje bitowe cyfr LED
uint8_t cyfry[15] PROGMEM = {
(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F), // 0
(SEG_B|SEG_C), // 1
(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G), // 2
(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G), // 3
(SEG_B|SEG_C|SEG_F|SEG_G), // 4
(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G), // 5
(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G), // 6
(SEG_A|SEG_B|SEG_C|SEG_F), // 7
(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G), // 8
(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G), // 9
0x00 // NIC (puste miejsce)
};
// definicja funkcji inicjującej pracę z wyświetlaczem multiplexerowym
void d_led_init(void)
{
LED_DATA_DIR = 0xFF; // wszystkie piny portu PA jako wyjścia (katody)
LED_DATA = 0x00; // Wygaszenie wszystkich katod - stan niski
// 6 pinów portu C jako wyjścia (anody)
ANODY_DIR |= CA1 | CA2 | CA3 | CA4 | CA5 | CA6;
LED_ANODY |= CA1 | CA2 | CA3 | CA4 | CA5 | CA6;
LED_ANODY = 0x00;
// Ustawienie TIMER0
TCCR0 |= (1<<WGM01); // Tryb CTC
TCCR0 |= (1<<CS02)|(1<<CS00); // Preskaler = 1024
OCR0 = 10; // Dodatkowy podział przez 26 (rej. przepełnienia)
TIMSK |= (1<<OCIE0); // Zezwolenie na przerywanie CompareMatch
}
//============PROCEDURA OBSŁUGI PRZERYWANIA - COMPARE MATCH==================
ISR(TIMER0_COMP_vect)
{
static uint8_t licznik=4; // zmienna do przełączania kolejno anod wyrwietlacza
//LED_ANODY = (LED_ANODY & 0xFF);
if(licznik==4) LED_DATA = pgm_read_byte( &cyfry[cy1] ); // gdy zapalony wyśw.1 podaj stan zmiennej c1
else if(licznik==8) LED_DATA = pgm_read_byte( &cyfry[cy2] ); // gdy zapalony wyśw.2 podaj stan zmiennej c2
else if(licznik==10) LED_DATA = pgm_read_byte( &cyfry[cy3] ); // gdy zapalony wyśw.3 podaj stan zmiennej c3
else if(licznik==20) LED_DATA = pgm_read_byte( &cyfry[cy4] ); // gdy zapalony wyśw.4 podaj stan zmiennej c4
else if(licznik==40) LED_DATA = pgm_read_byte( &cyfry[cy5] ); // gdy zapalony wyśw.5 podaj stan zmiennej c6
else if(licznik==80) LED_DATA = pgm_read_byte( &cyfry[cy6] ); // gdy zapalony wyśw.6 podaj stan zmiennej c6
LED_ANODY = licznik;
if(licznik>80) licznik = 2; // jeśli licznik większy niż 80 to ustaw na 2
licznik = licznik << 1;
}
Kod: Zaznacz cały
/*
#ifndef D_LED_H_
#define D_LED_H_
// definicje portów i pinów wyświetlacza używanych dla
// ułatwienia w programie jako stałe preprocesora
#define LED_DATA PORTA // port z podłączonymi segmentami
#define LED_DATA_DIR DDRA // rejestr kierunku portu katod wyświetlaczy
#define LED_ANODY PORTC // port z podłączonymi anodami
#define ANODY_DIR DDRC // rejestr kierunku portu anod wyświetlaczy
// port z podłączonymi anodami 6 bitów od PC2 do PC7
#define CA1 (1<<PC7) // CA1 oznacza bit nr 2 portu C
#define CA2 (1<<PC6) // CA2 oznacza bit nr 3 portu C
#define CA3 (1<<PC5) // CA3 oznacza bit nr 4 portu C
#define CA4 (1<<PC4) // CA4 oznacza bit nr 5 portu C
#define CA5 (1<<PC3) // CA5 oznacza bit nr 6 portu C
#define CA6 (1<<PC2) // CA6 oznacza bit nr 7 portu C
// definicje bitów dla poszczególnych segmentów LED
#define SEG_A (1<<7)
#define SEG_B (1<<6)
#define SEG_C (1<<5)
#define SEG_D (1<<4)
#define SEG_E (1<<3)
#define SEG_F (1<<2)
#define SEG_G (1<<1)
#define SEG_DP (1<<0)
#define NIC 10
// same deklaracje zmiennych globalnych na potrzeby wykorzystania
// ich w innych plikach projektu
// przydomek extern powoduje, iż te zmienne będą dostępne we wszystkich
// modułach. które dołącza plik d_led.h za pomocną dyrektywy include
extern volatile uint8_t cy1;
extern volatile uint8_t cy2;
extern volatile uint8_t cy3;
extern volatile uint8_t cy4;
extern volatile uint8_t cy5;
extern volatile uint8_t cy6;
// obszar deklaracji funkcji udostępnionych dla innych modółów
void d_del_init(void);
#endif /* D_LED_H_ */ // koniec _d_led_h