Forum: Mikrocontroller und Digitale Elektronik Atmega 32 zu hoher Low Pegel


von georg h. (mj_23)


Lesenswert?

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!

von me (Gast)


Lesenswert?

Zeig einmal den vollständigen Schaltplan.
Wie hast du die 1.2V ermittelt?

von georg h. (mj_23)


Angehängte Dateien:

Lesenswert?

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..

von Julian B. (julinho)


Lesenswert?

Poste mal den Code!

von Alex S. (thor368)


Lesenswert?

Tach georg,

code wäre auch hilfreich. Ich gehe jede Wette ein, dass das DDR noch low 
ist.

Thor

von H.Joachim S. (crazyhorse)


Lesenswert?

Ich tippe mal auf JTAG-fuse :-)

von Kurt (Gast)


Lesenswert?

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

von bernd-m (Gast)


Lesenswert?

imho sollte auch vcc und avcc des uc beschaltet sein.

von Julian B. (julinho)


Lesenswert?

JTAG nicht ausgeschaltet?

von Georg Haselhofer (Gast)


Lesenswert?

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);

}
}

von H.Joachim S. (crazyhorse)


Lesenswert?

Ui...
Null shift irgendwas ergibt was???

von M. B. (Firma: TH Nürnberg) (ohmen)


Lesenswert?

Probiers mal so...

MCUCSR |=(1<<JTD);
MCUCSR |=(1<<JTD);

von Georg Haselhofer (Gast)


Lesenswert?

Danke Danke!

Hab die Jtag Deaktivierung wo raus kopiert ,..

Jetzt funktioniert es!

Vielen Dank =)

von troll (Gast)


Lesenswert?

> DDRC |= (0 << 2);
Du brauchst Bitmanipulation zu lesen. Dringend.

von georg h. (mj_23)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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
von Route_66 H. (route_66)


Lesenswert?

Hallo!
Mit SETBIT0 löscht er ja die Bits d.h. das DDRC steht komplett auf 
Eingang!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Route_66 H. (route_66)


Lesenswert?

Hallo!
DDRC = 0x00 ????

von Uwe (Gast)


Lesenswert?

> #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 ?

von georg h. (mj_23)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Route_66 H. (route_66)


Lesenswert?

Hallo!
Das habe ich doch bereits 16:47 bemängelt!

von J.-u. G. (juwe)


Lesenswert?

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.

von georg h. (mj_23)


Lesenswert?

Vielen Dank!

von georg h. (mj_23)


Lesenswert?

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)

von Karl H. (kbuchegg)


Lesenswert?

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;

von pony (Gast)


Lesenswert?

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!

von georg h. (mj_23)


Lesenswert?

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
Noch kein Account? Hier anmelden.