mikrocontroller.net

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


Autor: john (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
.include<m8def.inc>

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


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




rjmp RESET
reti ;rjmp EXT_INT0
reti; rjmp EXT_INT1         
reti ;rjmp TIM2_COMP
reti ;rjmp TIM2_OVF
reti ;rjmp TIM1_CAPT
reti ;rjmp TIM1_COMPA
reti ;rjmp TIM1_COMPB
reti ;rjmp TIMER1_OVF
reti; rjmp TIMER0_OVF
reti ;rjmp SPI_STC 
reti; rjmp USART_RXC 
reti ;rjmp USART_UDRE
reti ;rjmp USART_TXC 
reti ;rjmp ADC 
reti ;rjmp EE_RDY             
reti ;rjmp ANA_COMP
reti ;rjmp TWSI
reti ;rjmp SMP_RDY


;_____MACROS_________________________________________________________
.MACRO SENDEN
  USART_Transmit:
    sbi UCSRB, TXEN
    cbi UCSRB, RXEN

    sbis UCSRA, UDRE

  rjmp USART_Transmit
                  ; put data (ubertragen) into buffer, sends the data
  out  UDR,   ubertragen              
.ENDM

;____________________________________________________________________

.MACRO EMPFANGEN
  USART_Receive:
    cbi UCSRB, TXEN
    sbi UCSRB, RXEN

    sbis UCSRA, RXC
    
  rjmp USART_Receive
                  ; get received data from buffer
  in  ubertragen, UDR0
.ENDM
;____________________________________________________________________


RESET:  
  ;----------STACK POINTER INITIALISIERUNG-------------------------
  ldi  temp,  high(RAMEND)
  out SPH,  temp
  ldi temp,   low(RAMEND)
  out SPL,  temp
  
  USART_Init:
  ;----------baud rate konfigurieren-------------------------------
  ldi temp,   high(UBRR)
  out UBRRH, temp
  ldi temp,   low(UBRR)
  out UBRRL, temp
  
  ;----------Enable receiver and transmitter-----------------------
  ldi temp,   (1 << RXEN) | (1 << TXEN) | (1<< RXCIE)
  out UCSRB, temp

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

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

  
  ;----------bitfolge übertragen - programm fertig geladen---------
  ldi ubertragen, 0b11111111    ; programm ist bereit
    SENDEN

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

;____________________________________________________________________
    
main:
  ;ldi ubertragen, 0b00001111    
  ;  SENDEN
  sleep
rjmp main





Autor: abc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>sbi UCSRB, TXEN
>cbi UCSRB, RXEN

>cbi UCSRB, TXEN
>sbi UCSRB, RXEN

Sinn? Unnötig!

Quarz?

>welztere
???

>Groß- und Kleinschreibung verwenden

Autor: john (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
welztere => vertippt und sollte "weitere" heißen

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

Autor: john (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: john (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Sinnvoll wäre folgendes:
          .makro SENDEN
            ldi r16,@0
            rcall uart_tx
          .endmakro


uart_tx:  sbis UCSRA,UDRE
          rjmp uart_tx
          out UDR,r16
          ret

das kannst du so verwenden:

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

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maik M. (myco)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz, meinst du nicht evtl. URSEL?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: john (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey danke.

das mit dem URSEL hat geholfen :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Oh, danke.
Ja klar. URSEL

Autor: john (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
USART_RXC:
    EMPFANGEN
    mov   eingang,  ubertragen      
     ;-----empfangene Daten zur kontrolle zurück senden---------------
    mov   ubertragen,  eingang          
    SENDEN

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)

Autor: Maik M. (myco)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: john (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.