Hallo LotadaC,
durch Dich rutsche ich immer mehr in die Programmtiefe hinein.
Meinen Dank für Deine ausführliche Doku.
Zur Zeit von Bascom habe ich mich garnicht um das Register SREG gekümmert,
ja da wußte ich nicht mal, daß es sowas giebt.
Nun steht das Programm für den Kran und ich muß es noch testen.
Denke nicht gleich "er hört ja doch nicht auf mich"!
Eine große Hilfe wäre es für mich, wenn Du mir ein stückel Quellcode über Deine Idee
rüber schieben könntest. (Z.B. Warteschlange o. ISR)
Nun sagt nicht das Programm wäre nicht übersichtlich durch die vielen RCALL......
durch Dich rutsche ich immer mehr in die Programmtiefe hinein.
Meinen Dank für Deine ausführliche Doku.
Zur Zeit von Bascom habe ich mich garnicht um das Register SREG gekümmert,
ja da wußte ich nicht mal, daß es sowas giebt.
Nun steht das Programm für den Kran und ich muß es noch testen.
Denke nicht gleich "er hört ja doch nicht auf mich"!
Eine große Hilfe wäre es für mich, wenn Du mir ein stückel Quellcode über Deine Idee
rüber schieben könntest. (Z.B. Warteschlange o. ISR)
Nun sagt nicht das Programm wäre nicht übersichtlich durch die vielen RCALL......
Code:
; Projekt-Name: Projekt01 Datum: 22.09.2012
; Datei: KRAN01.asm
; Hardware-Inputs:
; PD2,Pin6 = Endlinks über J1/16
; PD3,Pin7 = Endrechts über J1/17
; PD4,Pin8 = Taste Start über J1/14
; PD5,Pin9 = Lichtschranke über J1/15
; PA2,Pin1 = Reset
; Hardare-Outputs:
; PB0,Pin12 = Aufbegin/Auflast über J2/2
; PB1,Pin13 = Abwaerts über J2/3
; PB2,Pin14 = Linkslauf über J2/4
; PB3,Pin15 = Rechtslauf über J2/5
; PB4,Pin16 = Magnet EIN/AUS über J2/6
; PB5,Pin17 = LED (leuchtet nach Start)
; AVR: Tiny2313-20PU
.INCLUDE "tn2313def.inc"
rjmp reset ; Reseteinsprung
.ORG OVF0addr ; Interrupt-Vektor
rjmp TIMER0_OVF ; Sprung zur ISR
reset:
.def accu0 = r16
.def accu1 = r17
ldi accu0,0xFF ; 0b1111.1111
out DDRB,accu0 ; Datenricht. PB0-PB7=Output
clr accu0 ; alle Bits = LOW
out DDRD,accu0 ; Datenricht. PD0 - PD6=Input
ldi accu0, 0xFF ; 0b111.1111
out PORTD,accu0 ; PD0 bis PD6=Pullup
; Timer0 initialisieren:
ldi accu0,(1<<CS02)|(1<<CS00) ; Prescale = 1024
out TCCR0B,accu0
ldi accu0,1<<TOIE0 ; Timer Overflow Interrupt einrichten
out TIMSK,accu0
sei ; Timer frei
loop:
sbi PORTB,5 ; LED = AUS
Start: ; drücke Taste Start
sbic PIND,PD4 ;überspringe,wenn PD4=LOW
rjmp Start
rcall Aufbegin ; d1=EIN / AUS
rcall zeit2
rcall Linkslauf ; d3=EIN / AUS
rcall zeit2
rcall Abwaerts ; d2=EIN / AUS
rcall zeit2
rcall Magnetein ; d5=EIN
rcall zeit2
rcall Auflast ; d1=EIN / AUS
rcall zeit2
rcall Rechtslauf ; d4=EIN / AUS
rcall zeit2
rcall Ablegen ; d2=EIN / AUS
rcall zeit2
rcall Magnetaus ; d5=AUS
rcall zeit2
rcall Endlage ; d1+d3=EIN / AUS
rjmp loop
Aufbegin:
cbi PORTB,5 ; LED = EIN
sbi PORTB,0 ; d1 = EIN
rcall zeit8 ; Zeit ca. 8Sec.
cbi PORTB,0 ; d1 = AUS
ret
Linkslauf:
sbi PORTB,2 ; d3 = EIN
gehelinks:
sbic PIND,PD2 ; überspringe, wenn Endlinks=0
rjmp gehelinks
cbi PORTB,2 ; d3 = AUS
ret
Abwaerts:
sbi PORTB,1 ; d2 = EIN
geheabw:
sbic PIND,PD5 ; überspringe, wenn Lichtschr.=0
rjmp geheabw
cbi PORTB,1 ; d2 = AUS
ret
Magnetein:
sbi PORTB,4 ; d5 = EIN
ret
Auflast:
sbi PORTB,0 ; d1 = EIN
rcall zeit8 ; Zeit ca. 8Sec.
cbi PORTB,0 ; d1 = AUS
ret
Rechtslauf:
sbi PORTB,3 ; d4 = EIN
geherechts:
sbic PIND,PD3 ; überspringe, wenn Endrechts=0
rjmp geherechts
cbi PORTB,3 ; d4 = AUS
ret
Ablegen:
sbi PORTB,1 ; d2 = EIN
rcall zeit8 ; Zeit ca. 8Sec.
cbi PORTB,1 ; d2 = AUS
ret
Magnetaus:
cbi PORTB,4 ; d5 = AUS
ret
Endlage:
sbi PORTB,0 ; d1 = EIN (Aufwaerts)
sbi PORTB,2 ; d3 = EIN (Linkslauf)
rcall zeit4
cbi PORTB,0 ; d1 = AUS
cbi PORTB,2 ; d3 = AUS
ret
;Zeitvorgaben
zeit2:
ldi accu1,0x06 ;0b0000.0110
pause2:
tst accu1 ;teste r17 auf Low
brne pause2
ret
zeit4:
ldi accu1,0x1A ;0b0001.1010
pause4:
tst accu1 ;teste r17 auf Low
brne pause4
ret
zeit8:
ldi accu1,0x24 ;0b0010.0100
pause8:
tst accu1 ;teste r17 auf Low
brne pause8
ret
;Interrupt-ISR
TIMER0_OVF:push r2 ;Kopie r2 auf den Stack, danach SP-1
in r2,SREG ;Inhalt vom Statusregister in r2 laden
dec accu1 ;ISR Abarbeitung (dec r17)
out SREG,r2 ;Inhalt von r2 ins SREG laden
pop r2 ;SP+1, danach vom Stack in r2 laden
reti