Forum: Mikrocontroller und Digitale Elektronik ATmega8 und RS232


von Denny (Gast)


Lesenswert?

Hallo
Ich möchte Daten von meinem ATmega8 an den PC übertragen.
Das wollte ich über die serielle Schnittstelle machen.
Ich habe die Anschlüsse TxD, RxD und GND vom ATmega8 an den "USB to 
Seriell Converter" angeschlossen. (Obere Reihe, Pin 2,3 und 5)

Mein Bascom Programm sieht so aus:
   $regfile = "m8def.dat"
   $crystal = 3686400
   $baud = 9600

   Do
   Print "Hallo Welt!"
   Loop
Allerdings bekomme ich nicht die Zahlen raus, die raus kommen sollten!
Woran kann das liegen??

Danke
Denny

von MeinerEiner (Gast)


Lesenswert?

Weil der USB-Seriell-Konverter auf RS232-Pegel wandelt, der AVR aber 
TTL-Pegel hat/braucht. Da dazwischen gehört noch ein MAX232.
Oder alternativ: FT232, der kann direkt TTL nach USB.

von Denny (Gast)


Lesenswert?

Haben nicht beide Anschlüsse 5V??

von MeinerEiner (Gast)


Lesenswert?

am AVR schon.
Auf PC-Seite bzw. USB-Wandler-Seite nicht.
Als logische 1 ist irgendwas im Bereich von -15...-3V erlaubt, eine 
logische 0 ist irgendwas zwischen +3...+15V.

von Denny (Gast)


Lesenswert?

Gibt es auch noch eine andere Möglichkeit??

von MeinerEiner (Gast)


Lesenswert?

Naja, mit OPVs die Spannungsbereiche umbauen. Ist aber etwas 
komplizierter, als nen MAX232 zu verbauen.

von Denny (Gast)


Lesenswert?

Kann man nicht direkt mit der USB-Schnittstelle kommunizieren??

von MeinerEiner (Gast)


Lesenswert?

Man kann den AVR schon direkt an die USB-Datenleitungen hängen (bzw. 
entsprechende USB-AVRs verwenden).
Aber da brauchts dann schon etwas mehr Software als nur "Print".
Glaub nicht, dass Bascom für Nicht-USB-AVRs da was fertiges hat.

von screwdriver (Gast)


Lesenswert?

Zur Not schmeckt die Wurst auch ohne Brot..

Im Notfall kann mann auch mal den AVR direkt, also ohne Pegelwandler und 
invertierende Stufe anschliessen.
Dabei benutzt du dann aber die Bascom-Soft-Uart.

Open "COMD.1:9600,8,N,1,INVERTED" For Output As #1
Open "COMD.0:9600,8,N,1,INVERTED" For Input As #12

Sieh mal in der Bascom Hilfe nach.

von MeinerEiner (Gast)


Lesenswert?

Haut aber nur solange hin, wie der PC mit seinem "Irgendwas zwischen 
15-3V"-Spannung in nem Bereich bleibt, den der AVR auch verträgt. Wenn 
der PC da wirklich mit 12V rausgeht, lebt der AVR nicht lang.

von screwdriver (Gast)


Lesenswert?

Ne, ne, das geht schon.

RS232 begrenzt den Ausgangsstrom auf etwa 20mA und ist dadurch sogar 
kurzschlussfest.

Ich benutze so was schon mal zum Debuggen.

von Denny (Gast)


Lesenswert?

screwdriver schrieb:
> Zur Not schmeckt die Wurst auch ohne Brot..
>
> Im Notfall kann mann auch mal den AVR direkt, also ohne Pegelwandler und
> invertierende Stufe anschliessen.
> Dabei benutzt du dann aber die Bascom-Soft-Uart.
>
> Open "COMD.1:9600,8,N,1,INVERTED" For Output As #1
> Open "COMD.0:9600,8,N,1,INVERTED" For Input As #12
>
> Sieh mal in der Bascom Hilfe nach.

Hallo
Entschuldigung, dass ich mich so lange nicht gemeldet habe.
Heißt das, dass ich die Anschlüsse RxD, TxD und GND direkt an die 
serielle Schnittstelle anschließen kann??
Dabei würde ich dann den oben genannten Code verwenden.

Vielen Dank schon Mal für die Hilfe!

von screwdriver (Gast)


Angehängte Dateien:

Lesenswert?

>Heißt das, dass ich die Anschlüsse RxD, TxD und GND direkt an die
>serielle Schnittstelle anschließen kann??

