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?

Mvg

heeft het ding geen hardware uart?? dan die gebruiken om 3 bytes eruit te jassen...

ken de avr's niet zo goed kan je niet verder helpen.

fripster

Weet niet hoe je dat in assembly doet, maar in C kun die byte's er in een for-loopje er zo uit jassen. Iedere keer zet je de LSB op een pin en schuif je steeds je byte 1 plaatsje op.
Heb je helemaal geen schuifregister nodig.

[Bericht gewijzigd door WilToyo op (11%)]

Op 2 februari 2009 21:46:21 schreef fripster:
heeft het ding geen hardware uart?? dan die gebruiken om 3 bytes eruit te jassen...

ken de avr's niet zo goed kan je niet verder helpen.

fripster

ik denk van niet :s

Heeft wel een USART. Zie datasheet.

een schuifregister in een ATmega8515? Van 24BIT?

Hoe heb je dat geprogrammeerd?

De ATmega8515 heeft zeker een USART, een TWI module en een SPI module. Hoe heb je je seriële data nodig? Asynchroon of synchroon? positieve flanken of negatieve?

Wat heeft dat IC nodig? welk IC is dat?

We hebben wat meer info nodig? Post uw programma eventueel.

Robin

De data moet synchroon worden doorgestuurd naar een LM3914.
Met positieve flanken
Ik weet wel niet hoe USART werkt


Dit is mijn programma:
;***************************************************************************
;* 				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)
	out TCCR1B,Dummy

; Hoogste waarde teller1instellen
	ldi 	Dummy2,$FF		
	ldi 	Dummy,$FE
	outw	OCR1AH,Dummy2,Dummy	; zet voor stop teller als teller>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

[Bericht gewijzigd door Henry S. op (3%)]

De data moet synchroon worden doorgestuurd naar een LM3914. Met positieve flanken

Ik ben het spoor nu helaas geheel kwijt.
De LM3914 is een analoge dot/bar driver. Wat heeft die met seriele communicatie te maken???

Ik weet wel niet hoe USART werkt

Daar heb je een datasheet voor staat precies in hoe de UART werkt. Compleet met voorbeelden voor zowel C als assembly.

En een LM3914 met seriele data aansturen? Hoe doe je dat, dat ding is z analoog als maar kan.

sorry, khad me van ic vergist. die gebruiken we ergens anders voor :s
maar het probleem is nu al opgelust
bedankt voor de hulp :)

[Bericht gewijzigd door Henry S. op (55%)]