LED-Blinklicht mit ATS2313 mittels Timer

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 06 11 2024  06:56:45      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Autor
LED-Blinklicht mit ATS2313 mittels Timer
Suche nach: timer (2126)

    







BID = 365954

Alex86

Schreibmaschine


Avatar auf
fremdem Server !
Hochladen oder
per Mail an Admin

Beiträge: 1840
 

  


Hallo @all,

dank Jornbytes Hilfe, bin ich mit meinem LED-Blink-Programm mittels Timer weitergekommen.

Da normale, auf Bremsschleifen basierende Programme, die Prozessorzeit unnötig verschwenden ist es ratsamer die Blink-Routinen über den eingebauten Timer laufen zu lassen!

Im Folgenden hier Jornbytes Erklärung:


Zitat :


Also...
In den Register/Bit Definitions for the AT90S2313 finest du am Ende folgende Zeilen:

.equ INT0addr=$001 ;External Interrupt0 Vector Address
.equ INT1addr=$002 ;External Interrupt1 Vector Address
.equ ICP1addr=$003 ;Input Capture1 Interrupt Vector Address
.equ OC1addr =$004 ;Output Compare1 Interrupt Vector Address
.equ OVF1addr=$005 ;Overflow1 Interrupt Vector Address
.equ OVF0addr=$006 ;Overflow0 Interrupt Vector Address
.equ URXCaddr=$007 ;UART Receive Complete Interrupt Vector Address
.equ UDREaddr=$008 ;UART Data Register Empty Interrupt Vector Address
.equ UTXCaddr=$009 ;UART Transmit Complete Interrupt Vector Address
.equ ACIaddr =$00a ;Analog Comparator Interrupt Vector Address

Nu musste anstelle ".equ" ein "RETI ;" hinschreiben. Das Beispiel zeigt die 1 Zeile davon:

reti ; INT0addr=$001 ;External Interrupt0 Vector Address

Nun gibt es die Zeile :

.equ OVF0addr=$006 ;Overflow0 Interrupt Vector Address

Das ist der 8Bit Timer. Wenn die Zeit abgelaufen ist, löst er einen Interrupt aus. Da muss das Programm nun wissen wo es den Int abarbeiten muss. Da muss die Einsprungadresse eingetragen werden. Das geht mit einen sybolischen Namen, z.b. ledblink.
Beispiel:

ledblink ; OVF0addr=$006 ;Overflow0 Interrupt Vector Address

So, nun kommt der 8Bit timer. (Overflow1 Interrupt Vector Address ist der 16 Bit Timer)
Um den 8Bitter am laufen zu bekommen sind folgende ASM-Zeilen nötig:

;Register definieren

rjmp anfang
;Int- Tabelle (siehe oben) einfügen

anfang:
ldi r16,...
out ddrb, r16
;bla bla
;bla bla

;8Bit Timer
ldi temp, 0b00000101 ;Timer 0 auf CK 1024 einstellen
out TCCR0, temp
ldi temp, 61 ;Timer 0 auf 195 einstellen (50ms bei 4MHz)
out TCNT0, temp
ldi temp, 0b00000010 ;Timer 0 Interrupt initialisieren
out TIMSK, temp
sei ;Interrupts allgemein aktivieren
;bla bla

loop:
;bla bla
rjmp loop

ledblink:
;------------------------------------------------------------
;hier kommt der 8Bit Timer Int
;------------------------------------------------------------
; bla bla -> also die ausgabe der led-bliker
;wenn das alles fertig ist kommt

ldi temp, 61 ;Timer 0 auf 195 einstellen (50ms bei 4MHz)
out TCNT0, temp
reti
; ende asm

Das war schon alles. Für den 16 Bit Timer ist es fast das gleiche:
bei .equ OVF1addr=$005 ;Overflow1 Interrupt Vector Address dein einsprung eintragen (statt .equ -> ledblink)
An Stelle 8Bit Timer Int kommt:

ldi temp, 0x00 ;kein pwm und kein output-pin
out tccr1a, temp
ldi temp, 0b00000101 ;/1024
out tccr1b, temp
ldi temp, 240 ;Werte für 1 Sekunde verzögerung
out tcnt1h, temp
ldi temp, 190
out tcnt1l, temp
ldi temp, 0b10000000 ;Interrupt freigeben
out timsk, temp
sei ;Allgemeine Interruptfreigabe

Und am Ender der Int:

ldi temp, 240 ;Werte für 1 Sekunde verzögerung
out tcnt1h, temp
ldi temp, 190
out tcnt1l, temp
reti



Das Blink-Programm was ich daraus geschrieben habe ist hier gelistet:



Code :



; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************

.include "C:\VMLAB\include13def.inc"

