Forum: Mikrocontroller und Digitale Elektronik Mit ADC und Poti, LEDs ansteuern


von Tobi (Gast)


Lesenswert?

Hallo,

ich habe mal die Frage warum mein Code nicht funktioniert?
1
#include <avr/io.h>
2
#include <stdint.h>
3
#define L1  PD2   //LEDs
4
#define L2  PD3
5
#define L3  PD4
6
#define L4  PD5
7
#define L5  PD6
8
#define L6  PD7
9
#define S2  PC1  //Spalte von LED Matrix die ich ansteuern möchte
10
11
#define Freigeben(x)          PORTC &=~(1<<(x))
12
#define Sperren(x)     PORTC |=(1<<(x)); PORTD = 0b00000000
13
#define LED(x)       PORTD |=(1<<(x));
14
15
uint16_t adc()
16
{
17
  ADCSRA = (1<<ADEN)  | (1<<ADPS2) | (1<<ADPS0);
18
  ADMUX = 0;
19
  ADCSRA |=  (1<<ADSC);
20
  while (ADCSRA & (1<<ADIF));
21
  return ADCW;
22
}
23
24
int main()
25
{
26
DDRD |= (1<<L1)|(1<<L2)|(1<<L3)|(1<<L4)|(1<<L5)|(1<<L6);          
27
DDRC |= (1<<PC0)|(1<<S2);
28
PORTC |= 0b11111111;
29
while(1)
30
{
31
Freigeben(S2);
32
PORTD |= adc();
33
Sperren(S2);
34
}
35
}

Ich denke das mein Befehl, wo ich dem PORTD den 10Bit Wert von der 
Funktion adc() übergeben will, falsch ist, weiß aber nicht wie er 
aussehen muss?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> ich habe mal die Frage warum mein Code nicht funktioniert?
WAS funktioniert nicht?

> wo ich dem PORTD den 10Bit Wert von der Funktion adc() übergeben will
Übergeben geht in C so:
PORTD = adc();

von Tobi (Gast)


Lesenswert?

Es leuchtet alle LEDs (L1-6) in der Spalte (S2), habe den Code jetzt so 
verändert, klappt aber immer noch nicht

1
#include <avr/io.h>
2
#include <stdint.h>
3
#define L1  PD2   //LEDs
4
#define L2  PD3
5
#define L3  PD4
6
#define L4  PD5
7
#define L5  PD6
8
#define L6  PD7
9
#define S2  PC1  //Spalte von LED Matrix die ich ansteuern möchte
10
11
#define Freigeben(x)          PORTC &=~(1<<(x))
12
#define Sperren(x)     PORTC |=(1<<(x)); PORTD = 0b00000000
13
#define LED(x)       PORTD |=(1<<(x))
14
15
uint16_t adc()
16
{
17
  ADCSRA = (1<<ADEN)  | (1<<ADPS2) | (1<<ADPS0);
18
  ADMUX = 0;
19
  ADCSRA |=  (1<<ADSC);
20
  while (ADCSRA & (1<<ADIF));
21
  return ADCW;
22
}
23
24
int main()
25
{
26
DDRD |= (1<<L1)|(1<<L2)|(1<<L3)|(1<<L4)|(1<<L5)|(1<<L6);          
27
DDRC |= (1<<S2);
28
while(1)
29
{
30
Freigeben(S2);
31
PORTD = adc();
32
Sperren(S2);
33
}
34
}


Muss ich meinen Poti evtl als Eingang deklarieren, bzw an PullUp hängen, 
ich denke zwar nicht aber fragen kostet ja nichts.

von holger (Gast)


Lesenswert?

while(!(ADCSR&(1<<ADIF)));         // Wait for A/D conversion to finish

von Tobi (Gast)


Lesenswert?

Klappt immer noch nicht.

Was mir grade auch aufgefallen ist, das die S1 anfängt zu leuchten wenn 
ich den Poti voll aufdrehe. Das verstehe ich allerdings nicht, zwar 
hängt der Poti an PC0 was eigentlich auch S1 ist, aber ich habe den ja 
nicht deklatiert und nutze PC0 eigentlich als ADC.

von Karl H. (kbuchegg)


Lesenswert?

Ich denke mal, du hast dich mit deinen 'Wahnsinnsmakros selbst 
ausgetrickst. Schau doch mal was dein 'Sperren' Makro mit dem Port D 
macht. Es wird relativ sinnfrei sein, am Port D den Wert vom ADC 
auszugeben, wenn der Port gleich darauf wieder einen ganz anderen Wert 
bekommt.

von Tobi (Gast)


Lesenswert?

Ah okay, teste ich gleich mal. Schon mal danke

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.