Forum: Mikrocontroller und Digitale Elektronik ATmega16 + MAX187


von Thomas M. (Gast)


Lesenswert?

Hi,

ich möchte mit meinem ATmega16 einen MAX187 ADU auslesen. Das kann ich
mit dem USART, der MISO/MOSI und einfach über einen belibigen Port
machen, oder? Den USART verwende ich schon für die Kommunikation mit
dem PC und mit der MISO/MOSI kenne ich mich noch nicht aus. Was würdet
ihr mir raten? Ich weiss auch nocht nicht wie ich das ganze mit dem
seriellen ADU realisieren soll. Hättet ihr da mal ein Tip für mich in
dieser Angelegenheit.

Danke!

von Chris Luo (Gast)


Lesenswert?

I have some similar project. I aquired Dout from MAX187 to AT90s2313.
And use UART to display the result into PC. But the output is always
4095. Nothing changes even a littel. I have no I idea what happens.
Could anybody give me a hand?

von Dirk Dörr (Gast)


Lesenswert?

@Thomas:
Nimm SPI und verbinde den ADC mit dem Controller so wie es im
Datenblatt des ADCs Seite4. Rechts oben (MISO) beschrieben ist.

Dann lies Dir das Kapitel über SPI im Datenblatt des Controllers durch.
Ist nicht sehr schwer.

@Chris
Post your code

von Dirk (Gast)


Lesenswert?

Hi,

ich schlage Dir persoenlich den HW SPI deines Mega16 vor.

MOSI = bleibt offen
MISO = DOUT
SCLK = SLCK
/SS = /CS

Du sendest ueber Mosi 1 Byte, dadurch wird ein Clocksignal zum ADC
gesendet und du hast deine Informationen im SPI Data Register.

Gruß,

Dirk

von Dirk (Gast)


Lesenswert?

Hi,

auf Seite 12 siehst du das Zeitverhalten.

Gruß,
Dirk

von Chris Luo (Gast)


Lesenswert?

Thomas,

Here is my code.

/*********************************************
This program was produced by the
CodeWizardAVR V1.23.8d Evaluation
Automatic Program Generator
© Copyright 1998-2003 HP InfoTech s.r.l.
http://www.hpinfotech.ro
e-mail:office@hpinfotech.ro

Project :
Version :
Date    : 12.4.2006
Author  : Freeware, for non-commercial use only
Company :
Comments:


Chip type           : AT90S2313
Clock frequency     : 8,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
*********************************************/


#include <90s2313.h>
#include <delay.h>
#include <stdlib.h>

#define SCLK  PORTD.2
#define DOUT PIND.5
#define NCS  PORTD.3
#define NSHDW PORTD.4

// Declare your global variables here

void uart_putc(unsigned char data){
  UDR=data;
  delay_ms(10);
}

void uart_puts( char *s){
  while(*s)
    uart_putc(*s++);
}

void uart_puti(const int val){
  char buffer[sizeof(int)*8+1];
  itoa(val, buffer);
  uart_puts(buffer);
}

void init(){
  SCLK = 0;
  NCS = 0;
}

void doSCLK(void){
  SCLK = 1;
  delay_us(50);
  SCLK = 0;
   delay_us(50);
  return;
}


int receive(void){
  int i,data;
  doSCLK();
  data=0;
  for(;DOUT==0;);
  for(i=0;i<12;i++){ doSCLK(); data=(data<<1)|DOUT;}
  NCS = 1;
  return(data);

}



void main(void)
{
  DDRD = 0xdc;      // inital output and input pins
  UCR=0x18;        // initla UART
  UBRR=0x33;
while (1)
      {
      // Place your code here
   init();
   uart_puti(receive());
   UDR = ' ';

      }
}

von Cheffe (Gast)


Lesenswert?

Hallo, hier mein BASCOM-Schnipsel (MEGA32, 16Mhz) für z.B. 100 Werte.
Anschluß einfach an drei Portpins.

Config Pind.6 = Input
'MAX189_6_DOUT
Config Pind.5 = Output
'MAX189_7_/CS
Config Pind.4 = Output
'MAX189_8_SCLK

Declare Sub Max_wandlung(byval Anzahl_max189_werte As Byte)
Dim Max189_bits(12) As Byte                                 'die 12
eingelesenen Bits
Dim Max189_wert(100) As Integer                             '100
Werte

Portd.4 = 0                                                 'ADC
initialisieren
Portd.5 = 0
Portd.5 = 1
Portd.4 = 1
Portd.4 = 0

call Max_wandlung(100)

endlos:
goto endlos




Sub Max_wandlung(byval Anzahl_max189_werte As Byte)
Local V As Byte
Local U As Byte
Local Dezimal_temp As Integer

For U = 1 To Anzahl_max189_werte
Max189_wert(u) = 0
Portd.5 = 1
Portd.5 = 0

Conversion:
If Pind.6 = 0 Then Goto Conversion

Portd.4 = 1
Portd.4 = 0

For V = 12 To 1 Step -1
Portd.4 = 1
Max189_bits(v) = Pind.6
Portd.4 = 0
Next V
Portd.5 = 1

For V = 11 To 0 Step -1
If Max189_bits(v) <> 0 Then
Dezimal_temp = V
Dezimal_temp = 2 ^ Dezimal_temp
Max189_wert(u) = Max189_wert(u) + Dezimal_temp
End If
Next V
Next U
End Sub

von Dirk B. (dirk-)


Angehängte Dateien:

Lesenswert?

Hi,

im Anhang eine Version mit HW SPI.

Es koennte sein das die Datenbits anders geschoben werden muessen.


(Das Beispiel wurde nicht in Reallife getestet)

Gruß,

Dirk

von Dirk B. (dirk-)


Angehängte Dateien:

Lesenswert?

Mist kleiner Fehler in der SPI Master Init Routine im Anhang die neue
Version

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.