UART 2313 Interruptproblem Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
UART 2313 Interruptproblem |
|
|
|
|
BID = 96833
olfi13 Schreibmaschine
Beiträge: 1077 Wohnort: Wittingen
|
|
Habe 6 Bytes die ich an 2313 UART senden will, der Interrupt (UDRE) läuft, aber wenn 2 Bytes in UDR geschoben sind ist Schluß: UDR ist leer, UDRE ist clear. Der Interrupt "TXComplete" wird nicht ausgelöst. Kann mir jemand einen Tip geben welches Bit mir fehlt
oder ob mein Programm 'ne Macke im Ablauf hat?
Später soll das Programm auch Daten lesen können, aber soweit bin ich noch nicht. Notgedrungen mache ich ohne Interrupt weiter, aber das Problem ist noch nicht gegessen.
Ich bin auch dankbar für weitere Fehlermeldungen, ich fange mit den Mikrocontrollern erst an, da werden hier noch ne Menge Bugs zu finden sein.
Deshalb habe ich alle meine Kommentare so belassen.
So, genug der Vorrede, das Listing:
; ////////////////////////////////////////////////////////////////////
; // Sendet Bytes (Datenpaket) aus Datensegment
; // Wenn Tx_Nr > 0 dann liegen Daten zum Senden bereit
; // Tx_Nr stößt das Senden an
; ////////////////////////////////////////////////////////////////////
.include "2313def.inc" ; Definitionen
.DSEG
.org 0x60 ; Datenbereich
Adresse: .byte 1
Job: .byte 1
Daten1: .byte 1
Daten2: .byte 1
Daten3: .byte 1
Checksum: .byte 1
.CSEG
; Eigene Substitutionen:
.def temp = r21 ;
.def Tx_Nr = r18 ; Zeiger auf Byte das gesendet werden soll; 0 = nichts zu senden
.def Data_akt = r15
; Ab hier steht Code (Ab Adresse 0x00 im Flash-PROM):
.org $000
rjmp start ; Erstmal überspringen
reti; INT0addr=$001
reti; INT1addr=$002
reti; ICP1addr=$003
reti; OC1addr =$004
reti; OVF1addr=$005
reti; OVF0addr=$006
reti; URXCaddr=$007
rjmp UDREhdl; UDREaddr=$008
rjmp UTXChdl; UTXCaddr=$009
reti;
; *********************************************************
start:
ldi temp, Low(ramend) ; (0x60)
out spl, temp ; Position des Stack's
; Die Bytes erstmal füllen um was zu sehen
ldi temp, 1
sts Adresse , temp
ldi temp, 0xda
sts Job , temp
ldi temp, 0x20
sts Daten1, temp
ldi temp, 0xFF
sts Daten2, temp
ldi temp, 0x55
sts Daten3, temp
; Checksum wird berechnet
ldi Tx_Nr, 0 ; Zeiger auf zu sendende Bytenummer
;************************************************
;Datenrichtung der Pins festlegen (meine Testschaltung)
ldi temp, 0b00000011
Out ddrb, temp ; Ports auf Ausgang
ldi temp, 0b01111110
Out ddrd, temp
; ***************************************************
rcall init_Uart
sei ;alle Interrupts ein
; *************************************************
ldi Tx_Nr,1
; rcall mke_Checksum
prgschleife:
cpi Tx_Nr,0 ; Daten zum Senden vorhanden?
breq a_TX_Data ;Zeroflag gesetzt: keine Daten
sbic UCR, TXEN ; Sendebetriebsart noch aus?
rjmp a_TX_Data
rcall Mode_Tx ; Sendebetriebsart einschalten
a_TX_Data:
rjmp prgschleife ;Zurück zum Anfang Hauptschleife
; &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; *** UART ***
init_Uart:
ldi temp, 29 ; 29 = 19200 Baud
Out UBRR, temp ; 239 = 2400 Baud bei Quarz 9.1260 Mc
cbi UCR, CHR9 ; Datenformat 8N1
rcall Mode_Rx ; Empfangsbetriebsart einschalten
ret
; ----------------------------------------------------
UDREhdl: ;UDREaddr=$008 ;UART Data Register Empty
; Wenn UDR leer ist nächstes Zeichen reinschieben
sbic UCR, OR ; Wurde kein Zeichen verloren, dann rjmp UDREhdl_A ; springen
rjmp Tx_Data_End ; sonst verwerfen
UDREhdl_A:
cpi Tx_Nr, 5 ; TX_max ; alle Daten fertig?
breq Tx_Data_End ; ja: Sprung,
ldi zl, 0x60
ldi zh, 0; Z-Reg auf Daten (0x60)
add zl, Tx_Nr ; Zeiger auf zu sendendes Byte
dec zl ; Tx_Nr beginnt bei 1, Offset für ZReg bei 0
ld r1,z
inc Tx_Nr ; Nächstes Byte
out UDR, r1 ; Sendedaten in Puffer schieben
Tx_Data_End:
;sbi USR, UDRIE ; hilft auch nicht
reti
; --------------------------------------------------
UTXChdl: ;UTXCaddr=$009 ;UART Transmit Complete Interrupt
; Dieser Interrupt wird aufgerufen wenn der
;Sendepuffer leer ist (alle Daten gesendet)
ldi Tx_Nr, 0 ;Anzahl zu sendender Bytes wieder auf 0
rcall Mode_Rx
reti
; ----------------------------------------------------
; **************************************************
; RS 485 auf Empfangsbetrieb schalten und Interrupts
; freigeben:
Mode_Rx:
cli
; Senden aus
cbi UCR, UDRIE ; UART Data Register (UDR) Empty Interrupt
cbi UCR, TXCIE ; UART Transmit Complete Interrupt
cbi UCR, TXEN ; Pin von TxD trennen
; Empfangen ein:
sbi UCR, RXCIE ; UART Receive Complete Interrupt
sbi UCR, RXEN ; PIN mit RxD vebinden
sei
ret
; ********************************************************
; RS 485 auf Sendebetrieb schalten und Interrupts freigeben:
Mode_Tx:
cli
; Empfangen ausschalten:
cbi UCR, RXEN ; Pin von RxD trennen
cbi UCR, RXCIE ; UART Receive Complete Interrupt
sbi UCR, TXEN ; PIN mit TxD vebinden
; Interrupt ermöglichen
sbi UCR, UDRIE ; UART Data Register (UDR) Empty Interrupt
sbi UCR, TXCIE ; UART Transmit Complete Interrupt
sei
ret
; ********************************************************
So, ich hoffe es ist durch die Formatierung nichts umgekommen! |
|
BID = 112112
olfi13 Schreibmaschine
Beiträge: 1077 Wohnort: Wittingen
|
|
Tja, es hat lange gedauert aber keiner hat geantwortet.
So schließe ich die Sache jetzt ab. |
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag heute wurden bisher 12 Beiträge verfasst © x sparkkelsputz Besucher : 182399703 Heute : 6901 Gestern : 7548 Online : 909 25.11.2024 21:44 8 Besucher in den letzten 60 Sekunden alle 7.50 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0192317962646
|