Tom Cee schrieb:
> Ich hab die Module einzeln getestet und etwas den Überblick verloren.
Fang als erstes damit, die überzähligen Leerzeilen rauszuwerfen.
Wenn du mehr als eine Leerzeile hintereinander machst um etwas
abzusetzen, dann hat es sich der nächste Code-Abschnitt verdient, dass
* er nur mit 1 Leerzeile eingeleitet wird
* dafür aber ein Blockkommentar vor dem Block beschreibt, was
an dieser Stelle im Code, global gesehen, passieren wird.
So was
1 | #define TOGGLE(port,pin) PORT ## port ^= (1<<pin)
|
2 | #define READ(port,pin) (PIN ## port & (1<<pin))
|
3 |
|
4 |
|
5 |
|
6 |
|
7 | /*********************Funktions Prototypen*****************************************/
|
8 |
|
9 |
|
10 | int button_is_pressed();
|
11 | void delay_ms(uint16_t ms);
|
12 | int button_is_pressed();
|
13 | int read_adc(void);
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 | /********************Stepper mit ADC.c*****************************/
|
21 |
|
22 | #include <avr/interrupt.h>
|
23 | #include <stdint.h>
|
24 | #include "myheader.h"
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 | volatile uint8_t reload=0;
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 | int main (void)
|
39 | {
|
40 |
|
41 |
|
42 | while (button_is_pressed(1))
|
43 | {
|
44 |
|
45 |
|
46 | read_adc();
|
47 |
|
48 |
|
49 | }
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 | }
|
erhöht keine Übersicht, sindern verringert sie, weil es den Code
unnötigerweise einfach nur in die Länge zieht und man so auf dem
Bildschirm weniger Nutzinformation sieht.
1 | #define TOGGLE(port,pin) PORT ## port ^= (1<<pin)
|
2 | #define READ(port,pin) (PIN ## port & (1<<pin))
|
3 |
|
4 | /*********************Funktions Prototypen*****************************************/
|
5 | int button_is_pressed();
|
6 | void delay_ms(uint16_t ms);
|
7 | int button_is_pressed();
|
8 | int read_adc(void);
|
9 |
|
10 | /********************Stepper mit ADC.c*****************************/
|
11 | #include <avr/interrupt.h>
|
12 | #include <stdint.h>
|
13 | #include "myheader.h"
|
14 |
|
15 | volatile uint8_t reload=0;
|
16 |
|
17 | int main (void)
|
18 | {
|
19 | while (button_is_pressed(1))
|
20 | {
|
21 | read_adc();
|
22 | }
|
23 | }
|
Hmm. Die übliche logische Sequenz in main ist doch eher die
1 | int main()
|
2 | {
|
3 | ... die benutzte Hardware initialisieren
|
4 | ... das bedeutet zb die DDR richtig setzen
|
5 | ... Pullups einschalten, falls gebraucht
|
6 | ... Timer richtig einstellen, etc, etc
|
7 | ... kurz und gut: die Vorraussetzungen schaffen
|
8 | ... das der Prozessor richtig konfiguriert ist um
|
9 | ... überhaupt mit der eigentlichen Arbeit anfangen
|
10 | ... zu können
|
11 |
|
12 | sei(); // falls Interrupts benutzt werden
|
13 |
|
14 | while( 1 ) {
|
15 |
|
16 | .. Programmlogik
|
17 | .. zb. Wenn eine Taste gedrückt wird, mach etwas
|
18 |
|
19 | }
|
20 | }
|
Jetzt vergleich einmal deinen Ansatz für main() mit dem Grundschema und
versuche da die Entsprechungen zu finden. Du wirst keine finden :-)
Hinweis: Auch wenn deine read_adc() Funktion suggeriert, dass dort der
ADC ausgelesen wird, so tut sie das eigentlich nicht. Deine 'read_adc'
ist eigentlich mehr eine Initialisierungsfunktion, die den ADC in den
Arbeitsmodus schaltet. Initialisierungsfunktion -> hat in der
Hauptschleife nichts verloren, sondern wird vor die Hauptschleife
gesetzt. Auch sehe ich nirgends, wo zb die Voraussetzungen für den
Taster schaffst, oder braucht du keinen Pullup?
Und nimm auch den sei() aus der read_adc raus. Der hat dort drinnen auch
nichts verloren. Eine derartige wichtige Entscheidung, 'ab jetzt können
Interrupts auslösen', legt man nicht in eine Funktion die nur die
Aufgabe hat ein Gerät zu initialisieren. Diese Entscheidung, Interrupts
"ja bitte" macht man nachdem alles initialisiert ist und bevor die
while-Hauptschleife loslegt. Das kann aber eine einzelne
Initialisierungsfunktion nicht für sich entscheiden. Nach dem ADC könnte
ja zb der Timer drann sein, initialisiert zu werden.