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
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
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
Hi Wenn ein Pegelwandler dranhängt brauchst du weder PullUp noch Pullown. Wie sieht denn die Initialisierung aus? MfG Spess
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
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
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.
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.