Forum: Mikrocontroller und Digitale Elektronik UART - senden funktioniert, Empang aber nicht?


von Pascal C. (passi)


Lesenswert?

Hi,

ich habe ein Programm auf einem Atmega8 das Daten vom PC empfangen soll. 
Das selbe Programm sendet auch Daten an den PC, und das funktioniert 
schon, d.h. Baudrate etc. sollte richtig eingestellt sein.

Nun zum Problem:
Beim Senden eines Bytes an den µC wird zwar der Interrupt ausgelöst, 
aber ich erhalte keine Daten:
1
; Interruptroutine: wird ausgeführt sobald ein Byte über das UART empfangen wurde
2
int_rxc:
3
        push temp                         ; temp auf dem Stack sichern
4
        in temp, UDR
5
        ;ldi temp, 0b11111111
6
        out PORTB, temp
7
        pop temp                          ; temp wiederherstellen
8
        reti

Betreibe ich das Programm mit der auskommentierten Zeile, dann bleiben 
die LEDs am PortB dunkel, egal was ich sende. Entferne ich das 
Kommentarzeichen und sende etwas, werden die LEDs hell, d.h. der 
Interrupt wird ausgelöst..

Woran kann das liegen?

Danke + Grüße
Passi

von Michael Wilhelm (Gast)


Lesenswert?

Wenn die leds low-aktiv geschaltet sind, ist doch alles klar 
(Vermutung).

MW

von Pascal C. (passi)


Lesenswert?

Low-Aktiv bedeutet, bei 0->LED an?
Also wie ich schon schrieb, wenn ich 0b11111111 an den PortB anlege, 
sind die LEDs an. Und selbst wenn es andersrum wäre, müssten ja manche 
LEDs angehen (bzw. ausgehen) wenn ich z.B. 56 sende..

von Pascal C. (passi)


Lesenswert?

Ok, jezt hab ich es geschafft das er das ausgibt was ich sende.. 
allerdings funktioniert das leider nur ein einziges Mal, danach springt 
er wohl wegen einer der beiden Abfragen ins Exit:
1
        sbis USR,RXC    ;exit if no new word is received
2
        rjmp exit
3
4
        in temp, UDR
5
        sbic USR, FE
6
        rjmp exit

Ideen woran das liegt? Muss ich eines der Bits nach Empfang wieder von 
Hand setzen/löschen?

von Matthias (Gast)


Lesenswert?

Nein leider nicht. Meine Glaskugel ist verkratzt und deshalb sehe ich 
den Quellcode grade nicht um zu helfen

von Pascal C. (passi)


Lesenswert?

Das ist mein Interrupt-Code soweit:
1
; Interruptroutine: wird ausgeführt sobald ein Byte über das UART empfangen wurde
2
int_rxc:
3
    push temp                         ; temp auf dem Stack sichern
4
5
    sbis USR,RXC                      ;exit if no new word is received
6
    rjmp exit
7
8
    in temp, UDR
9
    sbic USR, FE
10
    rjmp exit 
11
12
    cpi RSINCOUNT, 1
13
    breq setled
14
    mov LEDADD, temp
15
    inc RSINCOUNT
16
    rjmp exit
17
18
setled:  
19
    ldi RSINCOUNT, 0
20
    cpi LEDADD, 1
21
    breq setLED1
22
    cpi LEDADD, 2
23
    breq setLED2
24
    cpi LEDADD, 3
25
    breq setLED3
26
    rjmp exit
27
28
setLED1:    mov ocr_1, temp   
29
            rjmp exit
30
31
32
setLED2:    mov ocr_2, temp   
33
            rjmp exit
34
35
setLED3:    mov ocr_3, temp   
36
            rjmp exit
37
38
39
exit:  pop temp 
40
       reti                              ; Interrupt beenden

Edit: Achso, der Interupt wird übrigens immer noch erzeugt, also es muss 
an einem der Beiden exit-Jump Befehle liegen..?

von Matthias (Gast)


Lesenswert?

Interruptroutine: wird ausgeführt sobald ein Byte über das UART 
empfangen wurde
....
sbis USR,RXC                      ;exit if no new word is received

(das ist doch unsinn)
...
mov LEDADD, temp
...
mov ocr_1, temp
...

versuchs mal mit:
OUT LEDADD, temp
...

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.