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.
:
Bearbeitet durch User
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.
Hi Wichtige Regeln - Groß- und Kleinschreibung verwenden! MfG spess
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 | int main(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
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.
:
Bearbeitet durch User
Hallo, ja wie vermutet, werden keine Ausgänge definiert, nur der Pullup ein und ausgeschaltet !
@Günda, und wie heißt es so schön RTF ! Erst alle wild machen, und dann selbst von der Materie keine Ahnung haben.
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.
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.