Forum: Mikrocontroller und Digitale Elektronik Registerinhalte mit dem uart versenden


von Michi (Gast)


Lesenswert?

Hallo,

ich habe in den Application Notes von Atmel einen RC5 Empfänger
gesehen. Da dies mein erster Versuch mit einem Microcontroller ist
dachte ich mir das wär das beste etwas fertiges zu nehmen und das zu
modifizieren. Ich habe den Quelltext aus dem Uarttutorial genommen und
wollte ihn in das Atmel programm einbinden.
Ich habe schon ein wenig rumexperimentiert, bisher hat aber nichts
funktioniert.

Ich erhalte über die RS232 Schnittstelle Fragezeichen Anstelle der
Werte der Register. Daraufhin habe ich den Wert im Register um eins
erhöht. Anschliessend erhielt ich keine Werte für die
Register.(nichtmal ein ? oder eine 0)

Wie kann ich diese Register übertragen das sie vom PC verstanden
werden?

Der Codeausschnitt für ein Register:

ldi temp1,'1'                 ; Unterprogramm aufrufen
add command,temp1
mov tempUART, command
rcall serout                  ; RS232 Senden

Hier der komplette Code:

.include "m8def.inc"

.equ  INPUT    =2  ;PD2
.equ  SYS_ADDR  =0  ;The system address


.def  S  =R0
.def  inttemp  =R1
.def  ref1  =R2
.def  ref2  =R3

.def  temp  =R16

.def  timerL  =R17
.def  timerH  =R18

.def  system  =R19
.def  command  =R20

.def  bitcnt  =R21
.def tempUART = R22
.def temp1=R23
.equ CLOCK = 4000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1


.cseg
.org 0
    rjmp  reset

;********************************************************************
;* "TIM0_OVF" - Timer/counter overflow interrupt handler
;*
;* The overflow interrupt increments the "timerL" and "timerH"
;* every 64us and 16,384us.
;*
;* Number of words:  7
;* Number of cycles:  6 + reti
;* Low registers used:  1
;* High registers used: 3
;* Pointers used:  0
;********************************************************************
.org OVF0addr
TIM0_OVF:  in  S,sreg
    inc  timerL    ;Updated every 64us
    inc  inttemp
    brne  TIM0_OVF_exit

    inc  timerH

TIM0_OVF_exit:  out  sreg,S
    reti




;********************************************************************
;* Example program
;*
;* Initializes timer, ports and interrupts.
;*
;* Calls "detect" in an endless loop and puts the result out on
;* port B.
;*
;* Number of words:  16
;* Low registers used:  0
;* High registers used: 3
;* Pointers used:  0
;********************************************************************

reset:    ;ldi    temp,low(RAMEND)  ;Initialize stackpointer
    ;out  SPL,temp
    ;ldi    temp,high(RAMEND)  ; Commented out since 1200 does not hae
SRAM
    ;out  SPH,temp

    ;UartAktivieren
    ; Stackpointer initialisieren
        ldi tempUART, LOW(RAMEND)
        out SPL, tempUART
        ldi tempUART, HIGH(RAMEND)
        out SPH, tempUART

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

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

        sbi UCSRB,TXEN                    ; TX aktivieren

    ;RC5

    ldi  temp,1    ;Timer/Counter 0 clocked at CK
    out  TCCR0,temp

    ldi  temp,1<<TOIE0  ;Enable Timer0 overflow interrupt
    out  TIMSK,temp
    sei      ;Enable gobal iterrupt



main:
    rcall  detect    ;Call RC5 detect routine

    cpi  system,SYS_ADDR  ;Respponds only at the specified address
    brne  release
main1:
    andi  command,0x3F  ;Remove control bit
    ;if not command then goto keinuart
    ldi tempUART, 'C'
        rcall serout                      ; Unterprogramm aufrufen
        ldi tempUART, ':'
        rcall serout
    ldi temp1,'1'                 ; Unterprogramm aufrufen
    add command,temp1
        mov tempUART, command
        rcall serout
    ldi tempUART, 'S'
        rcall serout
    ldi tempUART, ':'
        rcall serout
    ldi temp1,'1'
    add system,temp1
    mov tempUART, system
        rcall serout
    ldi tempUART, 10
        rcall serout
        ldi tempUART, 13
        rcall serout
    keinuart:
    rjmp  main


