sobota, 12 marca 2016

AVR cz8 - rejestr przesuwny i multipleksowanie.

Ostatnio brakuje mi czasu na naukę mikro kontrolerów jednak udało mi się zrealizować kolejny etap w mojej nauce. Problem jaki chciałem rozwiązać to sterowanie dwoma wyświetlaczami 7 segmentowymi oraz przekonać się jak wykorzystać mechanizm przełączania (multipleksowania) z wykorzystaniem klucza tranzystorowego. W tym celu zbudowałem układ wg. schematu (uwaga, na schemacie pominąłem elementy konieczne do poprawnego zasilania atmegi).




Zasada działania układu polega na tym, że wystawniana do rejestru liczba jest przez krótki czas wyświetlana przez jeden z wyświetlaczy LED. Poprzez sterowanie bazą tranzystorów uzyskujemy możliwość przełączania wyświetlania z jednego LED'a na drugi. Robiąc to szybko odnosimy wrażenie, że świecą się oby dwa. Schematycznie wygląda to tak:

Wsad do procesora:

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

#define DATA PC0
#define CLK  PC1
#define LT  PC2
#define LEFT_LED PC3
#define RIGHT_LED PC4

#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 100

void InitSoftSPI();
void SendData(uint8_t byte);

volatile uint8_t cnt=0;

int main(){

uint8_t code[10]={191,6,219,79,230,109,253,7,255,111};

int i,left_number,right_number;


DDRB|=(1<<PB0);
DDRB|=(1<<RIGHT_LED);
DDRB|=(1<<LEFT_LED);
PORTB|=(1<<PB0);



InitSoftSPI();
left_number=6;
right_number=0;

while(1){

right_number--;
if(right_number<0){left_number--; right_number=9;}
for(i=1;i<=50;i++){
PORTB|=(1<<LEFT_LED);
SendData(~code[left_number]);
_delay_ms(2);
PORTB&=~(1<<LEFT_LED);
_delay_ms(2);
PORTB|=(1<<RIGHT_LED);
SendData(~code[right_number]);
_delay_ms(2);
PORTB&=~(1<<RIGHT_LED);
_delay_ms(2);}
}

}

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;
 }
}

 

Działanie układu przedstawia film:



Brak komentarzy:

Prześlij komentarz