Archiv verlassen und diese Seite im Standarddesign anzeigen : TTL 3,3V an atmega mit 5V (genauer NL552 ETTL)
Hallo,
ich will ein NL552 ETTL an einen Atmega48 mit 5V anschließen. Das Modul läuft mit 5V, gibt aber an der Schnittstelle nur 3,3V TTL aus. Im Datenblatt zum AVR steht, dass ein Highpegel mindestens 0,6 * Vcc braucht macht bei 5V = 3V. Aber kann das schon reichen, um über eventuell verlängerte Flanken die UART durcheinander zu bringen??
Hat so etwas in der Richtung schon mal einer von euch gemacht??
(Ich wollte mir halt den Pegelwandler sparen und so schnell komm ich da jetzt auch nicht dran...)
The Man
Hallo The Man!
Ich kenne sowohl NL552 (habe kein Datenblatt gefunden) als auch Atmega48 leider nicht. Der H-Pegel lässt sich allgemein mit einer Diode um ihre Durchflussspannung erhöhen (siehe Code).
MfG
VCC=5V
+
|
.-.
| | R
| |
D '-'
|
In 3,3V Logik >-----|<-+-----> Out 5V Logik
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)
hardware.bas
16.12.2010, 21:19
.... um den gleichen Pegel ziehe ich jedoch den L-Pegel hoch... Vg Micha
Das könnte eben ein Problem sein. ;)
Das müsste man mit verschiedenen Dioden bis Schottky probieren. Im schlimmsten Fall geht es leider ohne echten Pegelwandler nicht. :(
MfG
Besserwessi
16.12.2010, 21:41
Den Pegel per Diode (mit einen Kondensator parallel) anzuheben ist schon eine Möglichkeit, braucht nur etwas Strom. Was für eine Diode man nimmt ist relativ unkritisch. Ob man nur bei 3.5 V oder 4 V las High Pegel und 0.2 V oder 0.7 V als low ankommt ist relativ egal. Normal wird auch der 3 V Pegel schon reichen. Je nach IC /Modul geht auch ein einfacher Pullup Widerstand.
Als Pegelwandler würde sich ein IC der Serie 74HCT... anbieten.
Es könnte auch reichen die Spannung am µC zureduzieren, z.B. auf 4,5 V.
Wie siehts eigentlich damit aus, einen Pegelwandler aus je einem NPN- und einem PNP-Transistor pro Signalleitung aufzubauen?
Oder Optokoppler?
Hm... this is wired.
Ich habe jetzt einfach mal eine Loopback gemacht, indem ich den UART Sender aktiviert habe und den Inhalt vom Empfangsregister direkt ins Ausgangsregister schreibe.
Mit dem USB Logicanalyzer ist schön zu sehen, wie das was reingeht sauber wieder rausgeht. Nur die Segmentanzeige sagt was anderes...(obwohl sie mir bei verschiedenen Dingen schon gute Dienste leistet).
Ich muss irgendwo nen Bock geschossen haben.
The Man
PS.: ich kann leider keine Bilder mehr hochladen, weil ich mein Limit erreicht habe. Wie macht ihr das?
Besserwessi
17.12.2010, 13:19
Bei den Bildern kann man durch das passende Datenformat einiges an Größe sparen (jetzt ist es aber zu spät).
Strichzeichungen wie Schaltpläne als .PNG (notfalls auch GIF). Bei Fotos (JPG) halt auf die Größe und Komprimierung achten - mehr als etwa 50 KB muss ein Foto meist nicht haben.
hardware.bas
17.12.2010, 22:13
en zitlich keine Probleme macht, könnte man einen ADC-Pin nehmen.
VG Micha
Ich hab den 507 ETTL (3.3V) direkt am Atmega(5V), mit dem Auslesen der Daten gibt es keine Probleme.
Wenn man dem Modul Befehle geben will, wird man aber um einen Pegelwandler nicht herumkommen, vielleicht genügt dafür auch ein Spannungsteiler.
LG!
@damfino:
Mit welchem Vorgehen liest du das Modul denn aus? Auf dem Logikanalyzer kann ich wie gesagt alles sehen, nur erfassen klappt einfach nicht. Was ich aktuell versuche ist, das Pattern $GPGGA zu erkennen und dann die Bytes bis zur Ortsangabe zu zählen, und auf einer Segmentanzeige auszugeben. Aber ich bekomme nichts raus.
Daher die Frage, nach welchem Verfahren dein Code das Modul ausliest.
Ich hab den Code irgendwo im Internet gefunden und angepasst. Es wird einmal auf ein "$" gewartet, erst wenn das empfangen wird, wird der Header und dann die einzelnen Daten ausgelesen. Dabei wird im Getgps immer bis zu einem bestimmten Symbol ein String zusammengebaut, zB sind die meisten Daten zwischen "," zu finden. Teilweise suche ich mir auch nur die Vor- oder Nachkommastellen raus weil ich den Rest nicht brauche.
Hier ein Auszug aus meinem Programm:
( GPS() muss regelmäßig, bzw wenn etwas im USART Buffer ist, aufgerufen werden)
/*************************
#define maxline 40
char line[maxline]; // global
GPS++++++++++++++++++++++++++++++++++++++*/
static inline void GPS()
{
char x_gps;
x_gps=0;
x_gps=USART_Receive();
if (x_gps=='$')
{
Getgps(','); //Hole den Header
if(strcmp(line,"GPGGA")==0) Gps_gga();
if(strcmp(line,"GPZDA")==0) Gps_zda();
}
}
/***************Position/Wert vom GPS***********************/
unsigned char Getgps(unsigned char end)
{
unsigned char c,i;
char komma, stern;
komma = ',';
stern = '*';
line[0]=0;
i=0;
c=0;
do
{
c=USART_Receive();
if(c==stern) return 0; //Checksumme erreicht
if(c==komma) return i; //Ende eines Wertes erreicht
if(c!=end) //Buchstaben sammeln
{
line[i]=(char)c;
i++;if (i>=maxline-1) {line[0]=0;}
line[i]=0; //End of String updaten
}
}while(c!=end);
return i;
}
void Gps_gga() //$GPGGA Meldung -----------------------------------------
{
char num, hdop,empfang;
char komma,stn, min;
short x,y;
char buffer[10];
short temp;
komma = ',';
x=0;y=0;
satcount=0; //Anzahl benutzter Satelliten
num=0;
// Uhrzeit
Getgps('.'); strcpy(zeit,line); zeit[4]=0;// Sekunden raus
Getgps(komma); //Rest
//Breitengrad
Getgps('.'); // Grad und Minuten werden nicht gebraucht
num=Getgps(komma); //Nachkommastellen
if(num!=0) {line[4]=0;y=atoi(line);} // nur die ersten 4 Stellen
Getgps(komma); // N/S ignorieren
//Längengrad
Getgps('.'); // Grad und Minuten werden nicht gebraucht
num=Getgps(komma); //Nachkommastellen
if(num!=0) {line[4]=0;x=atoi(line);}
Getgps(komma); // O/W ignorieren
// //0=kein Empfang, 1=GPS, 2=DGPS
num=Getgps(komma);
//Anzahl benutzter Satelliten
num=Getgps(komma);
if(num!=0) { satcount=(unsigned char)atoi(line);}
//HDOP Horizontal Dilution of Position
// Getgps(',');
hdop=9;
Getgps('.');
hdop=(char)atoi(line);
}
LG!
PS.: ich kann leider keine Bilder mehr hochladen, weil ich mein Limit erreicht habe. Wie macht ihr das?
Ich mit http://www.driveonweb.de/
Wenn Du Win verwendest kannst Du das sogar enbinsen und wie ein Hartware Laufwerk verwalten inklusive Freigaben u.s.w.
Mit Linux muss man etwas mehr Handarbeit machen.
Gruß Richard
Hallo,
danke für die Hilfe. Was einige geschrieben hatten stimmt. Der Weg 3,3V auf 5V geht ohne Probleme. Die andere Richtung habe ich nicht versucht. Langt für meine Zwecke aber auch.
Und danke für den Tip mit driveonweb.de
Greeeeez
oratus sum
29.12.2010, 16:20
Bei meinem BTM (Bluetooth) Modul ist es das selbe Szenario.
Aushilfe schafft ein 3V zu 5V TTL Wandler mti 4 BC547 Transistoren:
http://www.techgeek.at/?page_id=119
Funktioniert bei mir wundschön. Auch mit einem Fastrax IT300 GPS Modul.
oratus sum,
welche controller hast du denn? Ich benutzte wie gesagt die atmel megas.
Bei mir hat das ganze jetzt ohne pegelwandler gekleppt, weil der controller ab 0,6*Vcc einen highpegel erkennt.
oratus sum
30.12.2010, 10:52
Ich benutze ebenfalls die AVR Mega. Hier speziell den Mega2560.
Bei mir hat das nicht geklappt. Beim Bluetooth möchte ich außerdem auch senden, on daher ist es auch bessere für das Modul da es nicht 5v tolerant ist.
@Richard,
wie kriege ich das bei driveonwb.de hin, dass ich z.B. .txt Files und Codes bereitsstellen kann, ohne dass nach einem Passwort gefragt wird?
danke,
The Man
... nach einem kurzen Mittagsnickerchen sieht die Welt oft einfacher aus => habs gefunden
darxon69
20.01.2011, 10:02
Der Weg 3,3V auf 5V geht ohne Probleme. Die andere Richtung habe ich nicht versucht.
Also wenn ich einen einfachen bidirektionalen Levelshifter zwischen 3,3V und 5V brauche, dann mache ich das so wie in http://www.kip.uni-heidelberg.de/lhcb/Publications/external/AN97055.pdf auf Seite 10 beschrieben. Klein, gut und billig.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.