Forum: Mikrocontroller und Digitale Elektronik fehler beim senden (atmega8)


von john (Gast)


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

von abc (Gast)


Lesenswert?

>sbi UCSRB, TXEN
>cbi UCSRB, RXEN

>cbi UCSRB, TXEN
>sbi UCSRB, RXEN

Sinn? Unnötig!

Quarz?

>welztere
???

>Groß- und Kleinschreibung verwenden

von john (Gast)


Lesenswert?

welztere => vertippt und sollte "weitere" heißen

aber danke schon einmal für die doch recht sinnvollen hinweise.

von john (Gast)


Lesenswert?

ach ja ... und ich nehm den takt von dem ft232rl und hatte da mit dem 
atmega644 auch keine probleme mit.

von spess53 (Gast)


Lesenswert?

Hi

Die Makros sind unsinnig. Bei einem Makro wird immer der komplette Code 
eingefügt. Damit müllst du dir den Speicher voll. So etwas macht man mit 
Unterprogrammen.

MfG Spess

von john (Gast)


Lesenswert?

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

von spess53 (Gast)


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

von Karl H. (kbuchegg)


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

von Maik M. (myco)


Lesenswert?

@Karl heinz, meinst du nicht evtl. URSEL?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

Da fehlt die URSEL. Deshalb wird die zuvor eingestellt Baudrate zerstört 
und die Biteinstellungen werden nicht wirksam.

von john (Gast)


Lesenswert?

hey danke.

das mit dem URSEL hat geholfen :)

von Karl H. (kbuchegg)


Lesenswert?

Maik M. schrieb:
> @Karl heinz, meinst du nicht evtl. URSEL?

Oh, danke.
Ja klar. URSEL

von john (Gast)


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)

von Maik M. (myco)


Lesenswert?

In deinem EMPFANGEN Makro steht
in  ubertragen, UDR0

glaube das müsste
in  ubertragen, UDR

heißen, bin aber nicht sicher, da der Compiler an der Stelle schonmal 
meckern müsste

von john (Gast)


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.

von Spess53 (Gast)


Lesenswert?

Hi

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

Warum sollte er? UDR0 ist im Include-File als Bit0 von UDR definiert.

MfG Spess

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.