Probleme mit der Spannungsversorgung, Empfangsinterrupt wird laufend getriggert

OP #3377590
Lesenswert?

MoinMoin

ich nach einiger Zeit mal wieder meinen Bastelkram rausgeholt und 
angefangen ne kleine Routine zu schreiben, die einfach hochzählt und den 
aktuellen Wert per UART ausgibt. Das hat auch halbwegs funktioniert, 
jedoch hat er sich stellenweise "verzählt". Ich dachte erst, evtl is die 
UART-Geschwindigkeit zu hoch, ich bin bis 1200baud runtergegangen, was 
das Problem des Verzählens tendenziel jedoch eher verschlechterte. Ich 
konnte das dann soweit eingrenzen, das es daran liegt, dass der 
UART-Empfangsinterrupt laufend triggert. Wenn ich jedoch die + oder 
Masse berühre, zählt er gemütlich hoch, wie er es eigl auch machen soll.

Meine Spannungsversorgung:
12V-Wandwarze --> 7805 mit Kondensatoren ---> Atmega32 (natürlich auch 
mit 100nF zw Masse und +).
Aufgebaut ist das ganze auf nem Brotbrett

Ich hatte testhalber mal RXT und TXD jeweils nen PullUp spendiert, was 
jedoch auch nichts brachte. Auch ein größerer Kondensator zwischen 5V 
und Masse brachten keine Verbesserung.

Habt ihr noch ne Idee, wodran es liegen könnte?

MfG und vielem Dank im voraus, Chaos

hier nochmal die kurze Routine... (es ist nur gefrickel zum testen *g)
1
.include "m32def.inc"
2

3
.equ F_CPU = 8000000                         ; Systemtakt in Hz
4
.equ BAUD  = 19200                              ; Baudrate
5
 
6
; Berechnungen
7
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
8
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
9
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
10
 
11
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
12
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
13
.endif
14

15
;________________________________________________________________________________
16

17
;REGISTER-DEFINITIONEN
18
;________________________________________________________________________________
19
 
20
.def UART_REG = r0
21

22
.def a1 = r16
23
.def a2 = r17
24
.def TEST_REG = r18
25

26
.org 0x00
27
        rjmp anfang
28
 
29
.org URXCaddr                                   ; Interruptvektor für UART-Empfang
30
        rjmp int_rxc
31

32
;________________________________________________________________________________
33

34
;INTERRUPTS
35
;________________________________________________________________________________
36
;UART-EMPGFANGSINTERRUPT
37

38
int_rxc:
39

40
  in    TEST_REG,UDR
41
  ldi    a1,65
42
  mov    UART_REG,a1
43
  call  UART_SEND
44

45
  ldi    a1,67
46
  mov    UART_REG,a1
47
  call  UART_SEND
48

49
  ldi    a1,75
50
  mov    UART_REG,a1
51
  call  UART_SEND
52

53
  mov    UART_REG,TEST_REG
54
  call  UART_SEND
55

56
  ldi    a1,13
57
  mov    UART_REG,a1
58
  call  UART_SEND
59

60
  reti
61

62
;________________________________________________________________________________
63

64
;PROGRAMM
65
;________________________________________________________________________________
66

67
anfang:
68

69
;Oszillator kallibrieren
70

71
    ldi    a1,170
72
    out    OSCCAL,a1
73

74
;Stackpointer initialisieren
75
                
76
    ldi    r16,HIGH(RAMEND)      ;Stackpointer (high) auf
77
    out    sph,r16            ;RAM-Ende setzen
78
    ldi    r16,LOW(RAMEND)        ;Stackpointer (low) auf
79
    out    spl,r16  
80

81

82
;Baudrate einstellen
83
 
84
      ldi     a1, HIGH(UBRR_VAL)
85
      out     UBRRH, a1
86
      ldi     a1, LOW(UBRR_VAL)
87
      out     UBRRL, a1
88

89
;Frame-Format: 8 Bit und Interrupts aktivieren
90
 
91
      ldi     a1, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
92
      out     UCSRC, a1
93

94
    ldi    a1, (1<<RXCIE)|(1<<RXEN)|(1<<TXEN) ;
95
    out    UCSRB,a1
96
      sei
97

98

99

100

101

102
TEST:
103

104
    inc    TEST_REG
105
    mov    UART_REG,TEST_REG
106
    call  UART_SEND
107
    call  WARTEN
108
    rjmp  TEST
109

110

111

112
UART_SEND:
113

114
      sbis    UCSRA,UDRE                  ; Warten bis UDR für das nächste
115
                                          ; Byte bereit ist
116
      jmp     UART_SEND
117
      out     UDR, UART_REG
118
      ret     
119

120

121
WARTEN:
122

123
    ldi    a1,255
124
    ldi    a2,255
125

126
    W1:
127
      dec    a1
128
      brne  W1
129
      dec    a2
130
      brne  W1
131

132
      ret
Gast #3378590
Lesenswert?

Hi

>Ich
>konnte das dann soweit eingrenzen, das es daran liegt, dass der
>UART-Empfangsinterrupt laufend triggert. Wenn ich jedoch die + oder
>Masse berühre, zählt er gemütlich hoch, wie er es eigl auch machen soll.

Hast du eine Massevebindung zwischen deinem Board und dem PC?

MfG Spess
OP #3378596
Lesenswert?

Masseverbindung besteht über die UART-Brigde(mysmart usb mkII)? Bisher 
hat des alles auch immer genauso funktioniert, wie ich es jetzt 
aufgebaut habe....

Ab und an(so bei einem von 100mal) läuft des hochzahlen auch nach dem 
Berühren noch ein wenig weiter(so zwischen 1-30sek) also alles eher 
nicht wirklich reproduzierbar....

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