; Define here the variables
;
.def temp =r16

; Hier ist mein Timer-Interrupt definiert
;
reset:
rjmp start
reti ; Addr
reti ; Addr
reti ; Addr
reti ; Addr
reti ; Addr
rjmp ledblink ; Addr Mein Timer-Interrupt
(Overflow0 Interrupt Adress)
der zu der Blink-Routine
verweist
reti ; Addr
reti ; Addr
reti ; Addr
reti ; Addr [1code]

; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************

.include "C:\VMLAB\include\2313def.inc"

; Define here the variables
;
.def temp =r16

; Hier ist mein Timer-Interrupt definiert
;
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
rjmp ledblink ; Addr $06 Mein Timer-Interrupt
(Overflow0 Interrupt Adress)
der zu der Blink-Routine
verweist
reti ; Addr $07
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B
reti ; Addr $0C
reti ; Addr $0D
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10

; Program starts here after Reset
;
start:
ldi R24, RAMEND ;Stackpointer initialisieren
out SPL, R24

ldi r18, 0xFF ; Wert um den Port später mit Exclusive Or
; zu "toggeln"
ldi r17, 0x00 ; Anfangs-Muster der LEDs

ldi temp, 0xFF ; Datenrichtungsregister von PORTB auf
; Ausgang setzen
out DDRB, r16

; 8-Bit-Timer
ldi temp, 0b0000101 ; Timer auf auf Clock-Teiler 1024 einstellen
out TCCR0, temp
ldi temp, 61 ; Timer 0 auf 195 einstellen (50ms bei
; 4 MHz)
out TCNT0, temp
ldi temp, 0b00000010 ; Timer 0 Interrupt initialisieren
out TIMSK, temp
sei ; Interrupts allgemein aktivieren

loop:
; Hier läuft normalerweise das Hauptprogramm
rjmp loop

; Das ist meine Interrupt-Routine die die LED blinken lässt
ledblink:
eor r17, r18 ; ein Exclusive OR mit
; r18=0b11111111 sorgt
; dafür, dass der
; Port-B "toggelt"
out PORTB, r17

; Hier wird der Timer wieder auf seinen "Countdown-Wert" gesetzt
ldi temp, 61 ; Timer 0 auf 195 einstellen
; (50 ms bei 4 Mhz)
out TCNT0, temp
reti ; das Ganze beginnt wieder von neuem

[/code1]A
reti ; Addr [1code]

; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************

.include "C:\VMLAB\include\2313def.inc"

; Define here the variables
;
.def temp =r16

; Hier ist mein Timer-Interrupt definiert
;
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
rjmp ledblink ; Addr $06 Mein Timer-Interrupt
(Overflow0 Interrupt Adress)
der zu der Blink-Routine
verweist
reti ; Addr $07
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B
reti ; Addr $0C
reti ; Addr $0D
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10

; Program starts here after Reset
;
start:
ldi R24, RAMEND ;Stackpointer initialisieren
out SPL, R24

ldi r18, 0xFF ; Wert um den Port später mit Exclusive Or
; zu "toggeln"
ldi r17, 0x00 ; Anfangs-Muster der LEDs

ldi temp, 0xFF ; Datenrichtungsregister von PORTB auf
; Ausgang setzen
out DDRB, r16

; 8-Bit-Timer
ldi temp, 0b0000101 ; Timer auf auf Clock-Teiler 1024 einstellen
out TCCR0, temp
ldi temp, 61 ; Timer 0 auf 195 einstellen (50ms bei
; 4 MHz)
out TCNT0, temp
ldi temp, 0b00000010 ; Timer 0 Interrupt initialisieren
out TIMSK, temp
sei ; Interrupts allgemein aktivieren

loop:
; Hier läuft normalerweise das Hauptprogramm
rjmp loop

; Das ist meine Interrupt-Routine die die LED blinken lässt
ledblink:
eor r17, r18 ; ein Exclusive OR mit
; r18=0b11111111 sorgt
; dafür, dass der
; Port-B "toggelt"
out PORTB, r17

; Hier wird der Timer wieder auf seinen "Countdown-Wert" gesetzt
ldi temp, 61 ; Timer 0 auf 195 einstellen
; (50 ms bei 4 Mhz)
out TCNT0, temp
reti ; das Ganze beginnt wieder von neuem

[/code1]B
reti ; Addr [1code]

; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************

.include "C:\VMLAB\include\2313def.inc"

; Define here the variables
;
.def temp =r16

; Hier ist mein Timer-Interrupt definiert
;
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
rjmp ledblink ; Addr $06 Mein Timer-Interrupt
(Overflow0 Interrupt Adress)
der zu der Blink-Routine
verweist
reti ; Addr $07
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B
reti ; Addr $0C
reti ; Addr $0D
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10

