fehler beim senden (atmega8)

Gast #1969455
Lesenswert?

hallo,
ich hoffe ihr könnt mir helfen.

ich habe ein kleines board mit einem atmega8 und einem ft232rl. nun will 
ich eindfach ein paar daten zum pc schicken, aber es kommt nur 000000 
an. egal was ich eigentlich los schick.

das programm soll dann noch für welztere aufgaben erweitert werden, was 
aber jetzt vorerst keine rolle spielen sollte.
1
.include<m8def.inc>
2

3
.equ FREQ   = 12000000          
4
.equ BAUD   = 9600
5
.equ UBRR   = 77             ;(FREQ/(16*BAUD))-1
6

7

8
.def eingang      = R0      ; nur in interrupt: USART_RXC
9
.def temp        = R16
10
.def ubertragen      = R17      ; reg für senden/emfangen
11

12

13

14

15
rjmp RESET
16
reti ;rjmp EXT_INT0
17
reti; rjmp EXT_INT1         
18
reti ;rjmp TIM2_COMP
19
reti ;rjmp TIM2_OVF
20
reti ;rjmp TIM1_CAPT
21
reti ;rjmp TIM1_COMPA
22
reti ;rjmp TIM1_COMPB
23
reti ;rjmp TIMER1_OVF
24
reti; rjmp TIMER0_OVF
25
reti ;rjmp SPI_STC 
26
reti; rjmp USART_RXC 
27
reti ;rjmp USART_UDRE
28
reti ;rjmp USART_TXC 
29
reti ;rjmp ADC 
30
reti ;rjmp EE_RDY             
31
reti ;rjmp ANA_COMP
32
reti ;rjmp TWSI
33
reti ;rjmp SMP_RDY
34

35

36
;_____MACROS_________________________________________________________
37
.MACRO SENDEN
38
  USART_Transmit:
39
    sbi UCSRB, TXEN
40
    cbi UCSRB, RXEN
41

42
    sbis UCSRA, UDRE
43

44
  rjmp USART_Transmit
45
                  ; put data (ubertragen) into buffer, sends the data
46
  out  UDR,   ubertragen              
47
.ENDM
48

49
;____________________________________________________________________
50

51
.MACRO EMPFANGEN
52
  USART_Receive:
53
    cbi UCSRB, TXEN
54
    sbi UCSRB, RXEN
55

56
    sbis UCSRA, RXC
57
    
58
  rjmp USART_Receive
59
                  ; get received data from buffer
60
  in  ubertragen, UDR0
61
.ENDM
62
;____________________________________________________________________
63

64

65
RESET:  
66
  ;----------STACK POINTER INITIALISIERUNG-------------------------
67
  ldi  temp,  high(RAMEND)
68
  out SPH,  temp
69
  ldi temp,   low(RAMEND)
70
  out SPL,  temp
71
  
72
  USART_Init:
73
  ;----------baud rate konfigurieren-------------------------------
74
  ldi temp,   high(UBRR)
75
  out UBRRH, temp
76
  ldi temp,   low(UBRR)
77
  out UBRRL, temp
78
  
79
  ;----------Enable receiver and transmitter-----------------------
80
  ldi temp,   (1 << RXEN) | (1 << TXEN) | (1<< RXCIE)
81
  out UCSRB, temp
82

83
  ;-----------Set frame format: 8data, 2stop bit-------------------
84
  ldi temp,   (0 << UMSEL) | (1 << USBS) | (3 << UCSZ0)
85
  out UCSRC, temp
86
  
87
  ;----------Ein- und Ausgänge festlegen
88
  ldi temp,  0b00111111      ; bit 0-5 ausgang, bit 6,7 eingang
89
  out DDRC,   temp        ; 
90

91
  ;----------sleep - idle enable-----------------------------------
92
  ldi temp,   (0 << SM0) | (0 << SM1) | (0 << SM2) | (0 << SE)
93
  out MCUCR, temp
94

95
  
96
  ;----------bitfolge übertragen - programm fertig geladen---------
97
  ldi ubertragen, 0b11111111    ; programm ist bereit
98
    SENDEN
99

100
;hier ist im moment das eigentliche senden, wenn das programm bereit ist.
101

102
;____________________________________________________________________
103
    
104
main:
105
  ;ldi ubertragen, 0b00001111    
106
  ;  SENDEN
107
  sleep
108
rjmp main
Gast #1969531
Lesenswert?

Hi

Sinnvoll wäre folgendes:
1
          .makro SENDEN
2
            ldi r16,@0
3
            rcall uart_tx
4
          .endmakro
5

6

7
uart_tx:  sbis UCSRA,UDRE
8
          rjmp uart_tx
9
          out UDR,r16
10
          ret

das kannst du so verwenden:

    SENDEN $FF oder SENDEN 'A' oder SENDEN 0b01010101 ....

MfG Spess
#1969533
Lesenswert?

john schrieb:
> danke für den tipp, aber das ganze hat ja nichts damit zu tun, dass er
> nicht das sendet, was er soll ... selbst wenn ich das macro durch ne
> funktion ersetz, sendet er IMMER 0

 ;-----------Set frame format: 8data, 2stop bit-------------------
  ldi temp,   (0 << UMSEL) | (1 << USBS) | (3 << UCSZ0)
  out UCSRC, temp

Bei einem Mega8 musst du UMSEL setzen, sonst geht das hier schief und 
überschreibt dir UBRRH
Gast #1969581
Lesenswert?

1
USART_RXC:
2
    EMPFANGEN
3
    mov   eingang,  ubertragen      
4
     ;-----empfangene Daten zur kontrolle zurück senden---------------
5
    mov   ubertragen,  eingang          
6
    SENDEN
7

8
reti

ok... jetzt sollte es doch eigentlich auch klappen, dass man Daten 
empfängt und sich diese dann wieder zur Kontrolle an den PC schickt?
Möchte dazu den Interrupt nutzen, habe auch im Programm noch das "sei" 
ergänzt und oben das "reti" und das ";" vor "USART_RXC" entfernt.

Muss man noch irgendetwas beachten?

(mit den empfangenen Daten soll dann noch weiter gearbeitet werden, was 
aber kein Problem darstellen sollte)
Gast #1969634
Lesenswert?

Danke, da kann man ja ewig suchen und der compiler (AVRstudio4) hat 
nicht gemeckert.

aber kommt davon, wenn man sich seinen code aus einem anderen projekt 
mit einem atmega644 kopiert.
Vor allem fällt einem sowas auch nicht selsbt direkt auf.

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