Hallo i sende mit dem Programm siehe Anhang HTerm.exe eine 1 als Ascii über die RS232 Schnittstelle Leider weiß ich nicht genau wie ich das UDR abfragen kann??? mit If()...usw Wenn ich die Daten empfangen habe möchte ich auch das PA0 auf high ist. mfg Mathias Koch
x = UDR; if (x=='1') PORTA |= (1<<PA0); Man könnte auch if (UDR == '1') ... schreiben. Das verhindert aber ein weiteres Verwenden der Daten. Man könnte mit der ersten Version noch if (x=='2') PORTA |= (1<<PA1); machen, was mit der zweiten nicht mehr geht.
I send mit HTerm.exe a ascii 1 aber der PORTA = 0x01 bim Atmega 32 funzt einfach ned mfg Mathias
Könntest du bitte nur das C-file posten!? Mit .rar können nicht alle umgehen. Und der C-code sollte reichen...
Und was ist, wenn du einfach nur machst:
1 | int main(void) |
2 | {
|
3 | unsigned char buffer; |
4 | |
5 | uart_init(); |
6 | uart_puts ("ATMEGA 32\r\n"); |
7 | for(;;) |
8 | {
|
9 | buffer = uart_receiver(); |
10 | uart_putc( buffer ); |
11 | }
|
12 | }
|
Du müsstest alles was du ins HT hineintippst auch vom HT angezeigt kriegen. Funktioniert das?
Nein Was muss man sonst noch was definieren RXD und TXD Port??? Passt der Code serial.c oben mfg Mathias
Mathias Koch wrote: > Nein > Schlecht. Aber du siehst im Hyperterminal den Text ATMEGA32. Das heist für mich, dass das Kabel und der MAX232 zumindest in Hinrichtung (µC an PC) funktioniert. Hast du im Hyperterminal, die Flusssteuerung auf 'keine' gesetzt? Ganz sicher?
Das wäre der Code wo liegt der Fehler darin??? void uart_init() { // UART Transmitter anschalten // Data mode 8N1, asynchron 4800 1MHZ UBRRH = 0; // Highbyte ist 0 UBRRL = 12; // Lowbyte ist 12 ( dezimal ) //UCSRB = (1 << TXEN) //gleiche wie UCSRB = 0x08; UCSRB = (1 << TXEN)|( 1 << RXEN ); // UART TX RX einschalten //UCSRC =(1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0) //gleiche wie UCSRC = 0x86 UCSRC =(1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); } /////////////////////////////////////////////////////// void uart_putc(unsigned char c) { while (!(UCSRA & (1<<UDRE))) //warten bis senden möglich ist { } UDR = c; //Ausgabe des Zeichens über UDR } ///////////////////////////////////////// ///////////////////////////////////////// char uart_receiver(void) { while (!(UCSRA & (1<<RXC))); /* Wait for incomming data */ if(!(UCSRA & (1<<RXC))) /* Return the data */ return UDR; } ////////////////////////////////////////// void uart_puts (char *s) { //schleife wird so lange ausgeführt bis kein Zeichen mehr kommt while (*s) { uart_putc(*s); s++; } } /////////////////////////////////////////////////////// int main(void) { DDRA = 0x01; ///Ausgang char buffer; uart_init(); for(;;) { //Init den Uart siehe oben Unterprogramm uart_puts("ATMEGA 32");//uart_puts liest einzelne Zeichen und gibt sie aus buffer = uart_receiver(); if(buffer == '1') { PORTA = 0x01; }
Dein Controller sendet dauernd "ATMEGA 32" an den PC? Pack das mal vor die Schleife.
Was könnte sonst noch der Fehler sein?? Stimmt die Empfangs Routine und die Überprüfung im If() hier noch ein Bsp wie ich die Daten sende mfg Mathias
Versuch' mal 'c' als 'volatile' zu definieren, am Besten global, dann sollte es gehen.
Daten empfangen geht ja nur nicht senden i vielleicht mein code falsch oder an was liegst sonst noch
Ich glaube das RXC Flag nicht ausgelöst wird und deshalb nich die daten ind UDR gelangen was muss ich deshalb tuan mfg Mathias
Probier das mal:
1 | void uart_init() |
2 | {
|
3 | // UART Transmitter anschalten
|
4 | // Data mode 8N1, asynchron 4800 1MHZ
|
5 | |
6 | UBRRH = 0; // Highbyte ist 0 |
7 | UBRRL = 12; // Lowbyte ist 12 ( dezimal ) |
8 | UCSRB = (1 << TXEN)|( 1 << RXEN ); // UART TX RX einschalten |
9 | UCSRC =(1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); |
10 | |
11 | }
|
12 | |
13 | void uart_putc(unsigned char c) |
14 | {
|
15 | while (!(UCSRA & (1<<UDRE))) //warten bis senden möglich ist |
16 | {
|
17 | }
|
18 | UDR = c; //Ausgabe des Zeichens über UDR |
19 | }
|
20 | |
21 | unsigned char uart_receiver(void) |
22 | {
|
23 | while (!(UCSRA & (1<<RXC))); /* Wait for incomming data */ |
24 | return UDR; |
25 | }
|
26 | |
27 | void uart_puts (char *s) |
28 | {
|
29 | //schleife wird so lange ausgeführt bis kein Zeichen mehr kommt
|
30 | while (*s) |
31 | {
|
32 | uart_putc(*s); |
33 | s++; |
34 | }
|
35 | }
|
36 | |
37 | int main(void) |
38 | {
|
39 | |
40 | |
41 | DDRA = 0x01; ///Ausgang |
42 | unsigned char buffer; |
43 | |
44 | uart_init(); |
45 | |
46 | uart_puts("ATMEGA 32"); // einmalige Ausgabe |
47 | |
48 | for(;;) |
49 | {
|
50 | buffer = uart_receiver(); // Byte empfangen |
51 | uart_putc(buffer); // Byte als Echo zurückliefern |
52 | // Byte auswerten
|
53 | if (buffer == '1') PORTA = 0x01; |
54 | if (buffer == '0') PORTA = 0x00; |
55 | }
|
56 | }
|
Ne geht leider auch nicht hab mal ein Bild der RS232 Schaltung beigelegt ATMEGA 32 gibt es immer aus nur bei "uart_receiver(); " denke i mal hägt sich das programm auf RXD auf PDO TXD auf PD1 mfg
C8 ist verkehrt rum. V- ist negativer als GND. Also muss der + Anschluss vom Elko nach GND. http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART
>ja hab ich geht auch nicht mit dem AVR Simulator funtkionierts wenn ich >RXC auf eins setze Da fehlen Satzzeichen... Meinst du: "ja, hab ich. Geht auch nicht. Mit dem AVR Simulator funtkionierts, wenn ich RXC auf eins setze." ? Dann sieht es so aus, als würde dein RXD-Pin kein Signal bekommen. Das einfachste wäre dann, den RX- und TX-Pin des MAX232 auf der TTL-Seite direkt miteinander zu verbinden (ohne Mikrocontroller dran). Dann solltest du im Terminalprogramm genau das sehen, was du auch schickst ("hardwired Echobetrieb"...).
Oben angezeigtes bild T1out 14 hat 6.61 Volt R1out hat 0 Volt Wenn ich das Kabel mit 2-3 verbinde kommt was beim hyp term raus wenn ich T1out und R1out verbinde tuat sich nix
>wenn ich T1out und R1out verbinde tuat sich nix
Du meinst damit wirklich die Pins 14 und 12?
Die sollte man nicht miteinander verbinden...
Verbinde mal Pin 11 und 12.
Pin 8 und 9 waren mal auf GND weil der Kollege einen fehler gemacht hat kann es sein das er deshalb nich geht?? 7 auf 7,60 8 auf 0 9 auf 4,7 10 auf 3,6 11 auf 4,69 12 auf 4,67 13 auf 0 14 auf 6,92
Hast du den Elko schon umgedreht? Noch mal: C8 ist verkehrt rum in der Schaltung!
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.