środa, 2 marca 2016

AVR cz7 - rejestr przesuwny, wyświetlacz 7 segmentowy.

Po uruchomieniu sprzętowego SPI przyszła kolej na programowe. Ponieważ chciałem co nieco więcej poznać zastąpiłem wyświetlaczem 7 segmentowym LED. Kropka dziesiętna powinna migać niezależnie od wyświetlanych cyfr - w tym celu postanowiłem wykorzystać przerwania timera procesora.

Wykorzystany przeze mnie moduł LED.



Zbudowałem obwód według schematu:





Można zauważyć, że w tym przypadku wybrałem dowolne piny procesora (programowe SPI!). "Wsad" do procesora wygląda następująco:

Definiujemy potrzebne biblioteki.

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

Definiujemy piny procesora dla DATA, CLK(zegar) i LT (zatrzask)

#define DATA PC0
#define CLK  PC1
#define LT     PC2

Definiujemy pomocnicze makro instrukcje.

#define CLK_H PORTC |= (1<<CLK)
#define CLK_L PORTC &= ~(1<<CLK)
#define LT_H  PORTC |= (1<<LT)
#define LT_L  PORTC &= ~(1<<LT)
#define DATA_1 PORTC |= (1<<DATA)
#define DATA_0 PORTC &= ~(1<<DATA)
#define TIMER_START 60

Nagłówki funkcji oraz zmnienna potrzebna do obsługi przerwań.

void InitSoftSPI();
void SendData(uint8_t byte);
volatile uint8_t cnt=0;

Główny program

int main(){
uint8_t code[10]={191,6,219,79,230,109,253,7,255,111};
uint8_t b;
int i,number;

//włączenie przerwań

TCCR0 |= (1<<CS02) | (1<<CS00); // źródłem CLK, preskaler 1024
TIMSK |= (1<<TOIE0);           //Przerwanie overflow (przepełnienie timera)
TCNT0=TIMER_START;
sei();
DDRB|=(1<<PB0);

InitSoftSPI();
number=0;

while(1){
SendData(~code[number]);
number++;
_delay_ms(1000);
if (number==10){number=0;}
}
}

Zastosowane funkcje

void SendData(uint8_t byte){
 uint8_t i;
 for(i=0;i<=7;i++){
 CLK_L;
    if ((byte & 0x80)){DATA_1;}else{DATA_0;}
    CLK_H;
    byte<<=1;
 }
 LT_H;LT_L;
}

void InitSoftSPI(){
 uint8_t  i;
 DDRC|=(1<<DATA)|(1<<CLK)|(1<<LT);
 PORTC|=~((1<<DATA)|(1<<CLK)|(1<<LT));
 for(i=0;i<=7;i++){
 DATA_0;
 CLK_H; CLK_L;
 LT_H; LT_L;
 }
}

ISR(TIMER0_OVF_vect)
{

  TCNT0 = TIMER_START;
  cnt++;
  if (cnt==1){
  PORTB^=(1<<PB0);
  cnt=0;}

}



Działanie układu z oprogramowaniem przedstawia film:


Brak komentarzy:

Prześlij komentarz