Guten Morgen,
ich bin dabei mit dem AtTiny261A einen SPI-Slave aufzubauen.
Problem habe ich in folgender ISR:
1 | ISR (USI_OVF_vect)
|
2 | {
|
3 | //uint8_t data = USIDR; // << geht
|
4 | uint8_t data = USIBR; // << geht nicht
|
5 | if(data == 0x42)
|
6 | {
|
7 | TC1H ^= 0x03;
|
8 | OCR1D ^= 0xFF; //LED schalten
|
9 | }
|
10 | USISR |= (1 << USIOIF);
|
11 | }
|
Initialisierung:
1 | int main(void)
|
2 | {
|
3 | //USI als SPI
|
4 | USIPP |= (1 << USIPOS); //Pins von PA[2:0] fuer USI nutzen
|
5 | USICR |= (1 << USIWM0) | (1 << USICS1) | (1 << USICS0) | (1 << USIOIE); //Three Wire, fallende Flanke, Interrupt bei Ueberlauf
|
6 |
|
7 | DDRB |= R | G | B; //Ports auf Ausgang stellen
|
8 |
|
9 | //PWM einschalten
|
10 | PLLCSR = (1 << PCKE); //Timer1 auf PLL clock als quelle (64MHz)
|
11 | TCCR1B = (1 << CS10) ; //Timer Starten, Prescaler 1
|
12 | TCCR1A |= (1 << COM1A0) | (1 << COM1B0) | (1 << PWM1A) | (1 << PWM1B);
|
13 | TCCR1C |= (1 << COM1D0) | (1 << PWM1D);
|
14 | TCCR1D |= (1 << WGM10);
|
15 | TC1H = 0x03;
|
16 | OCR1C = 0xFF;
|
17 | OCR1D = 0xFF;
|
18 | sei();
|
19 |
|
20 | while(1)
|
21 | {
|
22 | }
|
23 | }
|
Beim verwenden von USIDR wird die LED umgeschaltet(PB5 per PWM).
Das gleiche mit USIBR geht nicht obwohl es ja beim Überlauf die Daten
von USIDR nach USIBR kopiert werden sollten (so habe ich das aus dem
Datenblatt verstanden).
Hatte es auch schonmal mit dem AtTiny25 und TWI probiert das USIBR zu
benutzen, erfolglos.
Kennt jemand das Problem?