Tom wrote:
> bin ja noch relativer Neuling aber arbeite mich grade hoch.
Dann solltest Du gleich versuchen, nicht unnötig Ressourcen zu
verschwenden, z.B.:
- variables Schieben ist teuer
- unnötig große Datentypen sind teuer (Schleifenzähler 8 Bit)
- globale Variablen sind teuer (lokale sind oft in Registern).
Und auch bessere Lesbarkeit kann nicht schaden, z.B. durch Bitvariablen.
Hier mal ein Beispiel, wie ich es machen würde:
1 | #include <avr\io.h>
|
2 |
|
3 |
|
4 | struct bits {
|
5 | uint8_t b0:1;
|
6 | uint8_t b1:1;
|
7 | uint8_t b2:1;
|
8 | uint8_t b3:1;
|
9 | uint8_t b4:1;
|
10 | uint8_t b5:1;
|
11 | uint8_t b6:1;
|
12 | uint8_t b7:1;
|
13 | } __attribute__((__packed__));
|
14 |
|
15 | #define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)
|
16 |
|
17 |
|
18 | #define SPI_CLK SBIT( PORTB, 0 ) // clock
|
19 | #define SPI_CLK_DDR SBIT( DDRB, 0 )
|
20 | #define SPI_MISO_PIN SBIT( PINB, 2 )
|
21 | #define HC165_LD SBIT( PORTB, 3 )
|
22 | #define HC165_LD_DDR SBIT( DDRB, 3 )
|
23 |
|
24 |
|
25 | uint16_t read_2xhc165( void )
|
26 | {
|
27 | uint8_t i;
|
28 | uint16_t b = 0;
|
29 |
|
30 | SPI_CLK_DDR = 1;
|
31 | HC165_LD_DDR = 1;
|
32 | HC165_LD = 0;
|
33 | HC165_LD = 1;
|
34 |
|
35 | for( i = 16; i; i-- ){
|
36 | b <<= 1;
|
37 | if( SPI_MISO_PIN )
|
38 | b++;
|
39 | SPI_CLK = 0;
|
40 | SPI_CLK = 1;
|
41 | }
|
42 | return b;
|
43 | }
|
Bringt eine Codeeinsparung von 80% (162/32Byte)
Prinzipiell sollte Dein Code es aber tun, allerdings liest er gespiegelt
aus.
Peter
P.S.:
Und dran denken, alle Eingänge des HC165 müssen beschaltet werden (0V
oder 5V).
"Offen" ist kein gültiger Logikpegel.