Moin, aus dem Turorial habe ich den nachfolgenden Quellcode weitestgehend übernommen und für den ATmega328P angepasst. Aber es kommt absolut nichts raus. Ich verwende einen USB-RS232-Adapter. Wenn ich das RX und TX verbinde, und mittels HTERM etwas ausgebe, dann erscheint es im RX Fenster. Also der Adapter geht und richtig verkabelt ist auch alles korrekt. Wo mag der Fehler liegen? Holger
1 | ; |
2 | ; ATmega328_Hardware_UART.asm |
3 | ; |
4 | ; Created: 07.11.2015 16:23:15 |
5 | ; Author : Holger |
6 | ; |
7 | |
8 | .include "m328Pdef.inc" |
9 | |
10 | .DEF temp = r16 |
11 | |
12 | |
13 | .equ F_CPU = 10000000 |
14 | |
15 | .equ BAUD = 9600 ;Baudrate |
16 | |
17 | ; Berechnungen |
18 | .equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ;clever runden |
19 | .equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ;Reale Baudrate |
20 | .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ;Fehler in Promille |
21 | |
22 | .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ;max. +/-10 Promille Fehler |
23 | .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!" |
24 | .endif |
25 | |
26 | .org 0x000 |
27 | rjmp start |
28 | |
29 | |
30 | start: |
31 | ;Stackpointer initialisieren |
32 | ldi temp, HIGH(RAMEND) |
33 | out SPH, temp |
34 | ldi temp, LOW(RAMEND) |
35 | out SPL, temp |
36 | |
37 | ;Baudrate einstellen |
38 | ldi temp, HIGH(UBRR_VAL) |
39 | sts UBRR0H, temp |
40 | ldi temp, LOW(UBRR_VAL) |
41 | sts UBRR0L, temp |
42 | |
43 | ;Frame-Format: 8 Bit |
44 | ldi temp, (1<<USBS0)|(3<<UCSZ00) |
45 | sts UCSR0C, temp |
46 | |
47 | ldi temp, (1<<TXEN0) ;TX aktivieren |
48 | sts UCSR0B, temp |
49 | |
50 | loop: |
51 | ldi zl,low(my_string*2); ;Z Pointer laden |
52 | ldi zh,high(my_string*2); |
53 | rcall serout_string |
54 | rjmp loop |
55 | |
56 | ;Ausgabe eines Strings aus dem Flash |
57 | |
58 | serout_string: |
59 | lpm ;nächstes Byte aus dem Flash laden |
60 | and r0,r0 ;= Null? |
61 | breq serout_string_ende ;wenn ja, -> Ende |
62 | serout_string_wait: |
63 | lds temp, UCSR0A ;Warten bis UDRE0 für das nächste |
64 | ;Byte bereit ist |
65 | sbrs temp, UDRE0 |
66 | |
67 | rjmp serout_string_wait |
68 | out UDRE0, r0 |
69 | adiw zl:zh,1 ;Zeiger erhöhen |
70 | rjmp serout_string ;nächstes Zeichen bearbeiten |
71 | serout_string_ende: |
72 | ret ;zurück zum Hauptprogramm |
73 | |
74 | ; Hier wird jetzt der String definiert und im Flash gespeichert |
75 | |
76 | my_string: .db "Test!",10,13,0 |