Atmega 32 zu hoher Low Pegel

OP #2863589
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!
Gast #2863654
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
Gast #2863674
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);

}
}
OP #2864482
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...
#2864494
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.
Gast #2864499
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 ?
OP #2864502
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
#2864503
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.
OP #2864525
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)
#2864528
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren