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
Achja, dam Kabel (Verwechslung von Nullmodemkabel <-> Modemkabel) liegt es auch nicht...
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
Nach Programmänderung sendet der uC das hier :-( ÀÀîîîÀÀÀîîîÀÀÎîîÀïÀÀîÄÄÄÄ„îîîÄÄÄÄ„îîîÎÄÄÄ„îîîîÄÄÄ̶ 2;îîîîÄÄÄ„îîîîÄÀÀÀîîîÀÀÀîîîÀÀÀîî îÀÀÀîîÀîÀÀîîîÀïÀÀîîîÀïÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîÀîÀÀîîîÀïÀÀîîîÀï ÀÀîîîÀÀÀ îîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÆîîÀïÀÀîîîÀïÀÀîîîÀïÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀ ÀÎîîÀïîÀ ÀîîîÀÀÆîîÀïÀÀîîîÀïÀÀîîîÀïÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÎîîÀïÀÀîîîÀïÀÀîî îÀÀÀîîîÀ ÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîÀîÀÀîîîÀïÀÀîîîÀïÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÂîî ÀîÀÀîîîÀ ïÀÀîîîÀïÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÎîîÀïÀÀîîîÀïÀÀîîîÀÀÀîîîÀÀÀîîîÀÀÀî îîÀÀÀîîî ÀÀÀîîÀîÀÀ 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)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.