Forum: Mikrocontroller und Digitale Elektronik UART (MAX232)


von Oliver _Hanka (Gast)


Lesenswert?

Hallo...

Ich hab mal wieder eine Frage, und zwar geht es um die Beschaltung des 
MAX232. Ich habe hier eine Schaltung, die nicht funktioniert. (AVR 
AT90S8535 via MAX232 -> PC)

Ich habe mit meinem Oszi mir einmal das Ausgangssignal angeschaut, und 
das sieht gut aus, doch Hyperterminal zeigt nicht an, dass etwas 
empfangen wurde.

Also, dass Programm habe ich von deiner Website. Die Schaltung stimmt 
auch über ein bis auf die Kondensatoren.
Ich benutze zwischen Pin 1 u. 3 und zwischen Pin 4 u. 5. 47uF 
Kondensatoren und zwischen Pin Pin 2 u. Vcc und Pin 6 u. GND 10uF.
(Die Werte hab ich aus dem Buch: Das 
Mikrocontroller-Applikations-Kochbuch von Andreas Roth)

Auf deiner HP sehe ich nun, dass du für alle 4 Kondensatoren 22uF 
benutzt.

Im Datenblatt vom Maxim haben die Kondensatoren aus dem Beispiel 0,1uF.

Welche Größe ist nun richtig, oder ist das völlig egal ?

Gibt es irgendwelche bestimmten Einstellungen unter Windows die ich 
beachten sollte ? (WinME) Hyperterminal habe ich nach Screenshot 
eingestellt.

Bin für jeden Tipp dankbar...

Oliver

von Oliver Hanka (Gast)


Lesenswert?

Achja, dam Kabel (Verwechslung von Nullmodemkabel <-> Modemkabel) liegt 
es auch nicht...

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Hallo,

> Ich hab mal wieder eine Frage, und zwar geht es um die
> Beschaltung des MAX232. Ich habe hier eine Schaltung, die
> nicht funktioniert. (AVR AT90S8535 via MAX232 -> PC)

du hast die richtige Include-Datei (8535def.inc) ausgewählt, oder?

> (Die Werte hab ich aus dem Buch: Das
> Mikrocontroller-Applikations-Kochbuch von Andreas Roth)

Meine sind aus einer (etwas älteren) Elektor)...

> Welche Größe ist nun richtig, oder ist das völlig egal ?

Beim Original-MAX232 sollten es AFAIK mindestens 10uF sein, beim MAX202 
0.1µF. Inzwischen reichen beim MAX232A laut Datenblatt auch 0.1pF... ich 
blick da selber nicht mehr so ganz durch ;-)
Das ganze ist auf jeden Fall nicht so kritisch und sollte mit allem 
zwischen 1 und 22uF funktionieren. Schau dir mal das Datenblatt (pdf) 
an.

> Gibt es irgendwelche bestimmten Einstellungen unter Windows
> die ich beachten sollte ? (WinME) Hyperterminal habe ich nach
> Screenshot eingestellt.

Das ist eigentlich alles was man einstellen muss.

> Bin für jeden Tipp dankbar...

Richtiger Com-Port ausgewählt?
Richtiges Kabel (muss einen male- und einen female-Anschluss haben)?
Masse angeschlossen?
RXD und TXD vertauscht? Die RXD-Leitung der PC-Schnittstelle ist auf Pin 
2, dort müssen die Daten also ankommen. Mess mal ob sich dort was tut.

Schreib nochmal, ob du es zum Laufen bekommen hast.

MfG
Andreas

von Olaf Cichewicz (Gast)


Lesenswert?

> beim MAX202 0.1µF. Inzwischen reichen beim MAX232A laut
> Datenblatt auch 0.1pF...

100 aF...? Hehe, im Leben nich!
Da würd ich aber nochmal nachlesen. :)

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

> > beim MAX202 0.1µF. Inzwischen reichen beim MAX232A laut
> > Datenblatt auch 0.1pF...
>
> 100 aF...? Hehe, im Leben nich!
> Da würd ich aber nochmal nachlesen. :)

Sorry, nur ein blöder Vertipper... muss natürlich 0.1µF heißen.

MfG
Andreas

von Oliver Hanka (Gast)


