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