Forum: Mikrocontroller und Digitale Elektronik asm interrupt usart adc


von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

jo hallo leutz, ich bins nochmal....

also das prog soll über eine eingabe eines bytes ein bit eines ports 
ändern,.. dann wenn das start byte kommt den adc starten und diesen per 
rs 232 an einen rechner schicken... kommt ein stopp byte soll dieser 
aufhöhren,...

soweit so gut,...
>prob 1:
starten ist kein problem bloß aufhöhren will er nicht,..
>prob 2:
und wenn ich das stopbyte (ascii->015=SI) bloß so sende macht der gar 
nÜx mehr...

>code:
>;############################################################
>;here including origins .org
.org 0x00
    jmp reset

.org URXCaddr        ;Interruptvektor für UART-Empfang
    jmp int_RXD

>;############################################################
reset:


    ldi get,0x00
    ldi send,0x00

>;##########################################################
>       ;PortC für ausgabe initialisieren
  ldi temp, 0xFF       ;0xFF ins Arbeitsregister r16 laden
        out DDRC, temp       ;Inhalt von r16 ins IO-Register DDRC 
ausgeben
        ldi poc, 0b00001000 ;0b00000001 in r16 laden (c4 -> all is gnd)
  out PORTC, poc      ;r16 ins IO-Register PORTC ausgeben
        ;PortB für Asugabe initialisieren
  ldi temp, 0xFF       ;0xFF ins Arbeitsregister r16 laden
        out DDRB, temp       ;Inhalt von r16 ins IO-Register DDRC 
ausgeben
        ldi pob, 0b00000000 ;0b00000000 in r16 laden (port c
  out PORTB, pob      ;r16 ins IO-Register PORTC ausgeben


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

  call USART_init

>       ;Messbereich 0-5V, Kanal 0pos - 2neg differnential
  ldi temp, 0b01011000

  out ADMUX, temp
  ldi temp, 0b10000111  ;ADC an, CLK=8MHz/128
  out ADCSRA, temp
>       ;Interrupts global aktivieren
        sei
        rcall info


>;###################################################################### ######
wait:
rjmp wait


main:
   sei
>        ;(CUR cursor rechts-> also eins weiter , der nächste messwert
         ldi send,CUR
         rcall sendbyte


ADC_START:
         clr temp
         ;Wandlung starten
         sbi ADCSR,ADSC

warte_bis_feddich_gemessen:
    sbis ADCSR,ADIF
    rjmp warte_bis_feddich_gemessen

    in zl, ADCL  ;Die unteren 8 Bit in r17 merken
    in zh, ADCH  ;Die oberen 2 Bit in r18 merken

    push temp
    mov temp,zl
    rcall hex2bcd

                mov send,r23
    rcall sendbyte
    mov send,r22
    rcall sendbyte
    mov send,temp
    rcall sendbyte
                ldi send, 32   ; die Bytes 10 und 13 senden
                rcall sendbyte

               ldi send, LF     ; die Bytes 10 und 13 senden
               rcall sendbyte   ; (Zeilenumbruch im Terminal)
               ldi send, CR
               rcall sendbyte
               pop temp

         rjmp main

>;###################################################################### ######
>; Interruptroutine wird ausgeführt wenn ein Byte über UART empfangen wurde
int_RXD:

    in get,UDR
    cpi get,0
    brne PC + 2
                rjmp end_int_rxd


                cpi get,SI ;(ende der aufzeichnung)
    brne PC + 2
    rjmp wait

    cpi get,255 ;(Grundstellung)
    brne PC + 2
    rjmp reset

    lc_modus 1,0b00000001
    lc_modus 2,0b00000010
    lc_modus 3,0b00000100
    lc_modus 4,0b00001000
    lc_modus 5,0b00010000
    lc_modus 6,0b00100000
    lc_modus 7,0b01000000
    lc_modus 8,0b10000000

    lc_conf 9, 0b00000001
    lc_conf 10,0b00000010
    lc_conf 11,0b00000100
    lc_conf 12,0b00001000

    cpi get,SO ;(Umschaltung (op call) ->run)
    brne PC + 2
    rjmp run



                ldi send,CAN
    rcall sendbyte

                rjmp end_int_rxd
>;###################################################################### 
###########


run:
ldi send,'k'
rcall sendbyte
ldi send,ACK
rcall sendbyte
jmp main

>;###################################################################### 
###########


ich weiß leider nicht mehr weiter,...
schon mal vielen dank
mfg

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

also zu prob2:


>###########################################
wait:
sei
rjmp wait
....

cpi get,SI ;(ende der aufzeichnung)
brne PC + 3
cli
rjmp wait
>###########################################

also
cli
sei

dann läufts...

aber mit prob1 komm ich net weiter....

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.