www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART1 löst ständig Interrupt aus


Autor: Rainer B. (guitero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

habe ein Problem, bei dem ich gerade am verzweifeln bin.
Ich möchte mit einem AtMega162 über USART1 Daten empfangen.
Das hat bisher auch meistens geklappt, aber nun krieg ich USART1 nicht 
mehr zum Laufen, wobei USART0 problemlos geht.
Das Problem dabei ist, das ständig ein Interrupt ausgelöst wird. Dabei 
reicht es schon wenn ich an die Lötstelle des RxD Pins fasse. Sofort 
kommt der Interrupt. Kann das auch ein Software Problem sein oder muss 
es an der Hardware liegen? Habe keinen Schimmer wo ich ansetzen soll, 
bin noch ziemlicher Anfänger.

Bin für jeden Tipp dankbar!
Viele Grüße,

Guitero

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pullup? Pulldown dran? bzw was hängt überhaupt dran?

Ein offener Eingang kann durchaus als high gewertet werden...ob das 
wiederum dafür sorgen kann das der IRQ auslöst weiß ich nicht

Autor: Rainer B. (guitero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise hängt ein Pegelwandler dran, über den ich Signale vom PC 
zum µC senden kann. Ich dachte es sind interne Pullup Widerstände 
vorhanden und das daher keine externen mehr nötig sind. Das Ganze hat 
auch tagelang funktioniert, auf zwei identischen Testboards. Und auf 
beiden funktioniert die USART1 nun nicht mehr richtig. Wobei ich nicht 
ausschließe, dass ich beide, wie auch immer, gekillt habe.
Wie kann ich denn am besten vorgehen? Werde mich wohl erstmal über 
externe Pullup/downs schlau machen.

Schönen Feierabend!

Guitero

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wenn ein Pegelwandler dranhängt brauchst du weder PullUp noch Pullown.

Wie sieht denn die Initialisierung aus?

MfG Spess

Autor: Rainer B. (guitero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen zusammen,

nachdem ich heute morgen noch einige Tests gemacht habe, bin ich noch 
verwirrter als gestern. Gestern wurde bei Berührung der TxD Leitung vom 
Pegelwandler zum atmega162 sofort ein Interrupt ausgelöst, sobald ich 
das Kabel nur leicht berührt habe. Heute wird ein Interrupt erst nach 
mehrmaligem Klopfen auf die Leitung ausgelöst. Ist das Verhalten normal, 
das bei Berührung der Leitungen Interrupts ausgelöst werden und wie kann 
ich dieses verhindern?

spess53 schrieb:
> Wie sieht denn die Initialisierung aus?

.include "m162def.inc"
 

.def temp      = r16        ;Hilfsregister
.def data      = r17        ;Adresse des y-Pointer
.def y_pointer = r18        ;Daten
.def x_pointer = r19        ;Adresse des x-Pointer
.def flag      = r20
.def sum       = r21

.equ TAKT      = 7370000                        ; Systemtakt in Hz
.equ BAUD      = 9600                           ; Baudrate

.equ UBRR_VAL   = ((TAKT+BAUD*8)/(BAUD*16)-1)   
.equ BAUD_REAL  = (TAKT/(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
.endif

.CSEG                        
.org 0x00       rjmp init
.org OVF0addr  rjmp timer0_overflow  
//.org URXC0addr  rjmp uart1          
.org URXC1addr  rjmp uart1

init:  //-->STACK
  ldi     temp, LOW(RAMEND)
  out     SPL, temp
  ldi     temp, HIGH(RAMEND)
  out     SPH, temp


  //->USART0
  ldi   temp, HIGH(UBRR_VAL)
  out   UBRR0H, temp
  ldi   temp, LOW(UBRR_VAL)
  out   UBRR0L, temp

  ldi     temp, (1<<URSEL0)| 3<<UCSZ00)     
  out     UCSR0C,temp    

  ldi   temp, (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)
  out   UCSR0B,temp

  //->USART1
  ldi   temp, HIGH(UBRR_VAL)
  out   UBRR1H, temp
  ldi   temp, LOW(UBRR_VAL)
  out   UBRR1L, temp

  ldi     temp, (1<<URSEL1)|(1<<UCSZ10) |(1<<UCSZ11)  
  out     UCSR1C,temp    

  ldi   temp, (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1) 
  out   UCSR1B,temp


  //SRAM
  ldi     YH,HIGH(sdata)
  ldi     YL,LOW(sdata)             
    
  //Timer0
  ldi     temp, (1<<TOIE0)              
  out     TIMSK, temp      
    
  sei        


Danke für eure Hilfe!

Gruß,

guitero

Autor: Rainer B. (guitero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe mal mit einem JTAG getestet was für Werte im UDR-Register liegen 
bei diesen unbeabsichtigten Interrupts.
Wenn ich das Programm neu starte und dann durch berühren der TxD Lektung 
einen Interrupt auslöse, kommen im UDR die Zahlen 1,2,3 an. Nun springt 
das Programm wieder in die Hauptschleife. Löse ich einen weiteren 
Interrupt durch Berühren aus, kommen die Zahlen 4,5,6 an. Das geht immer 
so weiter.
Also: 7,8,9, A,B,C....

Wäre super wenn jemand nen Tipp für mich hätte.Bin am verzweifeln hier!

Viele Grüße,

Guitero

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

Bewertung
0 lesenswert
nicht lesenswert
Was mich stutzig macht:
Du gibst zwar für beide UART den Empfangsinterrupt frei, hast aber nur 
für UART1 einen Handler.

Aber ansonsten klingt das ganze Verhalten mit Berühren, aufs Kabel 
klopfen etc. für mich nach einer schlechten Lötstelle, Kabelbruch, 
Wackelkontakt oder dergleichen.

Autor: Rainer B. (guitero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Was mich stutzig macht:
> Du gibst zwar für beide UART den Empfangsinterrupt frei, hast aber nur
> für UART1 einen Handler.

Das liegt daran, weil ich schon alles mögliche im Code geändert habe um 
dem Fehler auf die Schliche zu kommen. Es waren mal zwei verschiedene 
Handler.


> Aber ansonsten klingt das ganze Verhalten mit Berühren, aufs Kabel
> klopfen etc. für mich nach einer schlechten Lötstelle, Kabelbruch,
> Wackelkontakt oder dergleichen.

Ich habe zwei Platinen, und auf beiden funktioniert es plötzlich nicht 
mehr.
Aber ich werde nochmal genau drübergucken.

Danke für deine Tipps!

Guitero

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Aber ansonsten klingt das ganze Verhalten mit Berühren, aufs Kabel
>
> klopfen etc. für mich nach einer schlechten Lötstelle, Kabelbruch,
>
> Wackelkontakt oder dergleichen.

So sieht's aus.
Auch wenn ein zu langes Kabel dran ist, das am PC-Ende nicht eingesteckt 
ist kann das passieren (hatte ich auch schon).
Brummschleife (Schutzleiter) durch Potentialunterschiede oder 
Antennenwirkung des langen Kabels würde ich erst mal inspizieren, evtl. 
fehlt der Schutzleiter an deiner Platine?

Autor: Rainer B. (guitero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thilo M. schrieb:

> So sieht's aus.
> Auch wenn ein zu langes Kabel dran ist, das am PC-Ende nicht eingesteckt
> ist kann das passieren (hatte ich auch schon).


Wollt nochmal kurz ne Rückmeldung geben, da ich den Fehler gefunden 
habe. Lag tatsächlich an der Länge des Kabels und daran, dass ich Rx und 
Tx zu Testzwecken vom Pegelwandler abgezogen hatte. Scheinbar ist 
dadurch der ständige Interrupt ausgelöst worden.

Vielen Dank für eure Hilfe!


Gruß,

guitero

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.