Hallo liebe Leute,
ich habe eine Frage bezüglich des Zusammenspiels eines Atmega32 und
eines UM232R.
Ich bin neu im Bereich µC, hab mittlerweile grundsätzliche Dinge gelernt
wie LED, Taster und Servo in Betrieb genommen werden.
Nächstes Ziel ist es nun eine Kommunikation zum PC herzustellen.
Dementsprechend habe ich mir einen UM232R zugelegt.
Nun habe ich schon mehrfach versucht ein Test...oder wenigstens
irgendetwas zum PC zu senden. Es geht nichts. Wen wunderts? Ich denke
niemanden.
Also ich habe den GND des UM an den GND des µC angeschlossen sowie den
RX des UM an den TX des µC und den TX des UM an den RX des µC.
Allerdings passiert einfach nix. Komischerweise hatte ich vorher TX an
TX und RX an RX und da kam wenigsten Müll am PC an. Nun kommt garnix
mehr :(
Sollte ich eine RX bzw. TX LED mit rein bauen (weiß allerdings nich wie
die in die Schaltung implementiert wird) oder sollte ich ein anderes
Terminal als Hterm nutzen oder sollte ich einfach alles in den Müll
hauen und mir n neues Hobby suchen? (letzteres war nur Spass, ich
erwarte keine Antwort)
Ich weiß nicht wie ich weiter vor gehen soll :( (hab auch kein Oszi)
Hier mal der Code den ich aufm Mega laufen lasse möchte:
1. Assemblercode der angeblich Test ausgibt
1 | .include "m32def.inc"
|
2 |
|
3 | .def temp = r16 ; Register für kleinere Arbeiten
|
4 | .def zeichen = r17 ; in diesem Register wird das Zeichen an die
|
5 | ; Ausgabefunktion übergeben
|
6 |
|
7 | .equ F_CPU = 16000000 ; Systemtakt in Hz
|
8 | .equ BAUD = 9600 ; Baudrate
|
9 |
|
10 | ; Berechnungen
|
11 | .equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden
|
12 | .equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate
|
13 | .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille
|
14 |
|
15 | .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler
|
16 | .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
|
17 | .endif
|
18 |
|
19 | ; Stackpointer initialisieren
|
20 |
|
21 | ldi temp, HIGH(RAMEND)
|
22 | out SPH, temp
|
23 | ldi temp, LOW(RAMEND)
|
24 | out SPL, temp
|
25 |
|
26 | ; Baudrate einstellen
|
27 |
|
28 | ldi temp, HIGH(UBRR_VAL)
|
29 | out UBRRH, temp
|
30 | ldi temp, LOW(UBRR_VAL)
|
31 | out UBRRL, temp
|
32 |
|
33 | ; Frame-Format: 8 Bit
|
34 |
|
35 | ldi temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
|
36 | out UCSRC, temp
|
37 |
|
38 | sbi UCSRB,TXEN ; TX aktivieren
|
39 |
|
40 | loop:
|
41 | ldi zeichen, 'T'
|
42 | rcall serout ; Unterprogramm aufrufen
|
43 | ldi zeichen, 'e'
|
44 | rcall serout ; Unterprogramm aufrufen
|
45 | ldi zeichen, 's'
|
46 | rcall serout ; ...
|
47 | ldi zeichen, 't'
|
48 | rcall serout
|
49 | ldi zeichen, '!'
|
50 | rcall serout
|
51 | ldi zeichen, 10
|
52 | rcall serout
|
53 | ldi zeichen, 13
|
54 | rcall serout
|
55 | rcall sync
|
56 | rjmp loop
|
57 |
|
58 | serout:
|
59 | sbis UCSRA,UDRE ; Warten bis UDR für das nächste
|
60 | ; Byte bereit ist
|
61 | rjmp serout
|
62 | out UDR, zeichen
|
63 | ret ; zurück zum Hauptprogramm
|
64 |
|
65 | ; kleine Pause zum Synchronisieren des Empfängers, falls zwischenzeitlich
|
66 | ; das Kabel getrennt wurde
|
67 |
|
68 | sync:
|
69 | ldi r16,0
|
70 | sync_1:
|
71 | ldi r17,0
|
72 | sync_loop:
|
73 | dec r17
|
74 | brne sync_loop
|
75 | dec r16
|
76 | brne sync_1
|
77 | ret
|
1. C-Code der angeblich das wiedergibt was ankommt:
1 | #include <avr/io.h>
|
2 | #include <inttypes.h>
|
3 |
|
4 | // Sollte schon im Makefile definiert sein.
|
5 | // In dem Fall hier einfach löschen.
|
6 | #define F_CPU 16000000UL
|
7 |
|
8 | #define BAUD 19200UL
|
9 | #define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1)
|
10 |
|
11 | // USART initialisieren
|
12 | void uart_init(void)
|
13 | {
|
14 | // Baudrate einstellen (Normaler Modus)
|
15 | UBRRH = (uint8_t) (UBRR_BAUD>>8);
|
16 | UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);
|
17 |
|
18 | // Aktivieren von receiver und transmitter
|
19 | UCSRB = (1<<RXEN)|(1<<TXEN);
|
20 |
|
21 | // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
|
22 | UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
|
23 | }
|
24 |
|
25 | int main(void)
|
26 | {
|
27 | uint8_t buffer;
|
28 |
|
29 | // USART initialisieren
|
30 | uart_init();
|
31 |
|
32 | while (1)
|
33 | {
|
34 | // Warten bis Daten empfangen wurden
|
35 | while ( !(UCSRA & (1<<RXC)) )
|
36 | ;
|
37 |
|
38 | // Empfangsregister auslesen
|
39 | buffer = UDR;
|
40 |
|
41 | // Warten bis der Sendepuffer frei ist
|
42 | while ( !( UCSRA & (1<<UDRE)) )
|
43 | ;
|
44 |
|
45 | // Daten in den Puffer schreiben und damit senden
|
46 | UDR = buffer;
|
47 | }
|
48 | }
|