PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu 2313 und Timer



Scotch
28.04.2005, 00:09
Hallo @ all,

ich bin gerade dabei mir Assembler an Hand eines kleinen 2313 Board
bei zu bringen. Auf der Platine sind Schalter und LED's und ein 4 Mhz Quarz.

Die Led's mit schalter ein und auschalten bekomme ich auch schon hin.
Auch einfache Blinklichter mit Zählschleifen klapt schon.
Jetzt möchte ich es aber etwas aufwendiger haben.
z.b. PortB Pin1 soll eine Led für 0,4 sec. an und dann wieder für 0,4 sec. aus
gehen. Gleichzeitig soll an PortB Pin2 für 0,1 sec. an und dann für 0,5 sec.
aus gehen.
Ich denke das ich das dann mit dem Timer machen muß, aber wie?

Cu Scotch

HPM
28.04.2005, 06:33
Hi Scotch,

bei Assembler kann ich dir da nicht sehr helfen da ich mit Bascom programmiere!

Evtl. hilft dir das Stück Code aus einer Lauflichtsteuerung was
!!! Keine Gewähr, ob es funzt!!! Ist nicht von mir!
Mußt Dir halt die Passagen raus suchen mit den Timern.
Dürfte aber kein Problem sein.



;Beginn des Programmcodes

reset: ldi r16,low(RAMEND)
out SPL,r16

ldi r16,0x00
out TCCR1A,r16 ;Timer 1 disconnect OC1 + PWM
ldi r16,0x03
out TCCR1B,r16 ;Timer 1 prescaling 1/64
ldi r16,T1Lval
out TCNT1L,r16 ;Timer low value
ldi r16,T1Hval
out TCNT1H,r16 ;Timer high value
ldi r16,0x80
out TIMSK,r16 ;Timer1 overflow enabled
sei ;Enable global Interrupts

ldi result,$ff ;Port B -> output
out DDRB,result
out DDRD,result ;Port D -> output

Startprog:

sei ;Enable global Interrupts
;Auswahl ob High oder Low geschoben wird
ldi Anzeige,$0 ;LED on (Low)
sec ;set Carry (H wird durch die Ports geschoben)
; ldi Anzeige,$ff ;LED off (High)
; clc ;clear Carry (L wird durch die Ports geschoben)

loop: out PORTB,Anzeige
out PORTD,Anzeige
rjmp loop ;Timing durch Interrupts

Scotch
28.04.2005, 19:52
Danke für deine Antwort.

Leider kann ich denn Code nicht testen da er unvollständig ist.
Es werden Registernamen verwendet die aber nicht definirt werden.
Ich habe mal versucht das umzuschreiben bekomme es aber nicht zum
laufen.
evtl kannst du mir den kompletten Code zukommen lassen.

Cu Scotch

HPM
29.04.2005, 06:46
Hi Scotch,

hier der komplette Code.
Da ich mich nicht mit Assebler beschäftige kann ich Dir bei der Lösung aber nicht weiter helfen! Ich hoffe, der Autor des Progs. hat nichts dagegen, dass ich den Code hier reinstelle ?? :-s



;************************************************* *****************************
; Verwendete Hardware:
; AVR Testboard Board mit 90S2313 Prozessor
;
; Erstellt: Dezember 2001, Klaus Leidinger
;
; Programm zum Testen der AVR Board Hardware.
; Lauflicht an beiden Ports. Achtung: PortD.7 gibt es nicht ;-)
;
; Das Timing erfolgt über Interrupts.
;
;************************************************* *****************************

.include "2313def.inc" ;Festlegen des verwendeten Chips

.def Anzeige=r19
.def temp1=r18
.def result=r16
.def temp=r17

;Werte für 0,5 sec Timer bei 4MHZ Quarz
;.equ T1Lval=0xee
;.equ T1Hval=0x85
;Werte für 0,5 sec Timer bei 8MHZ Quarz
.equ T1Lval=0xdc
.equ T1Hval=0x0b

; Start des Programmcodes
.cseg

.org $0000
rjmp reset ;Reset extern oder Watchdog
.org $0001
reti ;rjmp INT0_int ;Externer Interrupt INT0
.org $0002
reti ;rjmp INT1_int ;Externer Interrupt INT1
.org $0003
reti ;rjmp Timer1_capt ;Timer 1 capture Mode
.org $0004
reti ;rjmp Timer1_comp ;Timer 1 compare Mode
.org $0005
rjmp Timer1_over ;Timer 1 overflow
.org $0006
reti ;rjmp Timer0_over ;Timer 0 overflow
.org $0007
reti ;rjmp UART_rxc ;Serial RX complete Handler
.org $0008
reti ;rjmp UART_dre ;Serial UDR empty Handler
.org $0009
reti ;rjmp UART_txc ;Serial TX complete Handler
.org $000A
reti ;rjmp ANA_comp ;Analog comperator

.db "Testprogramm für Microcontroller Board AVR 90S2313 Version 1.0"


;Beginn des Programmcodes

reset: ldi r16,low(RAMEND)
out SPL,r16

ldi r16,0x00
out TCCR1A,r16 ;Timer 1 disconnect OC1 + PWM
ldi r16,0x03
out TCCR1B,r16 ;Timer 1 prescaling 1/64
ldi r16,T1Lval
out TCNT1L,r16 ;Timer low value
ldi r16,T1Hval
out TCNT1H,r16 ;Timer high value
ldi r16,0x80
out TIMSK,r16 ;Timer1 overflow enabled
sei ;Enable global Interrupts

ldi result,$ff ;Port B -> output
out DDRB,result
out DDRD,result ;Port D -> output

Startprog:

sei ;Enable global Interrupts
;Auswahl ob High oder Low geschoben wird
ldi Anzeige,$0 ;LED on (Low)
sec ;set Carry (H wird durch die Ports geschoben)
; ldi Anzeige,$ff ;LED off (High)
; clc ;clear Carry (L wird durch die Ports geschoben)

loop: out PORTB,Anzeige
out PORTD,Anzeige
rjmp loop ;Timing durch Interrupts



;Beginn der Unterprogramme und Interruptroutinen

Timer1_over: ;Interrupt 500ms
rol Anzeige ;Zählerstand
ldi r16,T1Lval ;Timer reload
out TCNT1L,r16 ;Timer low value
ldi r16,T1Hval
out TCNT1H,r16 ;Timer high value
reti

.EXIT ;letzte Zeile des Programmes

Scotch
29.04.2005, 16:43
Jo das sieht schon viel besser aus.
komme aber erst am So. Abend zum testen.
werde mich dann noch mal melden.

Vielen Dank erst mal.

Cu Scotch