Forum: Mikrocontroller und Digitale Elektronik AD-Wandler im ATmega8535


von Constantin Alexandru M. (azzuro)


Angehängte Dateien:

Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.