![]() | ||
| 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