Forum: Mikrocontroller und Digitale Elektronik Probleme mit der Spannungsversorgung, Empfangsinterrupt wird laufend getriggert


von J. T. (chaoskind)


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

von Euleee (Gast)


Lesenswert?

Kiddo ...
... was ist n mit der versorgungsspannung? ..
Brotbrett und wandwarzen .. n bild für die götter

xDDD

Lg

von spess53 (Gast)


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

von J. T. (chaoskind)


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....

: Bearbeitet durch User
von J. T. (chaoskind)


Lesenswert?

Sonst wirklich keine Ideen? Ein Oszi hab ich leider auch net mehr zur 
Hand, seit meins mal sein MagicSmoke ausgehaucht hat.

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.