; Program starts here after Reset
;
start:
ldi R24, RAMEND ;Stackpointer initialisieren
out SPL, R24

ldi r18, 0xFF ; Wert um den Port später mit Exclusive Or
; zu "toggeln"
ldi r17, 0x00 ; Anfangs-Muster der LEDs

ldi temp, 0xFF ; Datenrichtungsregister von PORTB auf
; Ausgang setzen
out DDRB, r16

; 8-Bit-Timer
ldi temp, 0b0000101 ; Timer auf auf Clock-Teiler 1024 einstellen
out TCCR0, temp
ldi temp, 61 ; Timer 0 auf 195 einstellen (50ms bei
; 4 MHz)
out TCNT0, temp
ldi temp, 0b00000010 ; Timer 0 Interrupt initialisieren
out TIMSK, temp
sei ; Interrupts allgemein aktivieren

loop:
; Hier läuft normalerweise das Hauptprogramm
rjmp loop

; Das ist meine Interrupt-Routine die die LED blinken lässt
ledblink:
eor r17, r18 ; ein Exclusive OR mit
; r18=0b11111111 sorgt
; dafür, dass der
; Port-B "toggelt"
out PORTB, r17

; Hier wird der Timer wieder auf seinen "Countdown-Wert" gesetzt
ldi temp, 61 ; Timer 0 auf 195 einstellen
; (50 ms bei 4 Mhz)
out TCNT0, temp
reti ; das Ganze beginnt wieder von neuem

[/code1]C
reti ; Addr [1code]

; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************

.include "C:\VMLAB\include\2313def.inc"

; Define here the variables
;
.def temp =r16

; Hier ist mein Timer-Interrupt definiert
;
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
rjmp ledblink ; Addr $06 Mein Timer-Interrupt
(Overflow0 Interrupt Adress)
der zu der Blink-Routine
verweist
reti ; Addr $07
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B
reti ; Addr $0C
reti ; Addr $0D
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10

; Program starts here after Reset
;
start:
ldi R24, RAMEND ;Stackpointer initialisieren
out SPL, R24

ldi r18, 0xFF ; Wert um den Port später mit Exclusive Or
; zu "toggeln"
ldi r17, 0x00 ; Anfangs-Muster der LEDs

ldi temp, 0xFF ; Datenrichtungsregister von PORTB auf
; Ausgang setzen
out DDRB, r16

; 8-Bit-Timer
ldi temp, 0b0000101 ; Timer auf auf Clock-Teiler 1024 einstellen
out TCCR0, temp
ldi temp, 61 ; Timer 0 auf 195 einstellen (50ms bei
; 4 MHz)
out TCNT0, temp
ldi temp, 0b00000010 ; Timer 0 Interrupt initialisieren
out TIMSK, temp
sei ; Interrupts allgemein aktivieren

loop:
; Hier läuft normalerweise das Hauptprogramm
rjmp loop

; Das ist meine Interrupt-Routine die die LED blinken lässt
ledblink:
eor r17, r18 ; ein Exclusive OR mit
; r18=0b11111111 sorgt
; dafür, dass der
; Port-B "toggelt"
out PORTB, r17

; Hier wird der Timer wieder auf seinen "Countdown-Wert" gesetzt
ldi temp, 61 ; Timer 0 auf 195 einstellen
; (50 ms bei 4 Mhz)
out TCNT0, temp
reti ; das Ganze beginnt wieder von neuem

[/code1]D
reti ; Addr [1code]

; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************

.include "C:\VMLAB\include\2313def.inc"

; Define here the variables
;
.def temp =r16

; Hier ist mein Timer-Interrupt definiert
;
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
rjmp ledblink ; Addr $06 Mein Timer-Interrupt
(Overflow0 Interrupt Adress)
der zu der Blink-Routine
verweist
reti ; Addr $07
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B
reti ; Addr $0C
reti ; Addr $0D
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10

; Program starts here after Reset
;
start:
ldi R24, RAMEND ;Stackpointer initialisieren
out SPL, R24

ldi r18, 0xFF ; Wert um den Port später mit Exclusive Or
; zu "toggeln"
ldi r17, 0x00 ; Anfangs-Muster der LEDs

ldi temp, 0xFF ; Datenrichtungsregister von PORTB auf
; Ausgang setzen
out DDRB, r16

; 8-Bit-Timer
ldi temp, 0b0000101 ; Timer auf auf Clock-Teiler 1024 einstellen
out TCCR0, temp
ldi temp, 61 ; Timer 0 auf 195 einstellen (50ms bei
; 4 MHz)
out TCNT0, temp
ldi temp, 0b00000010 ; Timer 0 Interrupt initialisieren
out TIMSK, temp
sei ; Interrupts allgemein aktivieren

