www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART ATmega16 Interrupt geht nicht


Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute.

Ich habe mit meinem atmega16 bis jetzt nur daten gesendet. Dann dachte 
ich mir, ich könnte auch mal welche empfangen (per Interrupt). Jetzt 
kommt das problem. ich sende ein einziges Zeichen und der interrupt wird 
über 10 in der sekunde ausgelöst und das bis ich die spannung abschalte 
oder reset mache.

Könnt ihr mir helfen???

Gruß M.H.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Du hast doch bestimmt ein Programm zu diesem Fehler.

MfG Spess

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Interrupt löst solange aus, bis Du die Daten aus UDR abgeholt hast.

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie meinst du abgeholt??

ich mach das halt so:

interrupt:
push r16

in r16, udr

out porta, r16

pop r16

reti

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der RXCI löst solange aus, bis UDR gelesen wurde. Nur die ISR aufsetzen 
aber UDR nicht auslesen würde das von Dir beschriebene Symptom ergeben.

Da Du UDR aber ausliest, hat Dein Fehler einen anderen Grund, dann poste 
doch mal mehr Code.

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist ein ausschnitt/zusammenschnitt des Codes:
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    out     UCSRC, temp
 
    sbi     UCSRB, RXCIE                    ; Interrupt bei Empfang
    sbi     UCSRB, RXEN
sbi ucsrb, txen

    
    sei                                     ; Interrupts global aktivieren
    
schleife:
    rjmp schleife



interrupt:
push r16

in r16, udr
out porta, r16
pop r16


reti

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau die interessanten Stellen zeigst du nicht.

Wie trägst du das Label interrupt: in die Tabelle mit den 
Interruptvektoren ein?

Manipulierst du vorher schon porta?

So dass du eigentlich nicht die Aktion in der IST sondern die 
Auswirkungen eines ständigen Resettens siehst...

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.org 0x00
        rjmp start
 
.org URXCaddr                                   ; Interruptvektor für UART-Empfang
        rjmp interrupt


start:
    ldi r16, 0xFF
  out ddra, r16
clr r16
out porta, r16

    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    out     UCSRC, temp
 
    sbi     UCSRB, RXCIE                    ; Interrupt bei Empfang
    sbi     UCSRB, RXEN
sbi ucsrb, txen

    sei                                     ; Interrupts global aktivieren
    
schleife:
    rjmp schleife



interrupt:
push r16

in r16, udr
out porta, r16
pop r16


reti

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Und wo wird das Baudratenregister initialisiert?

MfG Spess

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.equ F_CPU = 4000000                            ; 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


(siehe avr tutorial)

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit dem baudratenregister dürfte eig. nix sein. weil senden klappt ja

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Und wo steht so etwas wie:

                  ldi r16,High($XYZ)           ;
                  out UBRRH,r16
                  ldi r16,Low($XYZ)            ;
                  out UBRRL,r16

MfG spess

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

Bewertung
0 lesenswert
nicht lesenswert
Und wo wird der Stack initialisiert?

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
; Stackpointer initialisieren

    ldi     temp, LOW(RAMEND)
    out     SPL, temp
    ldi     temp, HIGH(RAMEND)
    out     SPH, temp

    ; Baudrate einstellen

    ldi     temp, HIGH(UBRR_VAL)
    out     UBRRH, temp
    ldi     temp, LOW(UBRR_VAL)
    out     UBRRL, temp

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Willst du uns eigentlich veralbern?

MfG Spess

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi     temp, HIGH(RAMEND)
    out     SPH, temp
    ldi     temp, LOW(RAMEND)
    out     SPL, temp

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Was sollen diese Fragmente? Stell dein komplettes Programm hier rein 
oder vergiss es.

Mfg Spess

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.def temp = r20
.equ F_CPU = 4000000                            ; 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

.cseg
.org 0x00
        rjmp start
 
.org URXCaddr                                   ; Interruptvektor für UART-Empfang
        rjmp interrupt



start:ldi r16, low(RAMEND)
ldi r17, high(RAMEND)
out spl, r16
out sph, r16

 ldi     temp, HIGH(UBRR_VAL)
    out     UBRRH, temp
    ldi     temp, LOW(UBRR_VAL)
    out     UBRRL, temp




    ldi r16, 0xFF
  out ddra, r16