Lesenswert?

Andreas Schwarz schrieb:
> Richtiger Com-Port ausgewählt?
> Richtiges Kabel (muss einen male- und einen female-Anschluss
> haben)?
> Masse angeschlossen?
> RXD und TXD vertauscht? Die RXD-Leitung der PC-Schnittstelle
> ist auf Pin 2, dort müssen die Daten also ankommen. Mess mal
> ob sich dort was tut.
>
> Schreib nochmal, ob du es zum Laufen bekommen hast.


Also, ich habe nochmal meine Leitungen, Kabel, etc. überprüft und ein 
bis 2 verdreher gefunden. Zusätzlich habe ich meine Kondensatoren mit 
22uF K. getauscht.

Resultat: es funktioniert.

ABER:
Wenn ich deine Rotine übernehme und außer der Baudraten generierung (für 
8MHz) nichts ändere sendet er immer nur den ersten Buchstaben. vom 
restlichen "est!" kommt beim PC nichts an.

Wenn ich jetzt mal versuche nur einen Buchstaben zu senden, dann kommt 
dieser allderings nicht an...

Olli

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Hallo,

> ABER:
> Wenn ich deine Rotine übernehme und außer der Baudraten
> generierung (für 8MHz) nichts ändere sendet er immer nur den
> ersten Buchstaben. vom restlichen "est!" kommt beim PC nichts
> an.

Standardfehler ;-)
Bei dem 8535 ist der Stackpointer 16 Bit = 2 Register breit, da der 
Controller mehr als 256 Byte RAM besitzt und die Adresse also nicht mehr 
in einem Register untergebracht werden kann. Es gibt dazu noch ein 
Register mit dem Namen SPH, in dem das High-Byte untergebracht wird. 
Damit es funktioniert, muss das Programm folgendermaßen geändert werden:

;Stackpointer initialisieren
ldi temp, LOW(RAMEND) ;LOW-Byte der obersten RAM-Adresse
out SPL, temp
ldi temp, HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse
out SPH, temp

Ansonsten findet der Controller nach dem Unterprogrammaufruf nicht mehr 
den "Weg zurück".

MfG
Andreas

von Oliver Hanka (Gast)


Lesenswert?

