Hallo Zusammen, ich hab eben versucht meinen AVR (mega8) davon zu überzeugen das er dem PC doch was über die seriele Schnittstelle erzählen soll. Hab das ASM Programm aus dem Tutorial genommen. Leider mach mein PC aber keinerlei Anstalten Test! anzuzeigen. Hat einer vielleicht eine Idee woran das liegen könnte. Hab leider kein Oszi hier um was auszumessen. aber mit Multimeter und Logigstift bin ich mal soweit gekommen: Am uC werden Daten gesendet die auch über den Wandler gehen (hab am Ausgang ca 10V Wechselspannung) die Recive-Leitung vom PC ist allerings immer -10V. Wenn ich das mit der seriellen Schnittstelle richtig kapiert habe müsste die eigentlich kurz was senden wenn sie ein byte empfangen hat. Tut sie aber nicht. Zumindest sagt mir mein Logigstift das. Am Pc hab ich das HyperTerminal wie beschrieben eingestellt. OS ist WIN2K. Bin für jede Hilfe dankbar, der Jochen P.S. hab auch schon andere Baudrate getestet. leider ohne Erfolg.
Hallo nochmal, hab eben mal den MAX232 durchgemessen: Ausgang: liegen 5V an kommt hinten -12V raus, bei GND kommt hinten 12V Eingang: -12V kommt +5V raus bei +12V kommt kommt GND Ich denke das sieht soweit ganz gut aus Jochen
Hi! Also, von allein wird die Schnittstelle nicht antworten, wenn etwas reinkommt... Dieses "echo" müßte man schon in der Software am PC einstellen! Der MAX scheint tatsächlich in Ordnung zu sein. Bei meinem Programm war es so, daß ich nach jedem vom AVR gesendeten Zeichen eine kurze Pause machen mußte, weil die Abfrage des "schon-fertig" - Bits nicht geklappt hat... Bist Du Dir sicher, daß die Taktfrequenz stimmt? Interner Oszi ist aus?
Wie kann ich überprüfen ob der interne Oszi aus ist? Hab jetzt mal das C-Programm von gcctest4 genommen. Hab das noch auf meinen mega8 angepasst UCR -> UCSRB und UBR -> UBRRL. Hab mit mal ein anderes Terminalprog namens Tera Term Pro heruntergeladen. Da kommen auch irgendwie Zeichen an, hat aber mit dem was ankommen sollte nichts zu tun. Sind aber soweit ich das beurteilen kann immer 32 Zeichen so wie Sie von meinem Prg gesendet werden. Danke schon mal für Eure Hilfe, der Jochen
Hi! Soweit ich weiß, wird der interne Oszillator über Fusebits eingestellt - also mit einem parallelen Programmer. Du kannst ja mal testen, ob es besser funktioniert, wenn Du davon ausgehst, daß der MC mit nur 1 MHz läuft und dementsprechend den Wert zur Baudratenberechnung anpasst... Wieviele Zeichen sollten sollten denn gesendet werden? 5? Wäre ja komisch, wen es plötzlich mehr werden... Tja, viel mehr fällt mir nicht ein... Johannes
Hallo noch mal, hab den Takt mal auf 1MHz eingestellt. Nun bekomme ich im HyperTerminal auch permanent Daten gesendet. Jedoch haben die Daten nichts mit dem zu tun was der AVR sendet(bzw. senden soll). Das müsste ja mal fürs erste heißen das das UART mit dem internen Oszi arbeitet, oder? Wenn ja wie kann ich das abstellen? Komisch ist auch noch das, wenn ich dem uC den Saft klaue und in dan wieder anklemme, immer mal ein paar Zeichen richtig ankommen s.U. òiaì Data f⥲©¡¬ ¡´¡¡´¡ ¦²¯ ¶ ²¥£¥©¶¥¤££¬ ¤¡´¡ æ²ï ¡ receiv ^^^^^^ ^^^^^^ Woran kann das liegen. Es werden immer die gleichen 32 Zeichen gesendet, nur nicht die, die kommen sollten. Bin für jeden Hinweis Dankbar, der Jochen Hier mal noch mein C-Code den ich verwende. #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #define F_CPU 1000000 /* 4Mhz */ #define UART_BAUD_RATE 9600 /* 9600 baud */ #define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1) typedef unsigned char u08; typedef char s08; typedef unsigned short u16; typedef short s16; /* uart globals */ static volatile u08 *uart_data_ptr; static volatile u08 uart_counter; SIGNAL(SIG_UART_TRANS) /* signal handler for uart txd ready interrupt */ { uart_data_ptr++; if (--uart_counter) outp(*uart_data_ptr, UDR); /* write byte to data buffer */ } SIGNAL(SIG_UART_RECV) /* signal handler for receive complete interrupt */ { register char led; led = inp(UDR); /* read byte for UART data buffer */ outp(~led, PORTB); /* output received byte to PortB (LEDs) */ } void uart_send(u08 *buf, u08 size) /* send buffer <buf> to uart */ { if (!uart_counter) { /* write first byte to data buffer */ uart_data_ptr = buf; uart_counter = size; outp(*buf, UDR); } } void uart_init(void) /* initialize uart */ { /* enable RxD/TxD and ints */ outp((1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN),UCSRB); /* set baud rate */ outp((u08)UART_BAUD_SELECT, UBRRL); outp(0, UBRRH); } int main(void) { outp(0xff ,DDRB); /* PortB output */ outp(0x00, PORTB); /* switch LEDs on */ uart_init(); sei(); /* enable interrupts */ for (;;) { /* loop forever */ uart_send("Serial Data from AVR received###", 32); } }
>#define F_CPU 1000000 /* 4Mhz */ >#define UART_BAUD_RATE 9600 /* 9600 baud */ >#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1) OK, für 1Mhz sind es 1000000. Aber steht dort UART_BAUD_RATE*hunderteinundsechzig ? müsste 16 sein...
Da hab ich mich auch gewunder, das heist aber nicht 161 sondern 16L wollt ich mich mal noch drum kümmern wofür das L steht. Das Problem selbst hat sich gelöst nach dem ich meinem uC klar gemacht habe das er nur den externen 4MHz Takt nehmen soll. Seit dem sendet er brav was er soll. Danke an alle Die mir weiter geholfen haben, der Jochen
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.