Hi Leute,
ich habe mir jetzt den gesamten Tag die Zähne an USI auf dem Attiny2313
ausgebissen und muss jetzt wohl doch wieder das Forum Fragen.
Ich habe mich schon durch sämtliche englischsprachigen Foren gewühlt und
das Kapitel im Datenblatt mehrfach durchgelesen.
Zum Beispiel ist mir unklar, warum in vielen Beispielen in der "Clock
Schleife" immer wieder USICS1 und USICLK gesetzt werden, bleiben die
nicht an?
Ich habe einen 74HC595 an einem Attiny2313. An den Ausgängen des 74HC595
sind LEDs gegen GND. Die Verbindungen sind:
t2313 - 74HC595
SCK --------- SRCLK (Shiftregister Clock)
DO --------- SER (Serieller Input)
PB4 --------- RCLK (Ausgangsregister Clock)
Außer, dass die LEDs beim Einschalten manchmal kurz aufleuchten,
passiert gar nichts.
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 |
|
4 | // 74HC595 am USI Port, LEDs an den parallel Ausgängen
|
5 |
|
6 | #define SCK PB7 // USI
|
7 | #define DO PB6 //
|
8 | #define DI PB5 //
|
9 | #define RCLK PB4 // 74HC595 Storage Register Clock
|
10 |
|
11 | #define TEST 0xAA // Testmuster
|
12 |
|
13 | int main( void )
|
14 | {
|
15 | PORTB &= (1 << SCK) | (1 << DO) | (1 << DI) | (1 << RCLK); // Outputs auf low
|
16 | DDRB |= (1 << SCK) | (1 << DO) | (1 << DI) | (1 << RCLK); // SCK, DO, DI und PB4 (RCLK) auf Ausgang
|
17 |
|
18 | _delay_ms(200);
|
19 |
|
20 | USIDR = TEST;
|
21 | USISR |= (1 << USIOIF); // Counter Overflow Zurücksetzen
|
22 | USICR = (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);
|
23 |
|
24 | while(!(USISR & (1 << USIOIF))) // Takten bis zum Counter Overflow
|
25 | {
|
26 | USICR |= (1 << USITC); // Diese Schleife taktet die USI Clock
|
27 | }
|
28 |
|
29 | PORTB |= (1 << RCLK); // Byte ins Ausgangsregister des 74HC595 schieben
|
30 | PORTB &= ~(1 << RCLK); //
|
31 |
|
32 |
|
33 | return 0;
|
34 | }
|