Nach Programmänderung sendet der uC das hier :-(


ÀÀîîîÀÀÀîîîÀÀÎîîÀïÀÀîÄÄÄÄ&#8222;îîîÄÄÄÄ&#8222;îîîÎÄÄÄ&#8222;îîîîÄÄÄ&#822 
2;îîîîÄÄÄ&#8222;îîîîÄÀÀÀîîîÀÀÀîîîÀÀÀîî
îÀÀÀîîÀîÀÀîîîÀïÀÀîîîÀïÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîÀîÀÀîîîÀïÀÀîîîÀï 
ÀÀîîîÀÀÀ
îîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÆîîÀïÀÀîîîÀïÀÀîîîÀïÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀ 
ÀÎîîÀïîÀ
ÀîîîÀÀÆîîÀïÀÀîîîÀïÀÀîîîÀïÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÎîîÀïÀÀîîîÀïÀÀîî 
îÀÀÀîîîÀ
ÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîÀîÀÀîîîÀïÀÀîîîÀïÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÂîî 
ÀîÀÀîîîÀ
ïÀÀîîîÀïÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÎîîÀïÀÀîîîÀïÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀî 
îîÀÀÀîîî
ÀÀÀîîÀîÀÀ



Das Programm:

.include "8535def.inc"

.def temp = r16

;Stackpointer initialisieren
ldi temp, LOW(RAMEND) ;LOW-Byte der obersten RAM-Adresse
out SPL, temp
ldi temp, HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse
out SPH, temp




sbi UCR,TXEN                   ;TX aktivieren
ldi temp,8000000/(9600*16)-1   ;Baudrate 9600 einstellen
out UBRR,temp

loop:
ldi temp, 'T'
rcall serout       ;Unterprogramm aufrufen
ldi temp, 'e'
rcall serout       ;Unterprogramm aufrufen
ldi temp, 's'
rcall serout       ;Unterprogramm aufrufen
ldi temp, 't'
rcall serout       ;Unterprogramm aufrufen
ldi temp, '!'
rcall serout       ;Unterprogramm aufrufen
ldi temp, 10
rcall serout       ;Unterprogramm aufrufen
ldi temp, 13
rcall serout       ;Unterprogramm aufrufen
rjmp loop          ;zu loop springen

;Unterprogramm "serout"
serout:
  sbis USR,UDRE   ;Warten, bis UDR bereit ist
  rjmp serout
  out UDR, temp
ret               ;zurück zum Hauptprogramm


Das T hat er vorhin zumindest ordentlich gesendet...

Olli

(Schonmal Danke für die Tipps)

von ich nochmal... (Gast)


Lesenswert?

Ok, hab da irgendwo mist gebaut...

Es funktioniert jetzt !!!

Also vielen Dank für deine Hilfe !

Wann kommt das tutorial über das empfangen von Bytes ? gg


Olli

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Hallo,

> Es funktioniert jetzt !!!

Schön!

> Wann kommt das tutorial über das empfangen von Bytes ? *gg*

Hmm, da sind glaub ich vorher erst mal ein paar Zeilen über Interrups 
fällig (unschönes Thema)... vielleicht am Wochenende.

MfG
Andreas

von Oliver Hanka (Gast)


Lesenswert?

Also, ich hab mir da selbst was zusammengestrickt, aber es funktioniert 
mal wieder nicht... :-(
(Ich hab das Problem, dass ich das in ca, 1,5 Wochen für eine 
Projektpräsentation benötige...)  :-)

Hier also mein Code:


.include "8535def.inc"

.def temp = r16


.cseg
.org  $000
  rjmp  start        ;reset handle
.cseg
.org  $00B
  rjmp  rx_com        ;interrupt adress für RX complete



init:
            ;Stackpointer initialisieren
  ldi   temp, LOW(RAMEND)     ;LOW-Byte der obersten RAM-Adresse
  out   SPL, temp
  ldi   temp, HIGH(RAMEND)     ;HIGH-Byte der obersten RAM-Adresse
  out   SPH, temp

  sbi   UCR,TXEN      ;TX aktivieren
  ldi   temp,8000000/(9600*16)-1  ;Baudrate 9600 einstellen (bei 8MHz)
  out   UBRR,temp

  ldi   temp, 0xFF      ;0xFF ins Arbeitsregister r16 laden
  out  DDRC, temp      ;Inhalt von r16 ins IO-Register DDRC ausgeben

  sei          ;Interrups einschalten

  ret



rx_com:
  sbi  ucr, rxen      ;set reciver bit...
  in  temp, udr      ;read value
  cbi  ucr, rxen      ;clear register

  out  portc, temp

  ret


start:
  rcall  init

loop:
  rjmp  loop


Eigentlich sieht das ganze ja gut aus würd ich sagen...
- Interruptrotine festgelegt
- Stapel wird initialiesiert
- Baudrate eingestellt
- PortC als Ausgabeport eingerichtet
- Interrupts eingeschaltet

Ich bin also mit Hyperterminal zugange gewesen, aber die LEDS am PortC 
blieben komplett an (wie Zustand nach Reset) (Hyperterminaleinstellung 
stimmen)

Das Hyperterminal nicht den Buchstaben, den ich eingetippt habe in 
seinem Fenster ausgibt ist ja normal glaube ich... oder ?

Wäre nett, wenn du mir da nochmal helfen könntets.

 Gruß Oliver

PS: Problem ist wohl, dass der Interrupt nie ausgelöst wird. :-( 
(Adresse hab ich aus dem Datenblatt)

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Hallo Oliver,

> Also, ich hab mir da selbst was zusammengestrickt, aber
> es funktioniert mal wieder nicht... :-(

sind auch ne ganze Menge Bugs drin ;-)

> (Ich hab das Problem, dass ich das in ca, 1,5 Wochen für eine
> Projektpräsentation benötige...)  :-)

>             ;Stackpointer initialisieren

Bisschen unpraktisch den Stackpointer erst im Unterprogramm zu 
initialisieren ;-)

>   sbi   UCR,TXEN      ;TX aktivieren

