Hallo, ich spiele schon eine ganze weile mit Microcontroller herum. Zuerst mit der Arduino-Plattform, die meine Lust auf mehr weckte und jetzt mit "selbsgebastelten" Boards mit AVR-Controller. Nun habe ich ein Board entwickelt und bereits aufgebaut, dass die Temperatur mit einen digitalen Temp.-Sensor misst und über zwei 7-Segment-Anzeigen ausgeben soll. Die Siebensegment-Anzeigen werden jeweils über 2 M74HC5981 Schieberegiester angesteuert. Nun habe ich das Problem das ich es momentan nicht hinbekomme die Schieberegiester anzusteuern. Habe das Datenblatt ausführlich gelesen. Welche PINs High, welche LOW sein müssen, wo der Impuls von LOW -> HIGH angelegt werden muss. Als Controller verwende ich einen AVR Attiny 2313. Es soll Software-SPI werden, da ich die PINs für Hardware SPI irgendwie nicht direkt finden konnte.(Außerdem unterstütz der 2313 doch kein Hardware SPI sondern "nur" USI?) Der Schaltplan ist jetzt nicht so schön aber er müsste lesbar sein! (= Der Code sieht momtentan so aus:
1 | #include <avr/io.h> |
2 | #include <avr/delay.h> |
3 | |
4 | #define F_CPU 8000000 /** MAX: _delay_ms(32,76) **/ |
5 | #define MAX_DELAY 32.76
|
6 | |
7 | #define SCLR 3
|
8 | #define SI 2
|
9 | #define RCK 1
|
10 | #define SCK 0
|
11 | #define SHIFTPort PORTB
|
12 | #define SHIFTReg DDRB
|
13 | |
14 | uint8_t BIT; |
15 | |
16 | |
17 | inline void NoEndLoop(); |
18 | |
19 | inline void initSHIFTRegister(); |
20 | inline void Schiebe_1Bit(); |
21 | |
22 | |
23 | int main(){ |
24 | |
25 | DDRA = 0b101; |
26 | PORTA = 0b010; /** Signal LED einschalten **/ |
27 | |
28 | initSHIFTRegister(); |
29 | |
30 | NoEndLoop(); |
31 | /**
|
32 | |
33 | Wird Nie erreicht!
|
34 | |
35 | **/
|
36 | return 0; |
37 | }
|
38 | |
39 | inline void NoEndLoop(){ |
40 | |
41 | BIT = 1; |
42 | |
43 | while(1) |
44 | {
|
45 | |
46 | |
47 | Schiebe_1Bit(); |
48 | Schiebe_1Bit(); |
49 | Schiebe_1Bit(); |
50 | Schiebe_1Bit(); |
51 | Schiebe_1Bit(); |
52 | Schiebe_1Bit(); |
53 | Schiebe_1Bit(); |
54 | Schiebe_1Bit(); |
55 | Schiebe_1Bit(); |
56 | Schiebe_1Bit(); |
57 | Schiebe_1Bit(); |
58 | Schiebe_1Bit(); |
59 | Schiebe_1Bit(); |
60 | Schiebe_1Bit(); |
61 | Schiebe_1Bit(); |
62 | Schiebe_1Bit(); |
63 | |
64 | //Alle LEDs einschalten
|
65 | |
66 | SHIFTPort |= (0 << RCK); |
67 | _delay_ms(MAX_DELAY); |
68 | SHIFTPort |= (1 << RCK); |
69 | _delay_ms(MAX_DELAY); |
70 | |
71 | }
|
72 | }
|
73 | |
74 | /******************************************************************************************************************************************************************************/
|
75 | |
76 | inline void initSHIFTRegister(){ |
77 | |
78 | SHIFTReg = 0xFF; |
79 | SHIFTPort = 0b00001000; // SCLR Port auf High schalten um Werte setzen zu können |
80 | |
81 | }
|
82 | |
83 | inline void Schiebe_1Bit(){ |
84 | |
85 | SHIFTPort |= (BIT << SI); |
86 | _delay_ms(MAX_DELAY); |
87 | SHIFTPort |= (0 << SCK); |
88 | _delay_ms(MAX_DELAY); |
89 | SHIFTPort |= (1 << SCK); |
90 | _delay_ms(MAX_DELAY); |
91 | |
92 | }
|
Es kann sein das die PINs im Code nicht mit der Skizze übereinstimmen, da ich die Skizze ziemlich schnell gemacht habe! (= Schonmal Danke für euere Hilfe!! Gruß Franz