Serieel naar buiten brengen data

Wie bang is om te vragen schaamt zich om te leren.
Plaats reactie
Pieterrr
Berichten: 3
Lid geworden op: wo 4 feb 2009, 11:03

Serieel naar buiten brengen data

Bericht door Pieterrr »

Ik heb een 24 bits schuifregister gemaakt met de AT mega 8515 in assembler.
Nu moet ik deze data nog serieel naar buiten brengen, en zo doorsturen naar een IC die via die data 24 voedingen aanschakeld.
Maar ik weet niet hoe ik van het schuifregister naar serieële data ga.
Heeft er iemand suggesties?
De data moet synchroon worden doorgestuurd naar een LM3914.
Met positieve flanken

Mvg



Dit is mijn programma tot nu toe:
;***************************************************************************
;* 24 bit loopled zonder simulatietester
;***************************************************************************

;***************************************************************************
;*
;* uitgangen op poort A:
;* 0 led 0
;* 1 led 1
;* 2 led 2
;* 3 led 3
;* 4 led 4
;* 5 led 5
;* 6 led 6
;* 7 led 7
;*
;* uitgangen op poort B:
;* 0 led 8
;* 1 led 9
;* 2 led 10
;* 3 led 11
;* 4 led 12
;* 5 led 13
;* 6 led 14
;* 7 led 15
;*
;* uitgangen op poort C:
;* 0 led 16
;* 1 led 17
;* 2 led 18
;* 3 led 19
;* 4 led 20
;* 5 led 21
;* 6 led 22
;* 7 led 23
;*
;* uitgangen op poort D:
;* 0 rode led opstartmodus
;*
;***************************************************************************

;***************************************************************************
;*
;* ATMEGA8515 16PU
;*
;* Fuses :
;* Brown-out detection op VCC = 4.0V
;* Int. RC Osc. 8 MHz; Start-up time: 6 CK + 64 ms
;*
;***************************************************************************

.include "m8515def.inc"

; 16 bit access Macros (see Application Note AVR072)
.macro outw
;cli ; see (Note 1)
out @0,@1
out @0-1,@2
;sei ; see (Note 1)
.endmacro

.macro inw
;cli ; see (Note 1)
in @1,@2-1
in @0,@2
;sei ; see (Note 1)
.endmacro

; definiëer registers
.def cnt1 =r16 ; doorschuifvlag
.def Output =r17 ; Uitgang hulpregister
.def Dummy =r18 ; Dummy voor tijdelijk gebruik
.def Dummy2 =r19 ; Dummy voor tijdelijk gebruik
.def CaptL =r22 ; CaptureL register
.def CaptH =r23 ; CapteretH register
.def CountL =r24 ; CountL register
.def CountH =r25 ; CountH register

; Interrupt Vector Table
.cseg
.org 0x00 ; Reset-Address
rjmp reset
.org INT0addr ; External Interrupt Request 0
reti
.org INT1addr ; External Interrupt Request 1
reti
.org ICP1addr ; Timer/Counter1 Capture Event
rjmp TIM1_CAPT
.org OC1Aaddr ; Timer/Counter1 Compare Match A
rjmp TIM1_OC1A
.org OC1Baddr ; Timer/Counter1 Compare Match B
reti
.org OVF1addr ; Timer/Counter1 Overflow
reti
.org SPIaddr ; SPI Serial Transfer Complete
reti
.org URXCaddr ; UART, Rx Complete
reti
.org UDREaddr ; UART Data Register Empty
reti
.org UTXCaddr ; UART, Tx Complete
reti
.org ACIaddr ; Analog Comparator
reti
.org INT2addr ; External Interrupt Request 2
reti
.org OC0addr ; Timer 0 Compare Match
reti
.org ERDYaddr ; EEPROM Ready
reti
.org SPMRaddr ; Store Program Memory Ready
reti

; Interrupt Vector Table End



; Teller1 stoppen
TIM1_OC1A:
cli

in Dummy,SREG ; Save statusregister
push Dummy

; Input Capture Noise Canceler aan op neergaande flank
; en timer clock = CS11 en CS10 =0 dus stop
ldi Dummy,1<<ICNC1
out TCCR1B,Dummy

; Aanpassen Capture register aan stilstand
ser CaptL ; FF laden
ser CaptH ; FF laden

pop Dummy
out SREG,Dummy ; Restore statusregister

reti
; teller stoppen einde

; Ophalen van de tellerstand Teller1

TIM1_CAPT:
cli

in Dummy,SREG ; Save statusregister
push Dummy