Ja, kannst Du bei AVR direkt anschließen, weil die Pins interne 
Schutzdioden haben. Diese leiten die positive und negative Pegel der 
RS232 gegen Vcc bzw. Gnd ab. Eine konforme RS232-Schnittstelle begrenzt 
den dabei fließenden Strom auf ca. 20mA. Sicherheitshalber habe ich aber 
noch in den Signalleitungen jeweils einen Schutzwiderstand von 220R.

Das Programmbeispiel kannst du direkt im Bascom-Terminal testen. Da die 
SoftUart von Bascom keine Echo-Funktion besitzt, mußt du deine Eingabe 
blind machen und mit der RETURN-Taste abschließen.


$crystal = 16e6

Open "COMD.6:9600,8,N,1,INVERTED" For Input As #1
Open "COMD.5:9600,8,N,1,INVERTED" For Output As #2

Dim Text$ As String * 16

Print #2 , "Test"
Do
   Print #2 , "Name: " ;
   Input #1 , Text$
   Print #2 , "Hallo, " ; Text$
Loop
End

von Denny (Gast)


Lesenswert?

Vielen Dank!
Das funktioniert wunderbar!
Ich habe es ohne die Widerstände versucht und es geht auch.

von ich (Gast)


Lesenswert?

Ihr seit vielleicht Pfuscher...

von Denny (Gast)


Lesenswert?

ich schrieb:
> Ihr seit vielleicht Pfuscher...

??

von Chris (Gast)


Lesenswert?

>??

Weil Du den ATMega nun außerhalb der Absolute Maximum Ratings betreibst.

von Denny (Gast)


Lesenswert?

Ich habe noch eine Frage:
Ich kann nun Daten zum PC senden.
Aber wenn ich Daten mit dem Terminalprogramm zum Mikrocontroller senden 
will, geht das nicht

Bascom bleibt einfach bei dem Input hängen.
Am Oszilloskop sehe ich die Übertragung.

Da stimmt irgendwas mit den Pegeln nicht.
Was kann ich tun??

von Karl H. (kbuchegg)


Lesenswert?

Denny schrieb:

> Da stimmt irgendwas mit den Pegeln nicht.
> Was kann ich tun??

Nimm einen richtigen MAX232

von Chris (Gast)


Lesenswert?

> Was kann ich tun??


Nimm einen Pegelwandler!

http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf

Dort steht auf Seite 242:
Voltage on any Pin except RESET with respect to Ground: -0.5V to 
VCC+0.5V

Und weiter:
Stresses beyond those listed under "Absolute Maximum Ratings" may cause 
permanent damage to the device. This is a stress rating only and 
functional operation of the device at these or other conditions beyond 
those indicated in the operational sections of this specification is not 
implied. Exposure to absolute maximum rating conditions for extended 
periods may affect device reliability.

Kurz gesagt, es ist totaler Murks! Kaufe dir einfach einen MAX232, 
besser noch einen MAX232A oder MAX202 (die beiden letzteren kommen auch 
mit 100nF Kondensatoren für die Ladungspumpen aus).

von Denny (Gast)


Lesenswert?

Das Problem ist, dass ich keinen hier habe.
Und wenn ich einen Bestelle dauert das mindestens eine Woche, bis ich 
den habe.

von ich (Gast)


Lesenswert?

jetzt bei RS bestellen, ist er morgen um diese zeit da.

von MWS (Gast)


Lesenswert?

Schau Dir die Hilfe zu Open an, ganz unten findest Du ein Beispiel:

Open "comd.0:300,8,n,1,inverted" For Input As #2

Das "inverted" macht die Verwendung eines Levelshifters überflüssig, ist 
natürlich keine perfekte Lösung, das wäre eben ein MAX232.

von screwdriver (Gast)


Lesenswert?

@denny:
Zeig mal bitte deinen Programmcode und wie ist der mega8 angeschlossen?

screwdriver

von Denny (Gast)


Lesenswert?

ich habe jetzt einen MAX232.
Es funktioniert soweit.
Danke!

von Chris (Gast)


Lesenswert?

Das ging jetzt aber schnell :-)

von screwdriver (Gast)


Lesenswert?

Chris schrieb:
> Weil Du den ATMega nun außerhalb der Absolute Maximum Ratings betreibst.

Sehe ich nicht so. Die internen Schutzdioden sorgen doch gerade dafür, 
dass die von dir zitierten maximalen Spannungen eingehalten werden, 
indem die Überspannungen zu Vcc und Gnd abgeleitet werden. Natürlich hat 
diese Schutzfunktion irgendwo ihre Grenze. Und da der maximal zulässige 
Eingangsstrom per I/O-Pin im mega8-Datenblatt auf +/-40mA datiert ist, 
ist dies wohl auch in erster Näherung der maximal zulässige Strom über 
die jeweilige Schutzdiode.

