Ich möchte mit dem ATmega8535 drei analoge Werte aufnehmen. Diese analoge Werte kommen jeweils von einem IR-Empfänger und sollen meine Finger erfassen. Je nach Position meiner Finger zwischen den 3 IR-Empfänger soll im uC ein Wert ausgegeben werden, der für die PWM-Signale am Ausgang und für die 7-Segment-Anzeige zuständig ist. Bei mir klappt es nicht so richtig mit der AD-Wandlung, da es nicht auf der Anzeige angezeigt wird. Wo steckt der Fehler im Programm?
Puh. Da ist jede Menge los in deinem Code. Das ist nicht so einfach nachzuvollziehen. Wenn ich einen Vorschlag machen darf. Du hast offenbar eine 7-Segment Anzeige, die du für Ausgabezwecke benutzen kannst. Schreib dir da Routinen, mit denen du einen beliebigen Zahlenwert ausgeben kannst. Und dann legst du erst mal fast deinen ganzen Code still und lässt dir nur die Werte von einem ADC ausgeben
1 | while(1) |
2 | {
|
3 | cap_button(); |
4 | |
5 | adc0 = ADC_Read (0); |
6 | adc1 = ADC_Read (1); |
7 | adc2 = ADC_Read (2); |
8 | |
9 | output_value( adc0 ); // Wert auf der 7_Segment ausgeben |
10 | }
|
damit solltest du erst mal einen Einblick bekommen, welche Werte du vom ADC bekommst. Wenn die vom Kanal 0 gut aussehen, dann siehst du dir die vom adc1 an und weiters dann die vom adc2. Jeweils auch probieren ob sich die Werte so ändern, wie du denkst dass sich die ändern sollten. Sehen die Werte gut aus, dann fängst du an, deine Logik nach und nach wieder zu aktivieren, wobei du die 7-Segment anzeige benutzt um zu kontrollieren, was im Programm passiert. Die Anzeige ist dein Fenster in das Programm. Benutze es! So wie das im Moment aussieht hast du da eine Menge anscheinend ungetesteten Code. Da drinn ohne Debugger Fehler zu suchen ist mühsam. Fang vorne an, kontrolliere die Werte vom ADC und dann debuggst du dich mit der 7-Segment Anzeige langsam vor. Schrittweise arbeiten heisst die Devise. Haufenweise ungetesteten Code zu produzieren, bringt nur eines: du stehst mit einem Haufen Code da, nichts funktioniert und niemand weiss, wo man mit der Fehlersuche anfangen soll.
Karl H. schrieb: > benutzen kannst. Schreib dir da Routinen, mit denen du einen beliebigen > Zahlenwert ausgeben kannst. Ich seh grad: Hast du ja schon.
1 | void max7219_disp_uint8(uint8_t Number) |
2 | {
|
3 | ....
|
4 | }
|
Dann eben so
1 | while(1) |
2 | {
|
3 | cap_button(); |
4 | |
5 | adc0 = ADC_Read (0); |
6 | adc1 = ADC_Read (1); |
7 | adc2 = ADC_Read (2); |
8 | |
9 | max7219_disp_uint8( adc0 ); |
10 | }
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.