USART1 löst ständig Interrupt aus

OP #1665014
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
OP #1665046
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
OP #1665782
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?
1
.include "m162def.inc"
2
 
3

4
.def temp      = r16        ;Hilfsregister
5
.def data      = r17        ;Adresse des y-Pointer
6
.def y_pointer = r18        ;Daten
7
.def x_pointer = r19        ;Adresse des x-Pointer
8
.def flag      = r20
9
.def sum       = r21
10

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

14
.equ UBRR_VAL   = ((TAKT+BAUD*8)/(BAUD*16)-1)   
15
.equ BAUD_REAL  = (TAKT/(16*(UBRR_VAL+1)))      ;Reale Baudrate
16
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ;Fehler in Promille
17

18
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ;max. +/-10 Promille Fehler
19
  .error
20
.endif
21

22
.CSEG                        
23
.org 0x00       rjmp init
24
.org OVF0addr  rjmp timer0_overflow  
25
//.org URXC0addr  rjmp uart1          
26
.org URXC1addr  rjmp uart1
27

28
init:  //-->STACK
29
  ldi     temp, LOW(RAMEND)
30
  out     SPL, temp
31
  ldi     temp, HIGH(RAMEND)
32
  out     SPH, temp
33

34

35
  //->USART0
36
  ldi   temp, HIGH(UBRR_VAL)
37
  out   UBRR0H, temp
38
  ldi   temp, LOW(UBRR_VAL)
39
  out   UBRR0L, temp
40

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

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

47
  //->USART1
48
  ldi   temp, HIGH(UBRR_VAL)
49
  out   UBRR1H, temp
50
  ldi   temp, LOW(UBRR_VAL)
51
  out   UBRR1L, temp
52

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

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

59

60
  //SRAM
61
  ldi     YH,HIGH(sdata)
62
  ldi     YL,LOW(sdata)             
63
    
64
  //Timer0
65
  ldi     temp, (1<<TOIE0)              
66
  out     TIMSK, temp      
67
    
68
  sei

Danke für eure Hilfe!

Gruß,

guitero
OP #1665845
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
#1665864
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.
OP #1665887
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
Gast #1666046
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?
OP #1673782
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren