Forum: Mikrocontroller und Digitale Elektronik problem mit AD Wandler0809


von smith (Gast)


Lesenswert?

Hallo

ich habe gerade ein AD Wandler besorgt und wollte überprüfen ob es 
funktioniert.hab ihn mit ein atmega16 angeschlossen und wollte über LEDS 
das Ergebniss von der convertierung sehen.das problem dass alle LEDS an 
PORTD immer an sind trotz dass ich die Spannung an IN0 ändere.

wäre nett wenn jemand mir hilfen kann
Danke im Voraus
hier bei mein source code:

#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <inttypes.h>



#define C     PA6
#define B     PA5
#define A     PA4
#define EOC   PA3
#define data  PORTC
#define TRUE  1
#define FALSE 0
volatile int8_t state=0;

unsigned short adc(unsigned char admux);
unsigned char ADC0809(unsigned char channel);

void TIMER1_interrupt_init(void);
void init_ports();





int main()
{

  unsigned char d;
  init_ports();
  IMER1_interrupt_init();

  sei();

  while( 1 )

  {


    d=ADC0809(0);
    PORTD=d;






  }
}

void init_ports()
{
DDRD=0xFF; //PORTD als Ausgang
PORTD =0x00;
DDRC=0x00; //PORTC als EINGANG
PORTC =0xFF;
DDRB=0xFF; //PORTB als Ausgang
PORTB =0x00;
DDRA=0xF0;
PORTA =0x08;
}

unsigned char ADC0809(unsigned char channel)
{
  unsigned char adwert;

  if ( channel == 0 )
  {
   PORTA &= ~ ( 1 << A) | ( 1 << B) | ( 1 << C) ;
  }
  if ( channel == 1 )
  {
   PORTA &= ~ ( 1 << B) | ( 1 << C) ;
   PORTA |=   ( 1 << A);
  }
  if ( channel == 2 )
  {
   PORTA &= ~ ( 1 << A) | ( 1 << C) ;
   PORTA |=   ( 1 << B) ;
  }
  if ( channel == 3 )
  {
   PORTA &= ~ ( 1 << C) ;
   PORTA |=   ( 1 << A) | ( 1 << B) ;
  }

  PORTD |=  ( 1 << START );
  PORTD &= ~( 1 << START );

  while(EOC==0);     //check for EOC to go high
  PORTD |=  ( 1 << OE );//enable output data
  adwert=data;      //read data
  PORTD &= ~ ( 1 << OE );            //disable adc


return adwert;          //return data
}
//ISR Für den ADC0809 CLOCK
ISR(TIMER1_COMPA_vect){
PORTB=state;
if ( state ==0 )
state=1;
else state=0;
}

void TIMER1_interrupt_init(void)
{
TCNT1=0; //Anfangszählerstand = 0
OCR1A=5; //Zähler zählt bis 5: 125000/5 = 200000  200kHz
TCCR1B=0x02; //CTC-Modus: Takt intern von 8 Mhz /8 = 1000000Hz
TIMSK|=(1<<OCIE1A);//Timer/Counter1 Compare A Match Interrupt 
aktivieren:

}

von smith (Gast)


Angehängte Dateien:

Lesenswert?

Hier die Grundschaltung

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.