UART 2313 Interruptproblem

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 25 11 2024  21:44:28      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : 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.


Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


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