www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik problem mit AD Wandler0809


Autor: smith (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

}

Autor: smith (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier die Grundschaltung

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.