release:  clr  command    ;Clear PORTB

    rjmp  main1


serout:
        sbis UCSRA,UDRE                   ; Warten bis UDR für das
nächste
                                          ; Byte bereit ist
        rjmp serout
        out UDR, tempUART
        ret                               ; zurück zum Hauptprogramm

;********************************************************************
;* "detect" - RC5 decode routine
;*
;* This subroutine decodes the RC5 bit stream applied on PORTD
;* pin "INPUT".
;*
;* If successe: The command and system address are
;*    returned in "command" and "system".
;*    Bit 6 of "command" holds the toggle bit.
;*
;* If failed:   $FF in both "system" and "command"
;*
;* Crystal frequency is 4MHz
;*
;* Number of words:  72
;* Low registers used:   3
;* High registers used:  6
;* Pointers used:   0
;********************************************************************
detect:    clr  inttemp
    clr  timerH

detect1:  clr  timerL

detect2:  cpi  timerH,8  ;If line not idle within 131ms
    brlo  dl1
    rjmp  fault    ;  then exit

dl1:    cpi  timerL,55  ;If line low for 3.5ms
    brge  start1    ;   then wait for start bit

    sbis  PIND,INPUT  ;If line is
    rjmp  detect1    ;   low  - jump to detect1
    rjmp  detect2    ;   high - jump to detect2


start1:    cpi  timerH,8  ;If no start bit detected
    brge  fault    ;within 130ms then exit

    sbic  PIND,INPUT  ;Wait for start bit
    rjmp  start1


    clr  timerL    ;Measure length of start bit

start2:    cpi  timerL,17  ;If startbit longer than 1.1ms,
    brge  fault    ;   exit

    sbis  PIND,INPUT
    rjmp  start2
          ;Positive edge of 1st start bit

    mov  temp,timerL  ;timer is 1/2 bit time
    clr  timerL

    mov  ref1,temp
    lsr  ref1
    mov  ref2,ref1
    add  ref1,temp  ;ref1 = 3/4 bit time
    lsl  temp
    add  ref2,temp  ;ref2 = 5/4 bit time


start3:    cp  timerL,ref1  ;If high periode St2 > 3/4 bit time
    brge  fault    ;   exit

    sbic  PIND,INPUT  ;Wait for falling edge start bit 2
    rjmp  start3

    clr  timerL
    ldi  bitcnt,12  ;Receive 12 bits
    clr  command
    clr  system


sample:    cp  timerL,ref1  ;Sample INPUT at 1/4 bit time
    brlo  sample

    sbic  PIND,INPUT
    rjmp  bit_is_a_1  ;Jump if line high


bit_is_a_0:  clc      ;Store a '0'
    rol  command
    rol  system

          ;Synchronize timing
bit_is_a_0a:  cp  timerL,ref2  ;If no edge within 3/4 bit time
    brge  fault    ;   exit
    sbis  PIND,INPUT  ;Wait for rising edge
    rjmp  bit_is_a_0a  ;in the middle of the bit

    clr  timerL
    rjmp  nextbit

bit_is_a_1:  sec      ;Store a '1'
    rol  command
    rol  system
          ;Synchronize timing
bit_is_a_1a:  cp  timerL,ref2  ;If no edge within 3/4 bit time
    brge  fault    ;   exit
    sbic  PIND,INPUT  ;Wait for falling edge
    rjmp  bit_is_a_1a  ;in the middle of the bit

    clr  timerL

nextbit:  dec  bitcnt    ;If bitcnt > 0
    brne  sample    ;   get next bit


;All bits sucessfully received!
    mov  temp,command  ;Place system bits in "system"
    rol  temp
    rol  system
    rol  temp
    rol  system

    bst  system,5  ;Move toggle bit
    bld  command,6  ;to "command"

          ;Clear remaining bits
    andi  command,0b01111111
    andi  system,0x1F

    ret

fault:    ser  command    ;Both "command" and "system"
    ser  system    ;0xFF indicates failure
    ret

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.