-
        

Ergebnis 1 bis 3 von 3

Thema: AVR 90S2313 Problem, und finde nicht den Fehler!

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.07.2004
    Beiträge
    274

    AVR 90S2313 Problem, und finde nicht den Fehler!

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,

    zur Zeit bastel ich an einem 90s2313! Habe mal zum Testen die ASM-Datei "A P P L I C A T I O N N O T E A V R 3 0 5" geöfnet und bisle rumexperimentiert! Ich habe alles mal soweit endfernt um nur PutChar zu nutzen!

    Als erstes wollte ich wissen ob ich die Daten auch auf einem Anderen Pin als PinD.1 ausgeben kann.

    Mein Versuch wurde für den PinB.0 gewählt. Dort habe ich eine LED angeschlossen!

    Mit dem Befehl
    Sbi PORTB,Tx ;Init port pins auf 1
    und mit
    cbi PORTB,Tx ;Init port pins auf 0

    Das klappt auch!


    So, nun mein Problem :
    Ich habe herausgefunden das das Programm ab dem Befehl UART_Delay irgendwas macht! Nach UART_Delay macht der Prozessor was er will! Sogar die LED wird dunkler!

    Was kann das sein?

    Grüße
    Alex

    Hier mal der Code :

    • ;**** A P P L I C A T I O N N O T E A V R 3 0 5 ************************
      ;*
      ;* Title : Half Duplex Interrupt Driven Software UART
      ;* Version : 1.1
      ;* Last updated : 97.08.27
      ;* Target : AT90Sxxxx (All AVR Device)
      ;*
      ;* Support email : avr@atmel.com
      ;*
      ;* Code Size : 32 Words
      ;* Low Register Usage : 0
      ;* High Register Usage : 4
      ;* Interrupt Usage : None
      ;*
      ;* DESCRIPTION
      ;* This Application note contains a very code efficient software UART.
      ;* The example program receives one character and echoes it back.
      ;************************************************* **************************

      .include "2313def.inc"

      ;***** Pin definitions


      .equ Tx =0 ;Transmit pin is PB0


      ;***** Global register variables

      .def bitcnt =R16 ;bit counter
      .def temp =R17 ;temporary storage register
      .def Txbyte =R18 ;Data to be transmitted


      .cseg
      .org 0
      rjmp reset
      reti
      reti
      reti
      reti
      reti
      reti
      reti
      reti
      reti
      reti


      ;***** Program Execution Starts Here

      ;***** Test program

      reset:
      ldi temp,$FF
      out DDRB,temp
      ldi temp,$FF
      out PORTB,temp

      ;cbi PORTB,Tx ;Init port pins auf 0

      forever:


      LDI TxByte, 12

      rcall putchar ;Echo received char
      rjmp forever



      ;************************************************* **************************
      ;*
      ;* "putchar"
      ;*
      ;* This subroutine transmits the byte stored in the "Txbyte" register
      ;* The number of stop bits used is set with the sb constant
      ;*
      ;* Number of words :14 including return
      ;* Number of cycles epens on bit rate
      ;* Low registers used :None
      ;* High registers used :2 (bitcnt,Txbyte)
      ;* Pointers used :None
      ;*
      ;************************************************* **************************
      .equ sb =1 ;Number of stop bits (1, 2, ...)

      putchar: ldi bitcnt,9+sb ;1+8+sb (sb is # of stop bits)
      com Txbyte ;Inverte everything
      sec ;Start bit

      putchar0: brcc putchar1 ;If carry set
      cbi PORTB,Tx ; send a '0'
      rjmp putchar2 ;else

      putchar1: sbi PORTB,Tx ; send a '1'
      nop

      putchar2: rcall UART_delay ;One bit delay
      rcall UART_delay



      lsr Txbyte ;Get next bit
      dec bitcnt ;If not all bit sent
      brne putchar0 ; send next
      ;else
      ret ; return




      ;************************************************* **************************
      ;*
      ;* "UART_delay"
      ;*
      ;* This delay subroutine generates the required delay between the bits when
      ;* transmitting and receiving bytes. The total execution time is set by the
      ;* constant "b":
      ;*
      ;* 3·b + 7 cycles (including rcall and ret)
      ;*
      ;* Number of words :4 including return
      ;* Low registers used :None
      ;* High registers used :1 (temp)
      ;* Pointers used :None
      ;*
      ;************************************************* **************************
      ; Some b values: (See also table in Appnote documentation)
      ;
      ; 1 MHz crystal:
      ; 9600 bps - b=14
      ; 19200 bps - b=5
      ; 28800 bps - b=2
      ;
      ; 2 MHz crystal:
      ; 19200 bps - b=14
      ; 28800 bps - b=8
      ; 57600 bps - b=2

      ; 4 MHz crystal:
      ; 19200 bps - b=31
      ; 28800 bps - b=19
      ; 57600 bps - b=8
      ; 115200 bps - b=2

      .equ b =250 ;19200 bps @ 4 MHz crystal



      UART_delay: ldi temp,b
      UART_delay1: dec temp
      brne UART_delay1

      ret
    Angehängte Dateien Angehängte Dateien
    • Dateityp: asm tx.asm (3,2 KB, 32x aufgerufen)

  2. #2
    Das die LED dünkler wird ist klar weil er so wie das programm aufgebaut ist ständig eine datenübertragung macht (forever schleife)...
    bei der verzögerung von b=250 dauert die UART delay schleife ca. 200µs und damit ein bit noch immer nur ca. 400µs bei 4Mhz deshalb kein sichtbares blinken sondern ein dünkler werden der LED...

    mfg
    Wolfgang

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.07.2004
    Beiträge
    274
    Hallo Wolfgang,

    danke für die Info! Hab µS und mS beim Umrechnen verwechselt!

    Grüße
    Alex

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •