Forum: Mikrocontroller und Digitale Elektronik Periodisches signal auf Atmega168 UART rx leitung?


von joerg_seemann (Gast)


Lesenswert?

versuche verzweifelt den RX-Interrupt auszulösen und das geht nicht.

erste messungen an der leitung ergaben ein periodisches Signal (siehe 
jpg)

Hardwarefehler, normal, oder was?

kann mir jemand weiterhelfen?

von joerg_seemann (Gast)


Angehängte Dateien:

Lesenswert?

räusper, räusper, hier das bild...

von ich (Gast)


Lesenswert?

welches JPG?????

von ich (Gast)


Lesenswert?

Wie weit ist die Störspg. von GND entfernt? Volt?

von ich (Gast)


Lesenswert?

Ist der Pin auch auf Input geschaltet oder gar auf ausgang und gibt eine 
o aus?

von joerg_seemann (Gast)


Lesenswert?

merkwürdiger weise ca (-!)6V.

beim senden liegt das lowlevel auch bei -6V, klappt aber problemfrei
(allerdings keine schwingung vorhanden)

von joerg_seemann (Gast)


Lesenswert?

im UCSR0B-register sind rx- und tx-enablebits gesetzt.

muss noch separat der port geschalten werden?

von ich (Gast)


Lesenswert?

Soll der Port ein Eingang sein dann: DDRx = 0
Soll der Port ein Ausgang sein dann: DDRx = 1
Portpin lesen: PINx

von ich (Gast)


Lesenswert?

ich macht Feierabend.
Bis Morgen.
Sandmännchen kommt gleich.
Gruß

von ich (Gast)


Lesenswert?

Guten Morgen...

Stell mal deinen Schaltplan in den Anhang.

von joerg_seemann (Gast)


Lesenswert?

moin moin

also ich habe das CAN-Testboard von 
http://www.kreatives-chaos.com/artikel/can-testboard
nachgebaut und grad nochmal gemessen, dass der RX-pin auf hi gesetzt 
ist, obwohl eigentlich im quelltext derartiges nicht vereinbart wurde.

werde mal am code basteln und ma gucken was passiert

von joerg_seemann (Gast)


Lesenswert?

hab am code gebastelt und der pegel am TX und RX sind noch bei ca. 
4.5V???

von ich (Gast)


Lesenswert?

Vielleicht hast du den int. Pullup eingeschaltet?
In welcher Sprache programmierst du?

von joerg_seemann (Gast)


Lesenswert?

.asm

bin erst seit ca. 14 tagen dabei, int. pullup?

von ich (Gast)


Lesenswert?

Z.B:

DDRB  = 0x00 ;Datenrichtungsregister B als Eingang

PORTB = 0xFF ;Alle internen Pullup's einschalten

Interne Pullup's benutzt man dann, wenn man einen eingang auf low
testen will und keinen ext. Widerstand hat.

z.B. ein Taster nach Masse: Gedrückt = low  nicht gedrückt = high

Zum ausschalten des P.U. : PORTB = 0x00

von ich (Gast)


Lesenswert?

Häng mal dein Programm in den Anhang

Hast du Skype?

von joerg_seemann (Gast)


Angehängte Dateien:

Lesenswert?

ich benutze avr studio...

titel und kommentare sind noch nicht aktualisiert.

von ich (Gast)


Lesenswert?

Das "sei" darfst du nicht in die Interruptroutine setzen.
Sondern nach der Initialisierun in die main Schleife.
So wie jetzt wird der globale Interrupt nicht freigegeben und folglich
die Int.Rut. nicht ausgeführt.

in main fehlt auch noch : loop: rjmp loop
Jetzt wird nach  main sofort einmal die Interruptroutine ausgeführt
und mangels Rücksprungadresse wieder ein Reset.

von ich (Gast)


Lesenswert?

Habe dein Programm zu schnell überflogen.
Stimmt so nicht ganz was ich geschrieben habe.
Die Schleife hast du ja schon drin.
Soweit ich mich noch erinnere must du noch den UART Int. freigeben
nicht nur den globalen mit sei.

von joerg_seemann (Gast)


Lesenswert?

ich probier das gleich mal...

von ich (Gast)


Angehängte Dateien:

Lesenswert?

Nochwas zum anschauen.

 Im Anhang

von joerg_seemann (Gast)


Lesenswert?

interrupt scheint zu kommen, led geht aus...


;-------------------------
.include "m168def.inc"  ;|   Definitionen der Adressen
;-------------------------
;
.def data = r17
.def temp = R16
.equ CLOCK = 7372800
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1

.org 0x00
        rjmp main

.org URXCaddr                             ; Interruptvektor für 
UART-Empfang
        rjmp int_rxc

; Hauptprogramm
main:
        ldi temp, LOW(RAMEND)
        out SPL, temp
        ldi temp, HIGH(RAMEND)
        out SPH, temp

    ldi temp, 0x01
    out DDRB,temp
    out PORTB,temp

        ; Baudrate einstellen
        ldi temp, LOW(UBRRVAL)
        sts UBRR0L, temp
        ldi temp, HIGH(UBRRVAL)
        sts UBRR0H, temp

        ; Frame-Format: 8 Bit
        ldi temp, 0x06
        sts UCSR0C, temp

    ldi temp, 0x98
        sts UCSR0B, temp              ; Interrupt bei Empfang
                          ; RX (Empfang) aktivieren

        sei                               ; Interrupts global aktivieren

loop:   rjmp loop                         ; Endlosschleife

; Interruptroutine: wird ausgeführt sobald ein Byte über das UART 
empfangen wurde
int_rxc:
        push temp                         ; temp auf dem Stack sichern

    ldi temp,0x00
    out PORTB, temp


        pop temp
                           ; temp wiederherstellen
        reti                              ; Interrupt beenden

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.