Hier musst du RXEN aktivieren, wenn du was empfangen willst!
Damit dann auch ein Interrupt ausgelöst wird, muss außerdem RXCIE auf 1 
gesetzt werden!

> rx_com:
>   sbi  ucr, rxen      ;set reciver bit...
>   in  temp, udr      ;read value
>   cbi  ucr, rxen      ;clear register

Häh, was soll denn das werden ? ;-)
RXEN musst du nur am Anfang setzten, damit aktivierst du den Receiver. 
Zum Auslesen von UDR musst du nichts ändern.

>
>   out  portc, temp
>
>   ret

Muss nach einer Interruptroutine "reti" heißen!

Ich hab mir das Programm nur mal so kurz angeschaut, kann nicht 
garantieren dass jetzt alles stimmt! Wenn nicht, schreib nochmal.

> Das Hyperterminal nicht den Buchstaben, den ich eingetippt
> habe in seinem Fenster ausgibt ist ja normal glaube ich...
> oder ?

Ja, das ist normal!


MfG
Andreas

von Oliver Hanka (Gast)


Lesenswert?

Andreas Schwarz schrieb:

> Bisschen unpraktisch den Stackpointer erst im Unterprogramm
> zu initialisieren ;-)

Da ist was dran... :-)


Ich hab die Änderungen vorgenommen:
- komplette init is in Hauptteil gewandert
- RXEN u. RXCIE werden gesetzt
- Senderotine verändert


.include "8535def.inc"

.def temp = r16


.cseg
.org  $000
  rjmp  start        ;reset handle
.cseg
.org  $00B
  rjmp  rx_com        ;RX-Complete - Rotine


rx_com:
  in  temp,udr      ;read value
  out   PORTC,temp

  reti


start:
  ldi   temp,LOW(RAMEND)     ;LOW-Byte der obersten RAM-Adresse
  out   SPL,temp
  ldi   temp,HIGH(RAMEND)     ;HIGH-Byte der obersten RAM-Adresse
  out   SPH,temp
  sbi   UCR,RXEN      ;RX aktivieren
  sbi  UCR,RXCIE      ;RX-Complete aktivieren
  ldi   temp,8000000/(9600*16)-1  ;Baudrate 9600 einstellen (bei 8MHz)
  out   UBRR,temp

  ldi   temp,0xFF      ;0xFF ins Arbeitsregister r16 laden
  out  DDRC,temp      ;Inhalt von r16 ins IO-Register DDRC ausgeben

  sei          ;Interrups einschalten

loop:

  rjmp  loop


Siehst du in dem Programm noch einen Fehler ? Ich habe mir nochmal das 
Datenblatt duirchgelesen, aber so richtig schlaugeworden bin ich dadurch 
nicht...
Ich üperprüf aufjedenfall jetzt nochmal meine Hardware, nicht dass da 
auch noch ein Fehler ist.

Olli

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Oliver Hanka schrieb:
>
> Andreas Schwarz schrieb:
>
> > Bisschen unpraktisch den Stackpointer erst im Unterprogramm
> > zu initialisieren ;-)
>
> Da ist was dran... :-)

Solche Fehler kann man leicht vermeiden wenn man das AVR-Studio 
verwendet. Würde ich mir unbedingt mal anschaun!

> Ich hab die Änderungen vorgenommen:
> - komplette init is in Hauptteil gewandert
> - RXEN u. RXCIE werden gesetzt
> - Senderotine verändert
>
> Siehst du in dem Programm noch einen Fehler ?

Das Programm ist in Ordnung, läuft (für den AT90S2313 angepasst) ohne 
Probleme.

MfG
Andreas

von Oliver Hanka (Gast)


Lesenswert?

Andreas Schwarz schrieb:
dran... :-)
>
> Solche Fehler kann man leicht vermeiden wenn man das
> AVR-Studio verwendet. Würde ich mir unbedingt mal anschaun!

Ich werd es mir mal anschauen...

> Das Programm ist in Ordnung, läuft (für den AT90S2313
> angepasst) ohne Probleme.
>
> MfG
> Andreas


Es lag bei mir an der Hardware (angelötetes Kabel hat sich glöst)
Es funktioniert jetzt.

Also nochmal vielen Dank für deine Hilfe.

 Oliver

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.