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