clr r16
out porta, r16

    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    out     UCSRC, temp
 
    sbi     UCSRB, RXCIE                    ; Interrupt bei Empfang
    sbi     UCSRB, RXEN
sbi ucsrb, txen

    sei                                     ; Interrupts global aktivieren
    
schleife:
    rjmp schleife



interrupt:
push r16

in r16, udr
out porta, r16
pop r16


reti
.exit

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.def temp = r20
.equ F_CPU = 4000000                            ; 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

.cseg
.org 0x00
        rjmp start

.org URXCaddr                                   ; Interruptvektor für 
UART-Empfang
        rjmp interrupt



start:ldi r16, low(RAMEND)
ldi r17, high(RAMEND)
out spl, r16
out sph, r17

 ldi     temp, HIGH(UBRR_VAL)
    out     UBRRH, temp
    ldi     temp, LOW(UBRR_VAL)
    out     UBRRL, temp




    ldi r16, 0xFF
  out ddra, r16
clr r16
out porta, r16

    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    out     UCSRC, temp

    sbi     UCSRB, RXCIE                    ; Interrupt bei Empfang
    sbi     UCSRB, RXEN
sbi ucsrb, txen

    sei                                     ; Interrupts global 
aktivieren

schleife:
    rjmp schleife



interrupt:
push r16

in r16, udr
out porta, r16
pop r16


reti
.exit

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tschuldigung. so ist es richtig
.def temp = r20
.equ F_CPU = 4000000                            ; 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

.cseg
.org 0x00
        rjmp start
 
.org URXCaddr                                   ; Interruptvektor für UART-Empfang
        rjmp interrupt



start:ldi r16, low(RAMEND)
ldi r17, high(RAMEND)
out spl, r16
out sph, r17

 ldi     temp, HIGH(UBRR_VAL)
    out     UBRRH, temp
    ldi     temp, LOW(UBRR_VAL)
    out     UBRRL, temp




    ldi r16, 0xFF
  out ddra, r16
clr r16
out porta, r16

    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    out     UCSRC, temp
 
    sbi     UCSRB, RXCIE                    ; Interrupt bei Empfang
    sbi     UCSRB, RXEN
sbi ucsrb, txen

    sei                                     ; Interrupts global aktivieren
    
schleife:
    rjmp schleife



interrupt:
push r16

in r16, udr
out porta, r16
pop r16



reti
.exit

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Willst du uns eigentlich veralbern?

Ach geh, jetzt dauerts nimmer lang und der Code könnte fast vollständig 
sein. Wär ja auch zu einfach alles zusammen zu posten, und nur halb so 
spannend sowieso. Wer helfen will muss schon ein bisschen Initiative 
zeigen und sich den Baukausten selber zusammensetzen, und falls dann der 
Fehler des TO reproduzierbar sein sollte, dann möge selbiger den 
Quellcode bitte fertig korrigiert servieren!

</sarkasmus>

Nix für ungut.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Und wo ist die Include-Anweisung?

                   .include "m16def.inc"

MfG Spess

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die .include ist ganz oben bloß beim kopieren nicht mit markiert

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

An deinem Programm kann ich erstmal keinen Fehler erkennen
Und woran erkennst du jetzt, das der Interrupt so oft auslöst?

MfG Spess

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die ausgabe an porta ändert sich um die 10 mal pro sekunde (wenn ich ein 
zeichen sende). Dercontroller empfängt irgendwelchen schrott

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich habe mal das Programm simuliert. Es macht eigentlich das ,was es es 
soll.

Wie sieht den deine Hardware aus.

MfG Spess

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hardware in ordnung hab alles durchgemessen und überprüft.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wie ist ist der ATMega mit dem PC verbunden?

MfG Spess

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also schema:

atmega16 => max232 => Kabel(ca. 80cm) => PC


noch was. das senden der daten klappt einwandfrei.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>atmega16 => max232 => Kabel(ca. 80cm) => PC
>noch was. das senden der daten klappt einwandfrei.

Ich frage trotzdem: Ist auch die Masseverbindung in Ordnung?

MfG Spess

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja auch die ist i. O.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Hast du eine Möglichkeit, DSO/LA, dir das Signal anzusehen?

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.