PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Senden von zeichen funzt nicht



albi1989
27.02.2008, 22:01
Ich habe hier mal für meinen ATmega168 was geschrieben
er soll eig nur warte mit einer Baudrate von 2400 1 stop bit und in 8ter frame an meine rechner senden. Wenn man simuliert geht alle nur aufen chip will es nicht funktionieren.




.include "m168def.inc"

.def temp = r16 ; Register für kleinere Arbeiten
.def zeichen = r17 ; in diesem Register wird das Zeichen an die
; Ausgabefunktion übergeben

.equ UBRR_VAL = 207


; Stackpointer initialisieren
ldi temp,HIGH(RAMEND)
out SPH,temp
ldi temp,LOW(RAMEND)
out SPL,temp


sbi PORTD, PD6
sbi DDRD,PD6




; Baudrate einstellen

ldi temp, HIGH(UBRR_VAL)
sts UBRR0H, temp
ldi temp, LOW(UBRR_VAL)
sts UBRR0L, temp

; Frame-Format: 8 Bit

ldi temp, (3<<UCSZ00)
sts UCSR0C, temp


ldi temp, 0x08
sts UCSR0B,temp ; TX aktivieren

loop:
ldi zeichen, 'T'
rcall serout ; Unterprogramm aufrufen
ldi zeichen, 'e'
rcall serout ; Unterprogramm aufrufen
ldi zeichen, 's'
rcall serout ; ...
ldi zeichen, 't'
rcall serout
ldi zeichen, '!'
rcall serout
ldi zeichen, 10
rcall serout
ldi zeichen, 13
rcall serout
rjmp loop

serout:

sbi PORTB,PB0
sbi DDRB, PB0
ldi temp,UCSR0A
sbrs temp,6 ; Warten bis UDR für das nächste ; Byte bereit ist
rjmp serout
sts UDR0, zeichen
ret ; zurück zum Hauptprogramm



Ps: Der prozessor ist ein einem Asuro drin der mit dem Eval board aufgerüstet wurde.

MFG ALBI

linux_80
27.02.2008, 23:14
Hallo,

Du schreibst ASURO, willst du die Daten dann auch per IR senden ?
Dann sollte man evtl. mit dem Timer die IR-Diode blinken lassen, damit der Empfänger das Signal auch erkennt. Schau in die Lib vom Asuro, wegen dem Timer.

albi1989
28.02.2008, 06:25
Ja ich möchte über IR-testen ich habe das Programm auch schona auf dem ATmega8 ok mit anderen Register Namen also um geneau zu sein habe ich das von hier kopiert: http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART und beim ATmega8 funktioniert es eig ganz gut. ach ja und der ATmega168 läuft wegen externen 8Mhz quarz auch nur mit 8000000 Hz von daher müsste es stimmen. die IR Diode wir meine ich zumindest nur zum empfangen benötgt

T.J.
28.02.2008, 06:54
Die Diode ist doch generell die Schnittstelle für die Serielle Kommunikation oder?

albi1989
28.02.2008, 16:44
Nein ist sie nicht also
die Diode ist nur mit PD1 verbunden
da ist das TXD pin also Tranceive Data (warum eig das x?) naja auch egal

Das RXD (Receive Data) ist an PD0 und wird mit dem .....
dieses viereckige Ding mit dem halben Kreis oben drauf verbunden

so zumindest laut Schaltplan

Auf dem Asuro geh ich mal stark von aus das die IR-Diode die schwarze da ist also und daneben ist dann auch das viereckige ding mit dem halb kreis drauf.

dementsprechend ist das dann das Teil was zum empfangen da ist :D

naja zu meinem Problem ich bin zu dem Schluß gekommen das mein viereckiges ding mit halb kreis oben rauf kaputt ist :(

EDIT "Sorry war bei einem programm zum empfangen das hier soll ja senden"

Besserwessi
28.02.2008, 17:15
Die IR Diode ist an TXD = PD1 und ist zum Senden.
Der Empfänger ist ein dreipoliger Baustein an RXD = PD0.

Wenn der der normale IR empfänger benutzt wird, reicht es nicht die Daten per UART auszugeben, man muss auch noch für die Modulation mit ca. 36 kHz sorgen, damit der empfänger die Daten richtig empfängt.

albi1989
29.02.2008, 09:27
Sorry bin drucheinander
also:
RXD (eingang) Empfänger (viereck Teil)
TXD (ausgang) Sender (Diode)

Hmm stimmt also muss ich mit Timer im CTC Modus arbeiten
jetzt aber warum funzt dann das prog von mikrocontroller.net


.include "m8def.inc"

.def temp = r16 ; Register für kleinere Arbeiten
.def zeichen = r17 ; in diesem Register wird das Zeichen an die
; Ausgabefunktion übergeben

.equ F_CPU = 4000000 ; Systemtakt in Hz
.equ BAUD = 9600 ; Baudrate

; Berechnungen
.equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden
.equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille

.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler
.error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif

; Stackpointer initialisieren

ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp

; Baudrate einstellen

ldi temp, HIGH(UBRR_VAL)
out UBRRH, temp
ldi temp, LOW(UBRR_VAL)
out UBRRL, temp

; Frame-Format: 8 Bit

ldi temp, (1<<URSEL)|(3<<UCSZ0)
out UCSRC, temp

sbi UCSRB,TXEN ; TX aktivieren

loop:
ldi zeichen, 'T'
rcall serout ; Unterprogramm aufrufen
ldi zeichen, 'e'
rcall serout ; Unterprogramm aufrufen
ldi zeichen, 's'
rcall serout ; ...
ldi zeichen, 't'
rcall serout
ldi zeichen, '!'
rcall serout
ldi zeichen, 10
rcall serout
ldi zeichen, 13
rcall serout
rjmp loop

serout:
sbis UCSRA,UDRE ; Warten bis UDR für das nächste
; Byte bereit ist
rjmp serout
out UDR, zeichen
ret ; zurück zum Hauptprogramm


wo wird da denn die Freq eingestellt ?
also das funzt beim ATmega8 und das habe ichgenomm und einfach auf den ATmega168 umgeschreiben



EDIT:"kann es sein das der Timer im CTC modus noch an ist da der im Bootlaoder benutzt wird?"

uwegw
29.02.2008, 10:16
Das Programm dort ist nicht für den Asuro geschrieben! Wenn man die Verbindung per Kabel herstellt, braucht man die 36kHz nicht.



EDIT:"kann es sein das der Timer im CTC modus noch an ist da der im Bootlaoder benutzt wird?"
Könnte sein...