www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timing-Problem auf Mega128 - für USART


Autor: Nicky (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe irgendwie mittlerweile ein Verständnisproblem bezüglich meines 
Timers im Mega128.

Ich möchte Daten per USART senden: 8Bit, 1 Startbit, 2 Stoppbit, 
9600Baud

Das Senden geht ohne Probleme, aber ich muss ein Reset über den Bus 
senden. Dazu wird der TX abgeschaltet und der entsprechende PIN auf 0 
gesetzt, nach Zeit X wird die TX wieder aktiviert, eine Weile lang 1 
ausgegeben und dann (jetzt nur noch) 1 Byte gesendet.
Für die Zeit 0 und 1 auf TXD verwende ich TIMER 0 , der mittlerweile 
permanent läuft, da ich hier schön länger grübel und nicht verstehe, 
weshalb ich 0 auf TX nur mit 920µs erhalte und 1 auf TX mit ca. 2200µs.
Lt. Simulation im AVR Studio sollten beide Zeiten 2200µs lang sein. Ich 
denke im Code klemmt etwas, aber wo???

Im beigefügten Bild sieht man das Timing! 0 --> 920µs 1--> 2040µs

Der Code für Timer und USART ohne Initialisierung:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++
USART0_INIT:
  ldi  temp0, (1<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01)
  sts  UCSR0C, temp0     ; set frame format: 8 data + 2 stop

  clr  temp0
  sts  UBRR0H, temp0
  ldi  temp0, 103  ; 9600 baud @ 16mhz
  out  UBRR0L, temp0

  ldi  temp0, (1<<UDRIE0)|(1<<TXEN0)
  out  UCSR0B, temp0

  ; set USART 0 tx_status to generate tx_reset
  ldi  XL, LOW(TX_STATUS)
  ldi  XH, HIGH(TX_STATUS)
  ser  temp0
  st   X, temp0

...

TIMER0_INIT:
  ldi  temp0, (1<<CS02)|(1<<CS00); Prescaler 1024
  out  TCCR0, temp0

...

; 
************************************************************************ 
*
; ***** TIMER 0 OVF
; 
************************************************************************ 
*
TIM0_OVF:
  ; reset counter
  clr  temp0
  out  TCNT0, temp0

  ; reset TOIIE0
  ldi  temp0, (1<<TOIE1);|(1<<TOIE1)
  out  TIMSK, temp0

  ; enable TXD
  ldi  temp0, (1<<TXEN0)|(1<<UDRE0)
  out  UCSR0B, temp0

  ; generate mark after break
  MAB_LOOP:
    ; wait for TOV0 flag
    in    temp0, TIFR
    sbrs  temp0, TOV0
    rjmp  MAB_LOOP

  ; reset TOV0 flag
  in   temp0, TIFR
  ori  temp0, 0b00000001
  out  TIFR, temp0

  ; load status byte  tx0            ldi  XL, LOW(TX_STATUS)
  ldi  XH, HIGH(TX_STATUS)

  ; set tx0_status = 0
  clr  temp0
  st   X, temp0

  reti

; 
************************************************************************ 
*
; ***** USART0_TXC
; 
************************************************************************ 
*
USART0_UDRE:

  ; check status to generate TX-RESET
  ldi  XL, LOW(TX_STATUS)
  ldi  XH, HIGH(TX_STATUS)

  ; load tx0_status
  ld    temp0, X
  cpi   temp0, 255
  breq  TXD0_RESET

  ; **************************************************************
  LOAD_DATA_FROM_CHART:

    ldi  YL, LOW(CLOCK)
    ldi  YH, HIGH(CLOCK)
    clr  temp2
    add  YL, temp0
    adc  YH, temp2

    ; load data from clock chart
    ld  temp1, Y

    SEND_TX:

    ; count tx0_status
    inc  temp0
    st   X, temp0

    ; send byte
    ldi  temp1, 0b01010101
    out  UDR0, temp1

    ; check - all channels sent
    cpi   temp0, 1
    brge  LAST_BYTE

    reti

      LAST_BYTE:
      ; generate tx0 reset if byte sent
      ser  temp0
      st   X, temp0

      reti

; ------------------------------------------------------------------
TXD0_RESET:

  ; tx --> off - set to 0
  clr  temp0
  out  UCSR0B, temp0
  out  PORTE, temp0

  ; clear TOV0 flag
  in   temp0, TIFR
  ori  temp0, 0b00000001
  out  TIFR, temp0

  ; reset counter
  clr  temp0
  out  TCNT0, temp0

  ; enable timer0_ovf interrupt
  ldi  temp0, (1<<TOIE0)
  out  TIMSK, temp0

  reti

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
++

Ich hoffe irgend jemand kann mir sagen, wo ich hier schief denke, oder 
was hier schief geht - denn irgendwie klammere ich mich noch an die 
Simulation im Studio, wo es ja passt.

Vorab schon mal danke!

MfG Nicky

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.