Forum: Mikrocontroller und Digitale Elektronik Warum kann nich nichts über den Uart senden?


von Peter (Gast)


Lesenswert?

Hallo zusammen

Ich bin Anfänger.
Warum kann ich mit dem Terminalprogramm
nichts auf das Port B ausgeben?
Möchte dies über Interrupt machen.

Baudrate und Taktfrequenz müsste stimmen. So wie auch im Terminal.

MfG

Peter

.include "8515def.inc"

.equ CLOCK = 6000000
.equ BAUD  = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
.def temp  = r16


  rjmp Reset  ;Reset vector
  reti    ;Ext Int 0
  reti    ;Ext Int 1
  reti    ;Timer 1 Capt
  reti    ;Timer 1 CompA
  reti    ;Timer 1 CompB
  reti    ;Timer 1 OVF
  reti    ;Timer 0 OVF
  reti    ;Serial Transfer Complete
  rjmp retiint_rxc ;UART Rx Complete
  reti    ;UART Data register empty
  reti    ;UART Tx Complete
  reti    ;Analog Comparator


Reset:
  ldi temp, LOW(RAMEND)      ;LOW-Byte der obersten RAM-Adresse
  out SPL, temp
  ldi  temp, HIGH(RAMEND)       ;HIGH-Byte der obersten RAM-Adresse
  out  SPH, temp

  sbi  UCR,TXEN        ;TXEN = 1 (Transmitter Enable)
  sbi  UCR,RXEN        ;RXEN = 1 (Reciever Enable)
  ldi  temp,UBRRVAL      ;Baud
  out  UBRR,temp

  ldi  temp,0xFF
  out  DDRB, temp               ;Datenrichtung von Port B einstellen, 1 
=
Ausgang

  ldi  temp, 0xFF
  out  PORTB, temp               ;Leds ausschalten

Main:
    ;Hier könnte Hauptprogramm sein
  rjmp  Main


retiint_rxc:

   push temp                         ;temp auf dem Stack sichern
   in temp, UDR
   out PORTB, temp
   pop temp                          ;temp wiederherstellen
   reti

von Peter D. (peda)


Lesenswert?

"Möchte dies über Interrupt machen."

Dann solltest Du sie auch freigeben.


Peter

von thkaiser (Gast)


Lesenswert?

Ja, genau, "Freiheit für die Interrupts"!!

von Peter (Gast)


Lesenswert?

Hallo auch peter

In bin noch Anfänger aber ich habe jetzt eingefügt aber ohne erfolg



  sbi UCR, RXEN
  sbi UCR, RXCIE
  ;sbi UCSRB, TXEN

  ldi  temp,UBRRVAL      ;Baudrate einstellen
  out  UBRR,temp

Guss

Peter

von Jörg Maaßen (Gast)


Lesenswert?

@Peter

Bisher hast Du nur die Interrupt-Bits gesetzt aber noch nicht die
Interrupts freigegeben.

  sbi UCR, RXEN
  sbi UCR, RXCIE

  sei

Gruß Jörg

von Peter (Gast)


Lesenswert?

Hallo Jörg

Und wie mache ich das? Ich bin Anfänger und habe es nicht
herausgefunden.
Ich bin allen dankbar, aber warum kann man wenn man es schon weiss ein
Beispiel hinschreiben?

Wie stoppe ich diese Interrupts und wie starte ich diese?

MfG

Peter

von thkaiser (Gast)


Lesenswert?

Hat Jörg doch schon geschrieben:

SEI  = alle Interrupts an
CLI  = alle Interrupts aus

Steht auch im Datenblatt (mit dem Zaunpfahl wink) ;)

von Peter (Gast)


Lesenswert?

Sorry war total genervt da heute überhaupt nichts funktiniert.
habe es nachträgelich gesehen.

Hier mein geändertets Programm aber dieses sche... läuft nicht.
Wer sieht den Fehler?

.include "8515def.inc"

.equ CLOCK = 6000000
.equ BAUD  = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
.def temp  = r16


  rjmp Reset  ;Reset vector
  reti    ;Ext Int 0
  reti    ;Ext Int 1
  reti    ;Timer 1 Capt
  reti    ;Timer 1 CompA
  reti    ;Timer 1 CompB
  reti    ;Timer 1 OVF
  reti    ;Timer 0 OVF
  reti    ;Serial Transfer Complete
  rjmp int_rxc;UART Rx Complete
  reti    ;UART Data register empty
  reti     ;UART Tx Complete
  reti    ;Analog Comparator

sei

Reset:
  ldi temp,LOW(RAMEND)      ;LOW-Byte der obersten RAM-Adresse
  out SPL, temp
  ldi  temp,HIGH(RAMEND)       ;HIGH-Byte der obersten RAM-Adresse
  out  SPH, temp

  ldi  temp,UBRRVAL      ;Baudrate einstellen
  out  UBRR,temp

  sbi UCR, RXEN
  sbi UCR, RXCIE

  ldi  temp,0xFF
  out  DDRB, temp               ;Datenrichtung von Port B einstellen, 1 
=
Ausgang


Main:
    ;Hier könnte Hauptprogramm sein
  out PORTB,temp      ;r16 ausgabe an PORTB
  ROR temp        ;Rotiert r16 nach links


  Zeit:          ;Marke für Zeitverzögerung

  inc  r17          ;erhöht den Registerinhalt um +1
  brne  Zeit      ;wenn r17<255 dann wird
  inc  r18          ;erhöht den Registerinhalt um +1
  brne  Zeit

rjmp  Main

;**************** Empfangen ****************
int_rxc:
    in  temp,SREG      ;CPU-Status sichern
  push temp               ;temp auf dem Stack sichern
     ;in temp, UDR           ;später Wert ausgeben
  ldi temp, PORTB
  inc temp
     out PORTB, temp
     pop temp                 ;temp aus dem Stack wieder herstellen
reti                         ;Interrupt beenden
;**************** Empfangen ****************

von Frank Linde (Gast)


Lesenswert?

Der SEI Befehl wird so niemals abgearbeitet. Setze ihn in das
Hauptprogramm.

Gruß, Frank

von Henning (Gast)


Lesenswert?

bzw in die reset routine. direkt unter die freigabe deiner einzelnen
UART-Interrupt freigaben.
sei ist für die globale interrupt freigabe
ab da werden also mögliche interrupt ausgeführt, sofern sie
zusätzlich einzeln zB mit RXCIE freigeschaltet sind

von Henning (Gast)


Lesenswert?


von Peter (Gast)


Lesenswert?

Hallo Danke zusammen

Super es geht.

MfG

Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.