Fazit: Da mir kein RS232-Schnittstellentreiber bekannt ist, der mehr als 
40mA treiben kann wird der mega8 innerhalb der spezifikationen 
betrieben.

screwdriver

von spess53 (Gast)


Lesenswert?

Hi

>Und da der maximal zulässige
>Eingangsstrom per I/O-Pin im mega8-Datenblatt auf +/-40mA datiert ist,
>ist dies wohl auch in erster Näherung der maximal zulässige Strom über
>die jeweilige Schutzdiode.

Was haben die Schutzdioden mit den Strömen des Ports zu tun? Das sind 
komplett zwei paar Schuhe.

MfG Spess

von screwdriver (Gast)


Lesenswert?

spess53 schrieb:
> Was haben die Schutzdioden mit den Strömen des Ports zu tun? Das sind
> komplett zwei paar Schuhe.

Nun ja, wenn ein I/O-Pin auf Eingang geschaltet wird, also hochohmig 
ist, welchen Weg sollen dann die 40mA nehmen?

von Chris (Gast)


Lesenswert?

screwdriver schrieb:
> Sehe ich nicht so.

Das Datenblatt aber schon.

von spess53 (Gast)


Lesenswert?

Hi

>Nun ja, wenn ein I/O-Pin auf Eingang geschaltet wird, also hochohmig
>ist, welchen Weg sollen dann die 40mA nehmen?

Im zulässigen Eingangsspannungsbereich können bei einem Eingang keine 
40mA fliessen. Da liegt der Eingangsstrom im µA-Bereich.

MfG Spess

von screwdriver (Gast)


Lesenswert?

spess53 schrieb:
> Im zulässigen Eingangsspannungsbereich können bei einem Eingang keine
> 40mA fliessen. Da liegt der Eingangsstrom im µA-Bereich.

Richtig, deshalb nahm ich ja (fälschlicherweise) an, daß der übrige 
Strom per interner Schutzdioden abgeleitet wird.

Ich nahm jedoch an, daß sich folgende Formulierung in den "Absolute 
Ratings" des mega8

DC Current per I/O Pin .........................................40.0 mA

auf den jeweiligen Pin und nicht auf die jeweiligen Ausgangstransistoren 
bezieht.

Mittlerweile habe ich in der Application Note "AVR182: Zero Cross 
Detector" auf Seite 4 oben folgenden Satz zur Kenntnis nehmen müssen:

"It is not recommended that the clamping diodes are conducting more than 
maximum 1 mA and ..."

Fazit: Der AVR kann bei direktem Anschluß an eine RS232 außerhalb der 
Spezifikationen betrieben werden und dadurch Schaden erleiden.

Mit einem Serienwiderstand in den Signalleitungen kann dies jedoch 
wieder gerade gebogen werden.

Rmin= (15V-Vcc)/1mA= 1000R für Vcc= 5V in der Eingangsleitung
Rmin= 5V/40mA= 125R in der Ausgangsleitung

Bin ich jetzt wieder innerhalb der Spezifikation des AVR?

screwdriver

von screwdriver (Gast)


Lesenswert?

screwdriver schrieb:
> Rmin= (15V-Vcc)/1mA= 1000R für Vcc= 5V in der Eingangsleitung

Sollte heißen:
Rmin= (15V-Vcc)/1mA= 10K für Vcc= 5V in der Eingangsleitung

von spess53 (Gast)


Lesenswert?

Hi

>Das Datenblatt aber schon.

Vielleicht habe ich das was überlesen. Aber in der AppNote AVR040 steht, 
das Eingangsspannungen außerhalb des zulässigen Berichs (-0.5V to 
VCC+0.5V) die Schutzdioden ohne Strombegrenzung zerstören können.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

>Bin ich jetzt wieder innerhalb der Spezifikation des AVR?

Nein. Die 40mA sind kein Betriebswert. Das ist der Strom der 
kurzzeitig nicht zur Beschädigung führt. Also kein Rechenwert.

Zitat: 'Exposure to absolute maximum rating conditions for extended 
periods
        may affect device reliability.

Aus dem Text neben dem 'Absolute Maximum Ratings'-Kästchen.

Außserdem müssen noch die maximalen Ströme pro Port und pro 
Betriebsspannungs-/Masse-Pin beachtet werden.

MfG Spess

von screwdriver (Gast)


Lesenswert?

spess53 schrieb:
> Nein. Die 40mA sind kein Betriebswert. Das ist der Strom der
> kurzzeitig nicht zur Beschädigung führt. Also kein Rechenwert.

Also schön, laut DC (!) Characteristics:

VOH >= 4.2V für IOH = -20 mA und VCC = 5V

