mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega,spi und AD-wandler


Autor: baggio (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich soll die am Poti eingestellte analoge Werte des AD-wandler Max 146 
über Spi Bus durch Atmega 16 zum Pc in 1 seconde abstand erfassen.
Ich muss dabe dad folgendeProgramm(source Fil AVr compiler) ändert so 
ab, die Datenerfassung in abstand von 1 seconde erfolgt.

/Verwendung des MAX146/147 (8 Kanäle, 12 Bit AD-Wandler)
//auf ext. Erweiterungsboard (Polli_V2_spi)
//zum Einlesen von analogen Daten über SPI
//und Ausgabe über RS 232 zum PC
//Taste 1 (int0) unterbricht SPI-Aktivität kurzzeitig, LEDs blinken
//Compiler: CodeVision 1.24.8
//
#include <mega16.h>
#include <stdio.h>
#include <spi.h>
#include <delay.h>


// MAX147 externe Spannungsreferenz [mV]       - nicht für MAX 146 erf.
#define VREF 2500

// MEGA 16    SPI-Leitungen für MAX146/147

#define NCS PORTB.4     // MAX146-Pin 18        ---> 13    CON 1 auf 
Erweiterungsboard
#define DOUT PINB.5     // MAX146-Pin 17        ---> 14
                        // SCLK MAX146 Pin 19   ---> 19
                        // DOUT MAX146 Pin 15   ---> 15


union adcu
          {
          unsigned char byte[2];
          unsigned int word;
          };


interrupt [EXT_INT0] void ext_int0_isr(void)      // Taste 1 auf 
Polliboard
{
        PORTD=0x60;                               //Leds ein-aus
        delay_ms (1000);
        PORTD=0x00;
        delay_ms(1000);
}

void uartinit(void)
{
        UCSRA=0x00;
        UCSRB=0x58;            //TXD enable, 8 Bit              bei 
90S8535 UCR
        UBRRL=0x33;           //9600 Baud bei 8 MHz Quarz       bei 
90S8535 UBRR
}

// Funktion f. eine AD-Wandlung - Wert zurück
unsigned int max147_read(unsigned char kan)
{
        union adcu adc_data;
        unsigned char TB1, RB1,  RB2, RB3;
        //control byte f. Max 147
        //TB1=0x8F;     Kan. 0 ..., externe clock f. AD
        TB1=0x8e;       //Start, Kan. 7, unipolar,
                        //single ended, interne clock für AD
        if      (kan==0)
                TB1=0x8e;
        else if (kan==1)
                TB1=0xce;
        else if (kan==2)
                TB1=0x9e;
        else if (kan==3)
                TB1=0xde;
        else if (kan==4)
                TB1=0xae;
        else if (kan==5)
                TB1=0xee;
        else if (kan==6)
                TB1=0xbe;
        else if (kan==7)
                TB1=0xfe;


        NCS=0;          //Chip Select f. Max 147
        delay_us(100);
        SPDR=TB1;   RB1=spi(0);
        //SPDR=0x00;
        RB2=spi(0);
        //SPDR=0x00;
        RB3=spi(0);
        NCS=1;          //deselect f. MAX147
        delay_us(10);

        adc_data.byte[1]=RB2;
        adc_data.byte[0]=RB3;
        return(adc_data.word>>3)&0xfff;

}

void main(void)
{
unsigned  n1, n2, n3;      // Ergebnis der AD-Wandlung
float mittelw;       // Einstellung f. printf auf float with precision
unsigned char kan;



        // Input/Output Ports initialization
        // Port A
        DDRA=0x00; PORTA=0x00;
        DDRD=0x60;                      //Leds


        // Port B
        // the /SS pin is set as an output
        // with level 1, it's required by
        // the SPI to work in master mode
        //------        mega16     ------
        //
        //PB.7=SCLK     PB.6=MISO       PB.5=MOSI       PB.4=SS
        //
        DDRB=0xB0;      PORTB=0xB0;

        // Port C
        DDRC=0x00;   PORTC=0x00;


        uartinit();


        // SPI initialization des uP 90S8535
        // SPI Type: Master
        // SPI Clock Rate: 921.6 kHz=3.6864 MHz/4
        //
        // SPI Clock Phase: Cycle Half
        // SPI Clock Polarity: Low
        // SPI Data Order: MSB First
        SPCR=0x50;

        //putsf("\rMAX147 Demo\n");
        //putsf("\r***********************************************\n");

        delay_us(100);


        while (1)
        {
        /*
        for (kan=0; kan<8; kan++)
                {
                n=max147_read(kan);
                printf("Kanal= %2u  N=%4u U=%4umV\r\n",kan, n,(unsigned) 
((long) n*VREF/4096));
                }
        */
        kan=0;
        n1=max147_read(kan);
        printf("\r%4u\r", (unsigned) ((long) n1*VREF/4096));

        n2=max147_read(kan);
        printf("%4u\r", (unsigned) ((long) n2*VREF/4096));

        n3=max147_read(kan);
        printf("%4u\r", (unsigned) ((long) n3*VREF/4096));
        mittelw= (float) ((n1+n2+n3)/3);
        printf("------> Mittelw: %f\r",  mittelw*VREF/4096);


        delay_ms(500);
        GICR=0x40;
        MCUCR=0x02;
        #asm("sei")


      Kann jemand mir helfen,wo ih das Prog ändert muss um die lösung zu 
haben.
Danke.
        };
}

: Gesperrt durch Moderator
Autor: Düsendieb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und warung glaubst Du uns nicht, wenn wir Dir vorgestern geschrieben 
haben:

       delay_ms(500);


da ändern?

Autor: riki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beitrag "Atmega16 und spi bus"

 wie oft willst Du das noch Fragen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich soll die ...
  ***

Und mit welchem Teil dieses Satzes hast du Schwierigkeiten?

Der Hinweis, den du gekriegt ist, ist bei der banalen Aufgabenstellung 
schon fast zuviel. Noch konkreter und man muss dir den Code an der 
bewussten Stelle schon umändern (eine Zahl durch eine andere 
austauschen). Da ist dann von "Ich" praktisch gar nichts mehr übrig!

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.