hat das Beispiel bei irgend jemanden funktioniert:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
also bei funz nicht
|
Anzeige
|
UART mit Interrupthat das Beispiel bei irgend jemanden funktioniert:
also bei funz nicht Da dein Beispiel nicht vollständig ist, werden sich Helfer schwer tun die Frage zu beantworten. Also auf meinem NEC V850 funktioniert Dein code nicht. Tip: Lass dir zu Kontrollzwecken IMMER das Zeichen, das du empfangen hast, gleich wieder über den Sendekanal ausgeben. Dann kannst du in deinem Terminalprogramm kontrollieren, welches Zeichen dein Programm über die Schnittstelle empfangen hat. "Lokales Echo" ist kein Ersatz für Kontrollmöglichkeiten.
Gast
#1644864
AUf den ersten Blick sieht die Routine ok aus. Aber wird sie überhaupt aufgerufen ? Zeigt der IR Vector auf sie, Ist der Receiver Interrupt eingeschaltet ? Sind überhaupt Interrupts erlaubt ? Ist das DDR gesetzt ? Toggle doch mal den Pin in einer Endlosschleife, dann siehst du schon mal ob das geht. Dann Toggle den Pin bei jedem Aufruf der Routine, dann weisst du schonmal ob dein Programm dort hinkommt. Ich vermute, dass nicht. MfG SH .include "m88def.inc"
.def temp = R16
.equ F_CPU = 3686400 ; 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
.org 0x00
rjmp main
.org URXCaddr
rjmp int_rxc
; Hauptprogramm
main:
; Stackpointer initialisieren
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, LOW(RAMEND)
out SPL, temp
; Port D = Ausgang
ldi temp, 0xFF
out DDRD, temp
; Baudrate einstellen
ldi temp, HIGH(UBRR_VAL)
sts UBRR0H, temp
ldi temp, LOW(UBRR_VAL)
sts UBRR0L, temp
; Frame-Format: 8 Bit
ldi temp, (1<<USBS0)|(3<<UCSZ00)
sts UCSR0C, temp
sbr temp,(0<<RXCIE0)
sbr temp,(0<<RXEN0)
sbr temp,(0<<TXEN0)
sts UCSR0B ,temp
sei ; Interrupts global
aktivieren
loop:
rjmp loop ; Endlosschleife
; Interruptroutine: wird ausgeführt sobald ein Byte über das UART
empfangen wurde
int_rxc:
push temp ; temp auf dem Stack sichern
in temp, sreg ; SREG sichern
push temp
lds temp, UDR0 ; UART Daten lesen
cpi temp, '1' ; empfangenes Byte mit
1 vergleichen
brne int_rxc_1 ; wenn nicht gleich, dann zu
int_rxc_1
cbi PORTB, 0 ; LED einschalten, low aktiv
rjmp int_rxc_2 ; Zu int_rxc_2 springen
int_rxc_1:
cpi temp, '0' ; empfangenes Byte mit '0'
vergleichen
brne int_rxc_2 ; wenn nicht gleich, dann zu
int_rxc_2
sbi PORTB, 0 ; LED ausschalten, low aktiv
int_rxc_2:
pop temp
out sreg, temp ; SREG wiederherstellen
pop temp ; temp wiederherstellen
reti
hier das ganze Beispiel
Gast
#1644903
Hi Ersetze mal > sbr temp,(0<<RXCIE0) > sbr temp,(0<<RXEN0) > sbr temp,(0<<TXEN0) > sts UCSR0B ,temp durch ldi temp,(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0) sts UCSR0B ,temp 1. dein temp ist sonst unbestimmt 2. 'sbr temp,(0<<XYZ)' bewirkt nichts MfG Spess >> sbr temp,(0<<RXCIE0) >> sbr temp,(0<<RXEN0) >> sbr temp,(0<<TXEN0) >> sts UCSR0B ,temp > ldi temp,(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0) > sts UCSR0B ,temp > 1. dein temp ist sonst unbestimmt > 2. 'sbr temp,(0<<XYZ)' bewirkt nichts hier war nur einen Schreibfehler, ich habe auch alle auf 1 gesetzt..
Gast
#1645224
Hi > ldi temp, (1<<USBS0)|(3<<UCSZ00) > sts UCSR0C, temp > sbr temp,(0<<RXCIE0) > sbr temp,(0<<RXEN0) > sbr temp,(0<<TXEN0) > sts UCSR0B ,temp Du hast aber vorher schon etwas nach temp geladen. Und danach setzt du noch ein paar Bits. Was meinst du, was dabei herauskommt? MfG Spess Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|