Rmin= 4.2/20mA= 210R

Bin ich jetzt für die Ausgangsleitung konform?

von screwdriver (Gast)


Lesenswert?

@spess:
Oder andersherum gefragt:

Angenommen, du hättest die Aufgabe ein Signal mit einer Frequenz von 
9600Hz mit einem Spannungsbereich von -15V/15V Vpp, Innenwiderstand der 
Signalquelle sei unbekannt, an einen Eingang eines AVR zu adaptieren.

Wie würde deine Adaptionschaltung aussehen?
(Und sag jetzt bitte nicht, du würdest einen MAX232 nehmen!)

screwdriver

von yassine (Gast)


Angehängte Dateien:

Lesenswert?

hey Leute,

ich bin hier als Anfänger und habe ich die Platine des AVR-Lehrbuch von 
Roland Walter aufgebaut und jetzt wollte ich die seriellschnittstelle 
kontrollieren ob man daten zwischen PC und Mikrocontroller umtauschen 
kann oder nicht und zwar eine kleine HALLO auf Hterm sehen will aber 
klappt nict und auch auf Avrterm klappt nicht ich weisse nicht waron 
liegt das.

#include <avr/io.h>
#include <avr/iom8.h>
#include <stdint.h>

#define F_CPU 3686400
#define UART_BAUD_RATE 9600

int main()
{
       do
  {
    printf("Hallo");
        }
  while(1);
return 0;
}
ich brauche wirklich ihre hilfe.

ich bedanke mich im voraus.

von spess53 (Gast)


Lesenswert?

Hi

>Angenommen, du hättest die Aufgabe ein Signal mit einer Frequenz von
>9600Hz mit einem Spannungsbereich von -15V/15V Vpp, Innenwiderstand der
>Signalquelle sei unbekannt, an einen Eingang eines AVR zu adaptieren.

Meinst du 9600 Baud oder wirklich 9600 Hz. Bei ersteren wären es nämlich 
maximal 4800 Hz ($55/$AA).

Wenn du deine Widerstandsvariante meinst, wird der Wert nach unten durch 
den zulässigen Strom durch die Schutzdioden begrenzt. Die zur Berechnug 
anzusetzende Spannung ist 14,5V (negative Spannung- 0,5V 
Durchflussspannung). Ergibt bei 1mA Rmin=14,5K. Nach oben wird der 
Widerstand durch die Eingangskapazität (ca. 10pF) begrenzt. Der bildet 
mit dem Widerstand ein RC-Glied. Und das führt durch die 
Schmitt-Trigger-Charkteristik des Eingangs je nach L oder H zu 
unterschiedlich langen Bitzeiten. Im Bereich von ca. 50k ist das noch 
ziemlich unkritisch. was dann auch mein Wahl wäre 47k oder 51k.

>(Und sag jetzt bitte nicht, du würdest einen MAX232 nehmen!)

Doch. Meist will ich nicht nur Empfangen, sondern auch Senden. Und da 
bevorzuge ich solide Lösungen.

@yassine

Kenne mich in C nicht so richtig aus. Sollte aber nicht auch dort die 
UART initialisiert werden. Sieh mal im Tutorial nach.

MfG Spess

von screwdriver (Gast)


Lesenswert?

spess53 schrieb:
> Meinst du 9600 Baud oder wirklich 9600 Hz. Bei ersteren wären es nämlich
> maximal 4800 Hz ($55/$AA).

Stimmt. Hab das so noch nicht betrachtet.

Danke auch für dein Rechenbeispiel. Ich habe mich bei meiner Berechnung 
auf die Schutzdiode gegen Vcc bezogen. Der größere Strom fließt jedoch 
gegen Masse. Bezgl. RC-Glied: Interessant, ich hab sowas bis jetzt immer 
rein ohmisch betrachtet.

spess53 schrieb:
> Doch. Meist will ich nicht nur Empfangen, sondern auch Senden. Und da
> bevorzuge ich solide Lösungen.

Voll d'accord.
Sehe ich auch so. Als Hobbybastler hängt an der Uart meiner AVR i.d.R. 
ein MAX485, weil ich einen kleinen Hausbus betreibe. Die von mir 
beschriebene Variante ist, wie ich in meinem ersten Post auch schrieb, 
nur eine temporäre Notlösung zum Debuggen - auch wenns Pfusch ist. Aber 
ich werde mich bessern.

Frohes Fest!

Und besonderen Dank an alle, die durch ihr unermüdliches Mitwirken in 
diesem Forum, sei es durch Codebeispiele oder Postings, uns Anfängern 
und Hobbybastlern zur Seite stehen. Macht bitte weiter so.

screwdriver

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.