ich versuche jetzt schon seit einer gefühlten ewigkeit erfolglos mit
einem Atmega8 einen 8bit dac zu steuern. der aufbau: am port D meines
atemega 8-16pu hängt ein pm7528 8 bit dac. die steuerpins sind mit pin
3,4 und 5 am C-port. aufgebaut habe ich alles mit samt dem 16mhz quarz
und hünerfutter auf dem steckbrett. zum ablauf: der atmega sendet im
10ms bereich jeweils den wert 0 und 255, also alles 1, alles 0. zum
problem: die am dac ausgegebene spannung beträrt konstant 100%. wen ich
nun alerdings zum testen den taste des oszis an einen der dateneingänge
halte begint die ausgangsspannung mit genau der amplitude des zu
testenden eingangs zu schwingen. ich vermutete, dass der atmega nicht
richtig auf low schaltet, und sobalt ich das oszi anschliese es mit
seinem 1(megaohm) als puldown wirkt und deshab das ganse funktioniert.
besterkt wurde diese these damit, dass wen ich den die die daten und
steuerleitungen manuell von 1 auf 0 schalte (also die kabel umstecke)die
ausgangsspannung nach dem eingestelten wert richtet und sich mit
writeenable auf low "einfrieren" läst. also habe ich kurzterhand
10(kiloohm) widerstände als pulldown an die daten und steuerleitungen
montiert. am ausgang gemessen: konstant 0V. oszi wieder an
datenleitungen dran und sihe da: spannung auf 1V gesunken! nun stellt
sich mir die frage: warum sinkt die spannung so stark ab? es fliesen ja
nur 0,5mA über die wiederstände. habe ich irgend etwas falsch
programiert, oder haben atmegas seit neuestem wirklich so einen hohen
innenwiderstang. früher haben wir ja leds mit 50 und mer mA
angeschlossen, und es hat wunderbar funktioniert. oder habe ich gar
einen defekten prozessor. an der spannungsversorgung kann es übrigens
nicht liegen, die liefert locker 20A.
Kann es sein, dass du den Pin als Eingang konfiguriert hast und nur den
internen Pullup ein- und ausschaltest?
Zeig und mal Schaltplan und Code.
PS: Wenn man die Shift-Taste gedrückt hält während man einen Buchstaben
antippt kann man Großbuchstaben schreiben.
Meine Glaskugel zeigt ja so was von Nebel an...
Infrage kommt ein Fehler in Zeile 42 Deines Programmes,
die Fuses sind konfus,
oder Pin X hängt in der Luft.
Günda schrieb:> früher haben wir ja leds mit 50 und mer mA angeschlossen, und es hat> wunderbar funktioniert.
Wer meint, auf Datenblätter scheissen zu können, darf sich nicht
wundern, wenn die Chips nicht mehr mitspielen.
Ich weiss zwar nicht, warum es bei dir nicht funktioniert, von
nicht-verstandenem 7528 der über VRef seine Spannung ausgibt und über
OUT1 die Referenzspannung empfangen will, über hochohmige Verbindungen
auf dem Steckbrett inklusive weggelassenen Stützkondensatoren und
defektem uC ist alles möglich,
aber ich weiss, dass es an deiner unaufmerksamen Scheiss auf Datenblatt
und Verständnis- Haltung liegt.
Max H. schrieb:> Kann es sein, dass du den Pin als Eingang konfiguriert hast und nur den> internen Pullup ein- und ausschaltest?
habe auch schon versucht
MaWin schrieb:> hochohmige Verbindungen auf dem Steckbrett
habe alle durchgemesse, alle unter 1(Ohm)
> inklusive weggelassenen Stützkondensatoren
Sind vorhanden
Max H. schrieb:> Zeig und mal Schaltplan und Code.
der code:
1
#define F_CPU 16000000
2
#include<avr/io.h>
3
#include<util/delay.h>
4
#include"deprecated.h"
5
#define DATEN_PORT PORTD // Datenport D0-D7
6
#define STEUERUNG_PORT PORTB //Steuerungs Port
7
#define A_B_BIT 0 //DACA/DACB Bit
8
#define WRITEENABLE_BIT 8 //Write Enable Bit
9
#define CHIPSELECT_BIT 2 // Chip Select Bit
10
11
12
intmain(void)
13
{
14
while(1)
15
16
{
17
18
cbi(STEUERUNG_PORT,A_B_BIT);// DACA/DACB Bit low für DACA
19
DATEN_PORT=255;//Daten senden
20
cbi(STEUERUNG_PORT,WRITEENABLE_BIT);// WE Steuerungsport auf low um DAC auf daten empfangen zu schalten
21
cbi(STEUERUNG_PORT,CHIPSELECT_BIT);// CS Steuerungsport auf low um DAC auszuwählen
22
_delay_ms(1);// verzögerung, das obrige befehe ausgeführt werden können
23
sbi(STEUERUNG_PORT,WRITEENABLE_BIT);// WE Steuerungsport auf high um DAC auf daten ausgeben zu schalten
24
sbi(STEUERUNG_PORT,CHIPSELECT_BIT);// CS Steuerungsport auf high um DAC abzuwählen
25
_delay_ms(10);// verzögerung
26
cbi(STEUERUNG_PORT,A_B_BIT);// DACA/DACB Bit low für DACA
27
DATEN_PORT=0;//Daten senden
28
cbi(STEUERUNG_PORT,WRITEENABLE_BIT);// WE Steuerungsport auf low um DAC auf daten empfangen zu schalten
29
cbi(STEUERUNG_PORT,CHIPSELECT_BIT);// CS Steuerungsport auf low um DAC auszuwählen
30
_delay_ms(1);// verzögerung, das obrige befehe ausgeführt werden können
31
sbi(STEUERUNG_PORT,WRITEENABLE_BIT);// WE Steuerungsport auf high um DAC auf daten ausgeben zu schalten
32
sbi(STEUERUNG_PORT,CHIPSELECT_BIT);// CS Steuerungsport auf high um DAC abzuwählen
33
_delay_ms(10);// verzögerung
34
}
35
}
(ich weiß, das es nicht der beste code ist, aber mir viel auf die
schnelle nichts anderes ein. fals jemand einen besseren vorschlag hat
würde ich mich darüber sehr freuen)
Schaltplan im anhang
Günda schrieb:> Unbenannt.png
Also im Datenblatt steht für 5V VDD:
OUTA or OUTB at 2.5V
und das wird seinen Grund haben.
Max H. schrieb:> Wenn ich es nicht übersehen habe, rührst du die DDRx Register in deinem> Code gar nicht an. Alle IOs sind nach dem Reset Eingänge.
So ist es.