inw CaptH,CaptL,ICR1H ; Tellerstand van bij neergaande flank ophalen

; Teller1 op 0 zetten
clr Dummy
out TCNT1H,Dummy ; Write Dummy register
out TCNT1L,Dummy ; Clear Teller

; Her-Start Timer1
; Input Capture Noise Canceler aan op neergaande flank
; en timer clock = system clock/64
ldi Dummy,(1<<ICNC1)|(1<<CS11)|(1<<CS10)
out TCCR1B,Dummy

; Timer/Counter1: Capture Event en CompareA Match Interrupt actief
ldi Dummy,(1<<TICIE1)|(1<<OCIE1A)
out TIMSK,Dummy

pop Dummy
out SREG,Dummy ; Restore statusregister

reti
; Ophalen van de tellerstand einde


; *** Begin of Program Execution ***

Reset:

; Initialization of the Stack Pointer
ldi Dummy,low(RAMEND)
out SPL,Dummy
ldi Dummy,high(RAMEND)
out SPH,Dummy

; Init I/O

ser CaptL ; FF laden
ser CaptH ; FF laden
ser CountL ; FF laden
ser CountH ; FF laden

ldi Dummy,$FF
out DDRA,Dummy ; PORT C is 8 outputs = Stuurwaarde
out DDRB,Dummy
out DDRC,Dummy
out DDRD,Dummy
ldi Dummy,$10


clr Dummy ; 00 laden
com Dummy
out PORTA,Dummy ; alles uit om te beginnen
out PORTB,Dummy
out PORTC,Dummy
out PORTD,Dummy
com Dummy

; Init loopteller van teller1
clr cnt1 ; 00 laden

; timer clock = system clock/8
ldi Dummy,1<<CS01
out TCCR0,Dummy

; Init interrupts
ldi Dummy,1<<TOV0
out TIFR,Dummy ; Clear ICF1/clear pending interrupts

; Timer/Counter0 Overflow interrupt actief
ldi Dummy,1<<TOIE0
out TIMSK,Dummy

; ************ start hoofdprogramma *****************
sei ; Global Interrupts enabled
loop:
ldi dummy,$1
com dummy
out PORTD,dummy ; rode led opstartmodus aanschakelen

ldi output,1 ; beginnen met bit 0

nogniet:
com Output ; Led's in omgekeerde logica op STK500 !!!!
out PORTA,output ; update Port C
com Output ; Led's in omgekeerde logica op STK500 !!!!

; doorschuiven
cpi cnt1,40 ; doorschuiven na 3 seconden
brne nogniet
ldi cnt1,0 ; terug op 0 zetten
cpi output,$FF
breq loop1
sec
rol output ; doorschuiven
rjmp nogniet

; Init Timer1
; Start Timer1
; Input Capture Noise Canceler aan op neergaande flank
; en timer clock = system clock/64
ldi Dummy,(1<<ICNC1)|(1<<CS11)|(1<<CS10>OCR1A = $FFFF

; Init interrupts
ldi Dummy,1<<ICF1
out TIFR,Dummy ; Clear ICF1/clear pending interrupts

; Timer/Counter1: Capture Event en CompareA Match Interrupt actief
ldi Dummy,(1<<TICIE1)|(1<<OCIE1A)
out TIMSK,Dummy
rjmp loop

; poort B
loop1:
ldi output,1 ; beginnen met bit 0


nogniet2:
com Output ; Led's in omgekeerde logica op STK500 !!!!
out PORTB,output ; update Port C
com Output ; Led's in omgekeerde logica op STK500 !!!!

; doorschuiven ?
cpi cnt1,40 ; doorschuiven na 3 seconden ?
brne nogniet2
ldi cnt1,0 ; terug op 0 zetten
cpi output,$FF
breq loop2
sec
rol output ; doorschuiven !
rjmp nogniet2

; poort C
loop2:
ldi output,1 ; beginnen met bit 0


nogniet3:
com Output ; Led's in omgekeerde logica op STK500 !!!!
out PORTC,output ; update Port B
com Output ; Led's in omgekeerde logica op STK500 !!!!

; doorschuiven ?
cpi cnt1,40 ; doorschuiven na 3 seconden ?
brne nogniet3
ldi cnt1,0 ; terug op 0 zetten
cpi output,$FF
breq opnieuw_beginnen
sec
rol output ; doorschuiven !
rjmp nogniet3

opnieuw_beginnen:
ldi Dummy,$0
com dummy
out PORTA,Dummy ; PORT C is 8 outputs = Stuurwaarde
out PORTB,Dummy
out PORTC,Dummy
rjmp loop
Plaats reactie