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


von Rainer B. (guitero)


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

von ... .. (docean) Benutzerseite


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

von Rainer B. (guitero)


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

von spess53 (Gast)


Lesenswert?

Hi

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

Wie sieht denn die Initialisierung aus?

MfG Spess

von Rainer B. (guitero)


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

von Rainer B. (guitero)


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

von Karl H. (kbuchegg)


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.

von Rainer B. (guitero)


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

von Thilo M. (Gast)


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?

von Rainer B. (guitero)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.