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.
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.
Code:.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
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.
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/artic...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
Die Diode ist doch generell die Schnittstelle für die Serielle Kommunikation oder?
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
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"
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.
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
wo wird da denn die Freq eingestellt ?Code:.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
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?"
Das Programm dort ist nicht für den Asuro geschrieben! Wenn man die Verbindung per Kabel herstellt, braucht man die 36kHz nicht.
Könnte sein...EDIT:"kann es sein das der Timer im CTC modus noch an ist da der im Bootlaoder benutzt wird?"
Lesezeichen