Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- PWM mit Shift Baustein 74595
- Speichere dies als
- PWM_LED_SPI_75595.ino
- und öffne es mit der SKETCH Oberfläche
- */
- //#include <util/delay.h>
- #include <avr\wdt.h>
- #define DEF_OCR2A_COMP_VALUE 54
- #define TWO_CYCLES() __asm__ __volatile__( "rjmp 1f\n 1:" ) // 2 cycles
- #ifndef SPI_SHIFTOUT_74_595_HEADER
- #define SPI_SHIFTOUT_74_595_HEADER
- //SPI_BUS ATMega328p
- #define SCK_PIN PB5
- #define MISO_PIN PB4
- #define MOSI_PIN PB3
- #define SS_PIN PB2
- #define SPI_DDRX DDRB
- #define SPI_PORTX PORTB
- #define TTL74595_DS_PIN_NR MOSI_PIN //DATA
- #define TTL74595_SH_CP_PIN_NR SCK_PIN //SCK
- #define TTL74595_ST_CP_PIN_NR SS_PIN //RCK
- //PINS
- #define DS_TTL74595 (1<< TTL74595_DS_PIN_NR ) // DATA
- #define SH_CP_TTL74595 (1<< TTL74595_SH_CP_PIN_NR ) //SCK
- #define ST_CP_TTL74595 (1<< TTL74595_ST_CP_PIN_NR ) // Store / RCK
- #define OUT_TTL74595_RCK_HIGH() (SPI_PORTX |= ST_CP_TTL74595)
- #define OUT_TTL74595_RCK_LOW() (SPI_PORTX &= ~ST_CP_TTL74595)
- #endif //SPI_SHIFTOUT_74_595_HEADER
- // *************************************************************************************
- //GLOBAL
- volatile uint8_t gu8LedPWM[8];
- // *************************************************************************************
- // *******************************
- void SPI_SlaveInit(void)
- // *******************************
- {
- /* Set MISO output, all others input */
- PRR &= ~(1<<PRSPI); //POWER ON SPI
- /* Enable SPI */
- //SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //fosc/4
- SPI_DDRX |= DS_TTL74595 | SH_CP_TTL74595 | ST_CP_TTL74595;
- }
- // *********************************************
- ISR( SPI_STC_vect ) //SPI Transfer complete
- // *********************************************
- {
- OUT_TTL74595_RCK_HIGH(); // Latch Data to Output
- __asm__ __volatile__( "rjmp 1f\n 1:" ); // 2 cycles
- OUT_TTL74595_RCK_LOW();
- };
- // **************************************
- void SPI_TTL74595( uint8_t u8Val ) //uint16_t uint32_t
- // **************************************
- {
- //S:174
- SPDR = ~u8Val; // Mache Komplement, weil LED_ LIEGET AN PLUS
- SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0) | (1<<SPIE); //fosc/4 + SPI Interrupt
- };
- //Für Test mit Oszi:
- void ToogleBit(void)
- {
- DDRC |= 0x01;
- PORTC |= 0x01;
- //TWO_CYCLES();
- _delay_us(2);
- PORTC &= ~0x01;
- }
- // ****************************************************************
- //ISR( TIMER2_OVF_vect )
- ISR( TIMER2_COMPA_vect )
- // *******************************************************************
- {
- volatile uint8_t u8NN;
- //uint8_t u8Sreg = SREG;
- volatile static uint8_t u8Periode=0;
- volatile static uint8_t u8Val=0xFF;
- if( !u8Periode ) //== 0
- {
- u8Val=0xFF;
- }
- else
- {
- for( u8NN=0; u8NN < 8; u8NN++)
- {//Clear passenden OutBit if Match
- if( gu8LedPWM[u8NN] == u8Periode )
- {
- u8Val &= ~(1 << u8NN);
- };
- }
- };
- //S:174
- SPDR = ~u8Val; // Mache Komplement, weil LED_ LIEGET AN PLUS
- SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0) | (1<<SPIE); //fosc/4 + SPI Interrupt
- //SPI_TTL74595(u8Val);
- u8Periode++; //u8 Interrupt Durchlaufzähler mit 0
- //SREG = u8Sreg;
- };
- // ************************
- int main(void)
- // ************************
- { // put your main code here, to run repeatedly:
- uint8_t u8NN;
- uint8_t u8FF;
- uint8_t u8MemVal;
- //wdt_enable(WDTO_500MS); //WatchDog ENABLE
- wdt_disable();
- for( u8NN=0; u8NN < 8; u8NN++)
- {
- gu8LedPWM[u8NN] = u8NN *32;
- };
- SPI_SlaveInit();
- TCNT2 = 0;
- //COMP SECTION
- OCR2A = DEF_OCR2A_COMP_VALUE; //?? >50%
- TCCR2A= (1<<WGM21); //CTC Mode
- TIMSK2 = (1 << OCIE2A);
- TCCR2B = (1 << CS21); // CLOCK /8
- while(1)
- {
- //ToogleBit(); // Trigger für Test Oszi
- //wdt_reset(); //WATCHDOG!
- //Erzeuge 8 Sinus Modulationen für 8 PWM Bits mit Phasenabstand 265/8 =32
- u8NN++; //Phasenschieber
- for(u8FF=0; u8FF < 8; u8FF++)
- {
- u8MemVal = 128 + 127*sin(2*M_PI*(((uint8_t)(u8NN+(u8FF*32)))/256.0));
- //Damits schnell geht ohne Rechnung
- cli();
- gu8LedPWM[u8FF] = u8MemVal;
- //gu8LedPWM[u8FF] = 70;
- sei();
- };
- _delay_ms(5);
- };
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement