Forum: Mikrocontroller und Digitale Elektronik ADC und PortPin


von IGast (Gast)


Lesenswert?

Hallo,
habe folgendes Problem bei meiner Ansteuerung meiner LEDs. Wenn ich den 
ADC_Init in den Code integriere, dann leuchten nur 6 anstelle der 9 
LEDs.
Wird der ADC_Init auskommentiert, so leuchten alle 9 LEDS wie gewollt. 
Der Port A benötigt folgende Konfiguration
PA3=Eingang ADC
PA7=Ausgang (Poti für ADC freigeben)
PA0-PA2: Kathoden der LED, Ausgänge bei Null leuchtet die jeweilige 
Ebene
Ebene 1= 110
Ebene 2= 101
Ebene 3= 011
PA4-PA6: Anode der LEDs, ist diese High, so leuchten je nach Ebene die 
LEDs dieser Reihe
Reihe 1= 001
Reihe 2= 010
Reihe 3= 100

Sollen alle Leuchten so hat PORTA=0xf0:
1
int main(void)
2
{
3
    ///////IO Konfiguration//////////
4
  DDRA=0xf7;
5
  DDRB=0x00;
6
  ADC_Init();
7
  
8
    
9
  
10
  
11
  while(1)
12
    {
13
        if (PINB & (1<<PINB2))
14
    {
15
      PORTA=0x10;
16
    }
17
    else
18
    {
19
      LEDallOFF();
20
    }
21
        
22
    }
23
return 0;
24
}
 hier die ADC_Init aus dem Tutorial AD Wandler mikrocontroller.net:
1
/////////////////////ADC///////////////////////////////
2
/* ADC initialisieren */
3
void ADC_Init(void) {
4
 
5
  // die Versorgungsspannung AVcc als Refernz wählen:
6
  //ADMUX = (1<<REFS0);    
7
  // oder interne Referenzspannung als Referenz für den ADC wählen:
8
  ADMUX = (1<<REFS1) | (0<<REFS0);
9
 
10
  // Bit ADFR ("free running") in ADCSRA steht beim Einschalten
11
  // schon auf 0, also single conversion
12
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
13
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
14
 
15
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
16
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
17
 
18
  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung 
19
  while (ADCSRA & (1<<ADSC) ) {         // auf Abschluss der Konvertierung warten
20
  }
21
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
22
     Wandlung nicht übernommen. */
23
  (void) ADCW;
24
}

Kann jemand den Fehler finden?

von ratestunde (Gast)


Lesenswert?

Kein µC genannt, kein komplettes Programm - keine Lösung zu finden 
versucht.

von IGast (Gast)


Lesenswert?

Es handelt sich um einen Attiny84A Hier der ganze Code
Hier die Main:
1
#define F_CPU 8000000
2
#include <avr/io.h>
3
#include <avr/sleep.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6
#include "LEDCube.h"
7
8
9
int main(void)
10
{
11
    ///////IO Konfiguration//////////
12
  DDRA=0xff;
13
  DDRB=0x00;
14
  ADC_Init_AT84();
15
  
16
  //MCUCR=0x02;
17
  //sei();
18
  //GIMSK |= (1 << INT0);
19
  
20
  
21
  
22
  
23
  while(1)
24
    {
25
        if (PINB & (1<<PINB2))
26
    {
27
      LEDallON();
28
    }
29
    else
30
    {
31
      LEDallOFF();
32
    }
33
          
34
    }
35
return 0;
36
}
LedCube_h:
1
#ifndef LEDCube_H
2
#define LEDCube_H
3
4
5
//verwendete Taktfrequenz///////
6
#ifndef F_CPU
7
#define F_CPU 8000000
8
#endif
9
10
11
///LED////
12
int LED1(void);
13
int LED2(void);
14
int LED3(void);
15
int LED4(void);
16
int LED5(void);
17
int LED6(void);
18
int LED7(void);
19
int LED8(void);
20
int LED9(void);
21
void LEDallON(void);
22
void LEDallOFF(void);
23
24
//ADWandler////////////
25
void ADC_Init(void);
26
uint16_t ADC_Read(uint8_t channel);
27
28
#endif
hier die LED_Routine.c
1
#include <avr/io.h>
2
#include "LEDCube.h"
3
#include <util/delay.h>
4
5
6
////////////////////////LED Bitmuster PORTA////////////////////////
7
8
void LEDallON()
9
{
10
  PORTA=0xf0;
11
}
12
void LEDallOFF()
13
{
14
  PORTA=0x00;
15
}
16
17
18
19
20
21
22
/////////////////////ADC von mikrocontroller.net Tutorial Analoge Ein/Ausgänge///////////////////////////////
23
/* ADC initialisieren */
24
void ADC_Init_AT84(void) {
25
 
26
  // die Versorgungsspannung AVcc als Refernz wählen:
27
  //ADMUX = (1<<REFS0);    
28
  // oder interne Referenzspannung als Referenz für den ADC wählen:
29
  ADMUX = (1<<REFS1) | (1<<REFS0);
30
 
31
  // Bit ADFR ("free running") in ADCSRA steht beim Einschalten
32
  // schon auf 0, also single conversion
33
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
34
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
35
 
36
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
37
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
38
 
39
  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung 
40
  while (ADCSRA & (1<<ADSC) ) {         // auf Abschluss der Konvertierung warten
41
   }
42
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
43
     Wandlung nicht übernommen. */
44
  (void) ADCW;
45
}
46
 
47
/* ADC Einzelmessung */
48
uint16_t ADC_Read( uint8_t channel )
49
{
50
  // Kanal waehlen, ohne andere Bits zu beeinflußen
51
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
52
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
53
  while (ADCSRA & (1<<ADSC) ) {   // auf Abschluss der Konvertierung warten
54
  }
55
  return ADCW;                    // ADC auslesen und zurückgeben
56
}

von IGast (Gast)


Lesenswert?

Habe den Fehler gefunden, habe es aber noch nicht verstanden warum. Habe 
ADMUX = (0<<REFS1) | (1<<REFS0); geändert, und siehe da, es 
funktioniert.
Warum muss REFS1 auch 0 sein?

von Oliver R. (orb)


Lesenswert?

IGast schrieb:
> Warum muss REFS1 auch 0 sein?

Muß es nicht.
Schau mal ins Datenblatt (16.13.1). REFS0=1 und REFS1=1  wird als 
'Reserved' bezeichnet und sollte nicht benutzt werden.
Für Dich sollte REFS0=0 und REFS1=1 richtig sein, interne 1.1Volt 
Referenz.
Bei REFS0=1 und REFS1=0 erwartet er eine Referenzspannung an PA0.

von ratestunde (Gast)


Lesenswert?

IGast schrieb:
>
1
> int main(void)
2
> {
3
>     ///////IO Konfiguration//////////
4
>   DDRA=0xff;
5
>   DDRB=0x00;
6
>   ADC_Init_AT84();
7
>

Gibt es noch einen ADC Eingang? Hier sind alle PortA Pins auf Ausgang 
konfiguriert.

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.