www.mikrocontroller.net

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


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Möchte dies über Interrupt machen."

Dann solltest Du sie auch freigeben.


Peter

Autor: thkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, genau, "Freiheit für die Interrupts"!!

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Maaßen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: thkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat Jörg doch schon geschrieben:

SEI  = alle Interrupts an
CLI  = alle Interrupts aus

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ****************

Autor: Frank Linde (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der SEI Befehl wird so niemals abgearbeitet. Setze ihn in das
Hauptprogramm.

Gruß, Frank

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Danke zusammen

Super es geht.

MfG

Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.