mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer/Counter/UART ungewollte Zeichen (ATTiny 2313)


Autor: Tilman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute !
Mein Programm macht folgendes: Alle 100 ms wird über UART ein 'X' an
ein Terminalprogramm gesendet. Nach 10 mal 'X' (also 1 Sek.) wird
eine '0' geschickt. Recht simpel. Tatsächlich kommt aber noch vor
jeder '0' ein seltsames Zeichen, das ich nicht bestellt habe und
nicht will. So sieht das dann aus:
XXXXXXX¬0XXXXXXXXX¬0XXXXXXXXX¬0XXXXXXXXX¬0XXXXXXXXX

 Weg mit dem ¬ ! Wo kommt das her ? Wie kann ich das ausschalten /
unterdrücken ? Wer weiss einen Rat ?

Danke !
Tilman



.include "tn2313def.inc"

.def temp = r16
.def count = r24
.def count2 = r25
.equ CLOCK = 4000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1

.org 0x0000
         rjmp main            ; Reset Handler

.org 0x0001
     rjmp int0_handler

.org 0x0002
         rjmp int1_handler    ; IRQ1 Handler

.org 0x0006
     rjmp timer0

main:

        ; Stackpointer initialisieren
        ldi temp, LOW(RAMEND)
        out SPL, temp

        ; Baudrate einstellen
        ldi temp, LOW(UBRRVAL)
        out UBRRL, temp
        ldi temp, HIGH(UBRRVAL)
        out UBRRH, temp

        ; Frame-Format: 8 Bit
        ldi temp, (1<<UCSRC)|(3<<UCSZ0)
        out UCSRC, temp

        sbi UCSRB,TXEN              ; TX aktivieren

         ldi temp, 0b00000010      ;Timer 0 auf CK 8 einstellen 2µs
  out TCCR0, temp              ;Timer in Betrieb

  ldi temp, 0b00000010    ;Timer 0 Interrupt initialisieren
        out TIMSK, temp

  ldi temp, 0b00000010  ;jede Änderung löst Interrupt aus
        out MCUCR, temp

        ldi temp, 0b11000000  ;INT0 und INT1 aktivieren
        out GIMSK, temp


        ldi temp, 0x00
        out DDRD, temp

        ldi temp, 0xFF
        out DDRB, temp

        sei         ;Interrupts allgemein aktivieren


loop:  cpi count,200    ; 102,4 ms vorbei ?
    breq zehnms
    cpi count2,10
    breq einsek
    rjmp loop

zehnms:
     ldi temp,'X'    ;tritt alle 10 ms ein
    push temp
       rcall serout
    clr count
    inc count2
    rjmp loop

einsek:
    ldi temp,'0'
  push temp
    rcall serout    ;sollte eigentlich jede Sekunde passieren
    clr count
    clr count2
    rjmp main

serout:     sbis UCSRA,UDRE
           rjmp serout
     out UDR, temp
     ret                     ; zurück zum Hauptprogramm

timer0:
  ;push temp
    inc count
  ;pop temp


    reti

int0_handler:
    ldi temp,'G'
    rcall serout
    reti

int1_handler:
    ldi temp,'H'
    rcall serout
    reti

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also in Interrupts grundsätzlich das SREG sichern und alle anderen
verwendeten Register.

Und Funktionen, die aus Main aufgerufen werden, nicht auch in
Interrupts aufrufen.
Profis können das in Ausnahmefällen doch, bei Aus- oder
Eingabfunktionen kommt aber grundsätzlich Mumpitz raus.


Peter

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.