loop:
; Hier läuft normalerweise das Hauptprogramm
rjmp loop

; Das ist meine Interrupt-Routine die die LED blinken lässt
ledblink:
eor r17, r18 ; ein Exclusive OR mit
; r18=0b11111111 sorgt
; dafür, dass der
; Port-B "toggelt"
out PORTB, r17

; Hier wird der Timer wieder auf seinen "Countdown-Wert" gesetzt
ldi temp, 61 ; Timer 0 auf 195 einstellen
; (50 ms bei 4 Mhz)
out TCNT0, temp
reti ; das Ganze beginnt wieder von neuem

[/code1]E
reti ; Addr [1code]

; ******************************************************
; BASIC .ASM template file for AVR
; ******************************************************

.include "C:\VMLAB\include\2313def.inc"

; Define here the variables
;
.def temp =r16

; Hier ist mein Timer-Interrupt definiert
;
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
rjmp ledblink ; Addr $06 Mein Timer-Interrupt
(Overflow0 Interrupt Adress)
der zu der Blink-Routine
verweist
reti ; Addr $07
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B
reti ; Addr $0C
reti ; Addr $0D
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10

; Program starts here after Reset
;
start:
ldi R24, RAMEND ;Stackpointer initialisieren
out SPL, R24

ldi r18, 0xFF ; Wert um den Port später mit Exclusive Or
; zu "toggeln"
ldi r17, 0x00 ; Anfangs-Muster der LEDs

ldi temp, 0xFF ; Datenrichtungsregister von PORTB auf
; Ausgang setzen
out DDRB, r16

; 8-Bit-Timer
ldi temp, 0b0000101 ; Timer auf auf Clock-Teiler 1024 einstellen
out TCCR0, temp
ldi temp, 61 ; Timer 0 auf 195 einstellen (50ms bei
; 4 MHz)
out TCNT0, temp
ldi temp, 0b00000010 ; Timer 0 Interrupt initialisieren
out TIMSK, temp
sei ; Interrupts allgemein aktivieren

loop:
; Hier läuft normalerweise das Hauptprogramm
rjmp loop

; Das ist meine Interrupt-Routine die die LED blinken lässt
ledblink:
eor r17, r18 ; ein Exclusive OR mit
; r18=0b11111111 sorgt
; dafür, dass der
; Port-B "toggelt"
out PORTB, r17

; Hier wird der Timer wieder auf seinen "Countdown-Wert" gesetzt
ldi temp, 61 ; Timer 0 auf 195 einstellen
; (50 ms bei 4 Mhz)
out TCNT0, temp
reti ; das Ganze beginnt wieder von neuem

[/code1]F
reti ; Addr

; Program starts here after Reset
;
start:
ldi R24, RAMEND ;Stackpointer initialisieren
out SPL, R24

ldi r18, 0xFF ; Wert um den Port später mit Exclusive Or
; zu "toggeln"
ldi r17, 0x00 ; Anfangs-Muster der LEDs

ldi temp, 0xFF ; Datenrichtungsregister von PORTB auf
; Ausgang setzen
out DDRB, r16

; 8-Bit-Timer
ldi temp, 0b0000101 ; Timer auf auf Clock-Teiler 1024 einstellen
out TCCR0, temp
ldi temp, 61 ; Timer 0 auf 195 einstellen (50ms bei
; 4 MHz)
out TCNT0, temp
ldi temp, 0b00000010 ; Timer 0 Interrupt initialisieren
out TIMSK, temp
sei ; Interrupts allgemein aktivieren

loop:
; Hier läuft normalerweise das Hauptprogramm
rjmp loop

; Das ist meine Interrupt-Routine die die LED blinken lässt
ledblink:
eor r17, r18 ; ein Exclusive OR mit
; r18=0b11111111 sorgt
; dafür, dass der
; Port-B "toggelt"
out PORTB, r17

; Hier wird der Timer wieder auf seinen "Countdown-Wert" gesetzt
ldi temp, 61 ; Timer 0 auf 195 einstellen
; (50 ms bei 4 Mhz)
out TCNT0, temp
reti ; das Ganze beginnt wieder von neuem




Ich hoffe das kann vielleicht noch anderen helfen, die so etwas programmieren wollen.

LG Alex

_________________


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 24 Beiträge im Durchschnitt pro Tag       heute wurden bisher 2 Beiträge verfasst
© x sparkkelsputz        Besucher : 182289787   Heute : 610    Gestern : 4667    Online : 653        6.11.2024    6:56
0 Besucher in den letzten 60 Sekunden         ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0788900852203