UART - senden funktioniert, Empang aber nicht?

OP #555864
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
OP #556003
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?
OP #556042
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..?
Gast #556054
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
...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.