2

Trying to shift out from ATtiny85 to a shift register using the USI in SPI mode. I have Timer 0 running as slowly as possible (checked it was running by temporarily changing it to toggle a pin with an LED attached.) I have LEDs hooked up to USCK and DO so by rights I should be able to see them blinking as it sends.

What else do I need to do in order to get it shifting out in sync with Timer 0? All the examples I've looked at so far strobe the USI clock manually.

#include <avr/io.h>

int main(void){
    DDRB = (1 << DDB2) | (1 << DDB1); // USCK & DO Output
    DDRB &= ~(1 << DDB0); // DI Input
    PORTB |= (1 << DDB0); // Pullup Resistor for DI

    TCCR0A = (1 << WGM01); // Timer 0 in CTC Mode
    OCR0A = 0xFF; // Timer 0 Compare A
    TCCR0B = (1 << CS02) | (1 << CS00); // Prescaler / 1024

    USICR = (1 << USIWM0); // USI 3 Wire Mode
    USICR |= (1 << USICS0); // Timer 0 for USI 4-bit Clock Source

    USIDR = 0x7F; // Why you no go? :c

    USISR |= 0x08; // Set Counter to 8
    USISR = (1 << USIOIF); // Clear Counter Overflow

    while(1);
    return 0;
}
5
  • I think it should be: USISR = _BV(USIOIF); Commented Dec 3, 2015 at 14:30
  • This is a good question, but not related to Arduino. I think you could re-ask it on Electric Engineering stack exchange.
    – bigjosh
    Commented Dec 3, 2015 at 14:36
  • "This flag is set (one) when the 4-bit counter overflows (i.e., at the transition from 15 to 0). If the USIOIE bit in USICR and the Global Interrupt Enable Flag are set an interrupt will also be generated when the flag is set. The flag will only be cleared if a one is written to the USIOIF bit. Clearing this bit will release the counter overflow hold of SCL in two-wire mode." So it's set when it overflows and you clear it by setting it? What the f- Atmel. :I Commented Dec 3, 2015 at 19:42
  • Yepp, you have to think as the hardware guys do :) Commented Dec 3, 2015 at 20:09
  • Still doesn't work. :c I've resorted to strobing it manually for now. Commented Dec 4, 2015 at 10:59

1 Answer 1

0

Did you forget to load the counter and clear flags in USISR?

1
  • It still isn't doing anything (updated code snippet.) Commented Dec 3, 2015 at 14:07

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.