mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART mit Interrupt


Autor: Sahra Nana (sahra_nana)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat das Beispiel bei irgend jemanden funktioniert:
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
also bei funz nicht

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da dein Beispiel nicht vollständig ist, werden sich Helfer schwer tun 
die Frage zu beantworten.

Autor: Johnny B. (johnnyb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also auf meinem NEC V850 funktioniert Dein code nicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Brumbaer (Gast)
Datum:

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

Autor: Sahra Nana (sahra_nana)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: Sahra Nana (sahra_nana)
Datum:

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

Autor: spess53 (Gast)
Datum:

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