Wenn ich bei meinem Atmega 32 (bzw. bei verschiedenen Atmega32) einen DAC anhänge, geht der Low-Pegel auf 1,2 V und der DAC sieht den programmieren Low Pegel als High Pegel an.. DAC: http://www.analog.com/en/digital-to-analog-converters/da-converters/ad557/products/product.html Wollte schönere Pegel für den DAC schaffen und wollte einen HEX-Schmitt-Inverter benutzen und dann halt alles invertiert programmieren,aber.. wenn ich einen normalen 74LS14 (ohne DAC) an den Atmega hänge, springt der Low pegel auf 1,2 V und der 74LS14 ,sieht den Pegel als high an und gibt einen Low Pegel aus.. 74LS14: http://www.ti.com/lit/ds/symlink/sn74ls14.pdf Ohne etwas angeschlossen hat der Atmega einen Low-Pegel von einigen mV,.. An was kann das liegen? Passiert ja schließlich bei mehreren Bausteinen,.. bzw. was kann man dagegen machen? Danke!
Zeig einmal den vollständigen Schaltplan. Wie hast du die 1.2V ermittelt?
Die ungefähren 1,2V mit Multimeter ermittelt. Müssen aber real auch da sein,da sonst nicht die Schwelle für High überschritten werden würde..
Tach georg, code wäre auch hilfreich. Ich gehe jede Wette ein, dass das DDR noch low ist. Thor
georg haselhofer schrieb: > Wenn ich bei meinem Atmega 32 (bzw. bei verschiedenen Atmega32) > einen DAC anhänge, geht der Low-Pegel auf 1,2 V und der DAC sieht den > programmieren Low Pegel als High Pegel an.. > Da scheint noch irgendwas anderes kurze impulse zu erzeugen. Die Kapazität des 74.. integriert sie etwas, darum der (scheinbare) Wechsel von 300 auf 1200 mV. Kurt
Vcc und GND am uC sind natürlich beschaltet! jtag ausgeschaltet! Code: #define F_CPU 8000000 #include <avr/io.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> //#include <math.h> #include "mylcd.h" int main (void) { DDRC |= (0 << 0); DDRC |= (0 << 1); DDRC |= (0 << 2); DDRC |= (0 << 3); DDRC |= (0 << 4); DDRC |= (0 << 5); DDRC |= (0 << 6); DDRC |= (0 << 7); MCUCSR = (1<<JTD); MCUCSR = (1<<JTD); while(1==1) { PORTC |= (0 << 7); PORTC |= (0 << 6); PORTC |= (0 << 5); PORTC |= (0 << 4); PORTC |= (0 << 3); PORTC |= (0 << 2); PORTC |= (0 << 1); PORTC |= (1 << 0); } }
Danke Danke! Hab die Jtag Deaktivierung wo raus kopiert ,.. Jetzt funktioniert es! Vielen Dank =)
Hab mir gestern eigebildetes ,dass es funktioniert hat (bzw hat es vl auch..) hab den Code ein wenig überarbeitet: #define F_CPU 8000000 // Set und Clear bit als Macro #define SETBIT1(ADRESS,BIT) (ADRESS |= (1<<BIT)) #define SETBIT0(ADRESS,BIT) (ADRESS &= ~(1<<BIT)) #define SETBITT(ADRESS,BIT) (ADRESS ^= (1<<BIT)) //Macro zur BIT-Abfrage #define CHECKBIT1(ADRESS,BIT) (ADRESS & (1<<BIT)) #define CHECKBIT0(ADRESS,BIT) ( !(ADRESS & (1<<BIT)) ) #include <avr/io.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include "mylcd.h" int main (void) { SETBIT0(DDRC,0) ; SETBIT0(DDRC,1) ; SETBIT0(DDRC,2) ; SETBIT0(DDRC,3) ; SETBIT0(DDRC,4) ; SETBIT0(DDRC,5) ; SETBIT0(DDRC,6) ; SETBIT0(DDRC,7) ; MCUCSR |=(1<<JTD); MCUCSR |=(1<<JTD); while(1==1) { SETBIT0(PORTC,0) ; SETBIT0(PORTC,1) ; SETBIT0(PORTC,2) ; SETBIT0(PORTC,3) ; SETBIT0(PORTC,4) ; SETBIT0(PORTC,5) ; SETBIT0(PORTC,6) ; SETBIT0(PORTC,7) ; } } Müsste ja stimmen oder? Aber wieder 1,2V Low Pegel --> DAC gibt 2,56V aus ,als währen nur High-Pegel angehängt...
georg haselhofer schrieb: > Aber wieder 1,2V Low Pegel wie kommst du da auf Low-Pegel? So wie ich das Programm sehe, setzt du alle Pins am Port C auf Ausgang und dann wiederrum alle Pins auf 1, also 5V. D.h. du hast nicht 1.2V Low-Pegel sondern 1.2V High-Pegel. Und da erhebt sich die Frage, warum sind die nur 1.2V und nicht 5V?
:
Wiederhergestellt durch User
Hallo! Mit SETBIT0 löscht er ja die Bits d.h. das DDRC steht komplett auf Eingang!
Ja, habs auch gerade gesehen. Darf ich vo4rschlagen, das Makro dann CLearBit zu nennen und nicht SetBit. Man kann sich nämlich auch mit unpassenden Bezeichnungen laufend Eigentore schiessen. In deinem Fall (solange es sowieso nur ums testen geht)
1 | int main() |
2 | {
|
3 | DDRC = 0x00; |
4 | |
5 | while( 1 ) { |
6 | PORTC = 0x00; |
7 | }
|
8 | }
|
dann gibts auch erst mal keine Diskussionen. Und das JTAG: Schalte es per Fuse aus. Dann bist du auch nicht davon abhängig, ob dir der Optimizer beim programmgesteuerten Abschalten das Timing versaut oder nicht.
> #define SETBIT0(ADRESS,BIT) (ADRESS &= ~(1<<BIT))
Setzt wohl das entsprechende Bit auf 0 wie ich sehe.
Also setzt du alle Ports auf Eingang und machst danach den Pullup weg.
Warum wunderst du dich jetzt das du Irgendwas komisches an den Pins dran
hast ?
x |= (1 << Bitnummer); // wird ein Bit in x gesetzt (1) x &= ~(1 << Bitnummer); // wird ein Bit in x geloescht (0) (Atmel GCC) x |= (1 << Bitnummer); -->Setbit1 (high) x &= ~(1 << Bitnummer); -->Sebit0 (low) Hab den ganzen Port C ja auf Low gesetzt? Setbit1 liefert mir ca. 4,7V Setbit0 liefert mir ca. 1,2V (mit DAC oder anderem,..),sonst ca 0,3V
Route 66 schrieb: > Hallo! > DDRC = 0x00 ???? Das ist genau das, was er geschrieben hat. Und so sieht man dann auch gleich, was da verbockt wurde. STEBIT0 bzw. SETBIT1 sind nun mal saublöde Bezeichnungen, weil der wesentliche Unterschied erst ganz zum Schluss in der Bezeichnung kommt und dann auch noch so winzig ist, dass man ihn überliest, wenn man nicht sehr genau aufpasst. SET_BIT( ... ) CLR_BIT( ... ) und die Bezeichnungen sind so, dass man sie kaum mehr verwechselt.
georg haselhofer schrieb: > Hab den ganzen Port C ja auf Low gesetzt? Wie bereits mehrmals angemerkt, funktioniert das nur, wenn Du die "Datenrichtung" des Ports auf "Ausgang" setzt.
Entweder ich habe nen argen Denkfehler aber: #define F_CPU 8000000 #include <avr/io.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include "mylcd.h" int main() { DDRC = 0x00; while( 1 ) { PORTC = 0b10101010; } } liefert: 4,7 / 1,2 / 4,7 /,.... [V] (Jtag natürlich deaktiviert)
georg haselhofer schrieb: > Entweder ich habe nen argen Denkfehler aber: > > > #define F_CPU 8000000 > > #include <avr/io.h> > #include <util/delay.h> > #include <stdio.h> > #include <stdlib.h> > #include <math.h> > > #include "mylcd.h" > > > int main() > { > > DDRC = 0x00; solange du deinen Port nicht auf Ausgang stellst, kannst du in weiterer Folge die Pullups umschalten so oft du willst. Wenn du da ein wenig Last drann hast, bricht dir der Pegel ein, bzw. die 'Last' zieht ihn hoch, bzw. der Pullup zieht die Last hoch. Wenn 2 Eingänge 'gegeneinander' arbeiten, hast du nun mal keinen sauberen Pegel. Einer der beiden muss ein Ausgang sein. Vorzugsweise ist das der µC, wenn er die Werte vorgeben soll. DDRC = 0xFF;
J.-u. G. schrieb: > georg haselhofer schrieb: >> Hab den ganzen Port C ja auf Low gesetzt? > > Wie bereits mehrmals angemerkt, funktioniert das nur, wenn Du die > "Datenrichtung" des Ports auf "Ausgang" setzt. georg haselhofer schrieb: > DDRC = 0x00; Das ist nicht auf Ausgang gesetzt!
Danke für eure tolle Hilfe!! Habs jetzt verstanden und funktioniert auch =) Vielen Vielen Dank
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.