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!
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?
@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
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
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 = ' '; } }
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.