ADC und PortPin

Gast #3965213
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?
Gast #3965262
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren