Lieber Besucher, herzlich willkommen bei: EDV-Dompteur/Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
; ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ;I Erstinitialisierungen ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ; _reset: ; ;Systemtakt ( 4,8MHz ) durch 8 teilen ( 600kHz = 1,666µs ) ; ldi a,1<<CLKPCE ;Im Clock Prescaler Register Bit.. out CLKPR,a ;..Clock Prescaler Change Enable setzen.. ldi a,1<<CLKPS1|1<<CLKPS0 ;..und CLKPS[3:0] loeschen (Sicherheitsprozedur).. out CLKPR,a ;..nun mit CLKPCE=0 und CLKPS[3:0] SYS-Takt aendern ; ;Stapelzeiger initialisieren (fuer Unterprogramme und / oder Interrupts) ; ;ldi a,High(RAMEND) ;RAMEND, also das Ende vom SRAM, ist in der.. ;out SPH,a ;..Definitions-datei festgelegt ldi a,Low (RAMEND) ;Hier reicht ein Byte, weil das... out SPL,a ;...SRAM nur 64Byte gross ist ; ;Variablen initialisieren ( r0-r31 haben unbestimmten Inhalt ) ; clr flag_reg ;Allgemeines Flaggenregister loeschen ; ;Die drei Bytes des CY800-Protokolls loeschen ; clr byte_2 ;Die 3.. clr byte_1 ;..Bytes.. clr byte_0 ;..loeschen ; ;Bitzaehler auf 24 Bits einstellen ; ldi bit_zlr,#bit_zlr ;Wert f. Bitzaehler laden.. ; ;Codeadresse fuer Taste A laden ; ldi zh,high(_code*2) ;Z-Zeiger mit Vergleichscode-Adresse.. ldi zl,low (_code*2) ;..laden ; ;Vergleichszaehler f. 3x hintereinander gueltigen Code ; ldi a,#vergleichs_zlr ;..Vergleichszaehler.. mov vergleichs_zlr,a ;..laden ; ;Sleep-Mode -> Power Down gewuenscht ; sbr flag_reg,1<<pdm ;Power-Down-Mode FLAG setzen ; ;Ports Erstkonfiguration ; sbi DDRB,led.pla ;PORT-Bit als Ausgang f. PLA-LED sbi DDRB,led.ora ;PORT-Bit als Ausgang f. SLEEP-LED sbi DDRB,led.ge ;PORT-Bit als Ausgang f. TEST-LED sbi LED_PORT,led.ora ;LED-Orange ausschalten ; ;PCINT0-IRQ einrichten ; in a,PCMSK ;Pin Change Mask Register laden.. sbr a,1<<PCINT0 ;..den Pin Change Enable Mask 1.. out PCMSK,a ;..auswaehlen in a,GIMSK ;General Interrupt Mask Register laden.. sbr a,1<<PCIE ;..Pin Change Interrupt Enable Bit setzen.. out GIMSK,a ;..und somit den PCI1-IRQigeben ldi a,1<<PCIF ;Pin Change Interrupt Flag im.. out GIFR,a ;..General Interrupt Flag Register laden loeschen sei ;Alle programmierbaren Interrupts freigeben |
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
; ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ;H Hauptprogrammschleife ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ; _main: ; ;SLEEP-Mode ausschalten und auf Werkseinstellung setzen ; in a,MCUCR ;MCU Control Register laden und.. cbr a,1<<SE|1<<SM1|1<<SM0 ;..auf Werkseinstellung.. out MCUCR,a ;..setzen ; ;Pruefen welcher Sleep-Mode drann ist ; sbrs flag_reg,pdm ;Power-Down-Mode erwuenscht? rjmp _idle ;Nein -> µC in IDLE-Mode versetzen ; ;SLEEP-MODE -> Power Down ; ;cbi PORTB,led.ora ;LED-Orange einschalten T E S T Z W E C K E ########################### ;sbi PORTB,led.ora ;LED-Orange ausschalten T E S T Z W E C K E ########################### ;cbi PORTB,led.ora ;LED-Orange einschalten T E S T Z W E C K E ########################### in a,MCUCR ;MCU Control Register laden.. sbr a,1<<SE|1<<SM1 ;..Power-Down-Mode und Sleep Enable vorbereiten.. out MCUCR,a ;..und freigeben sleep ;µC in den Schlaf-Modus versetzen rjmp _main ;Arbeitsschleife ausfuehren ; ;SLEEP-MODE -> IDLE ; _idle: ;sbi PORTB,led.ora ;LED Orange ausschalten T E S T Z W E C K E ########################### ;cbi PORTB,led.ora ;LED-Orange einschalten T E S T Z W E C K E ########################### ;sbi PORTB,led.ora ;LED-Orange ausschalten T E S T Z W E C K E ########################### in a,MCUCR ;MCU Control Register laden(IDLE ist vorgegeben).. sbr a,1<<SE ;..Sleep Enable vorbereiten.. out MCUCR,a ;..und freigeben sleep rjmp _main ;Arbeitsschleife ausfuehren |
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
; ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ; PIN CHANGE INTERRUPT 0 ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ; _PCI0addr: ;sbi LED_PORT,led.ge ;LED-Gelb einschalten T E S T Z W E C K E ############################# ;cbi LED_PORT,led.ge ;LED-Gelb ausschalten T E S T Z W E C K E ############################# ;sbi LED_PORT,led.ge ;LED-Gelb einschalten T E S T Z W E C K E ############################# ;cbi LED_PORT,led.ge ;LED-Gelb ausschalten T E S T Z W E C K E ############################# in s_sreg,SREG ;CPU-Statusregister sichern ; ;PCINT0 Interrupt sperren ; in ia,GIMSK ;General Interrupt Masken Register laden und.. cbr ia,1<<PCIE ;..Pin Change Interruput 0 Freigabebit loeschen.. out GIMSK,ia ;..und somit die PCI0-IRQ sperren ; ;Power-Down-Mode sperren ; cbr flag_reg,1<<pdm ;Power-Down-Mode FLAG loeschen ; ;INT0 Interrupt auf steigende Flanke einstellen ; in ia,MCUCR ;MCU Control Register laden.. sbr ia,1<<ISC01|1<<ISC00 ;..die steigende Flanke einstellen und dies.. out MCUCR,ia ;..nun uebernehmen, nun dass.. in ia,GIMSK ;..General Interrupt Mask Register laden, dort.. sbr ia,1<<INT0 ;..dass External Interrupt Request 0 Enable bit.. out GIMSK,ia ;..setzen und somit den INT0-IRQ freigeben.. ldi ia,1<<INTF0 ;..Nun dass External Interrupt Flag 0 Bit.. out GIFR,ia ;..im General Interrupt Flag Register loeschen ; ;Systemtakt ( 4,8MHz ) durch 16 teilen ( 300kHz = 3,333µs ) ; ldi ia,1<<CLKPCE ;Im Clock Prescaler Register Bit.. out CLKPR,ia ;..Clock Prescaler Change Enable setzen.. ldi ia,1<<CLKPS2 ;..Sicherheitsprozedur nun mit CLKPCE=0 und out CLKPR,ia ;..CLKPS[3:0] SYS-Takt aendern, abschliessen ; ;Timer/Counter0 Zaehlregister fuer die Biterfassung einstellen ; ldi ia,$FF-#top ;Wert f. TOV0-IRQ ( Normal- Mode ).. out TCNT0,ia ;..ins Timer/Counter0 Zaehlregister laden _exit_PCI0addr: out SREG,s_sreg ;Statusregister restaurieren ;sbi LED_PORT,led.ge ;LED-Gelb einschalten T E S T Z W E C K E ############################# ;cbi LED_PORT,led.ge ;LED-Gelb ausschalten T E S T Z W E C K E ############################# ;sbi LED_PORT,led.ge ;LED-Gelb einschalten T E S T Z W E C K E ############################# ;cbi LED_PORT,led.ge ;LED-Gelb ausschalten T E S T Z W E C K E ############################# reti ;_PCI0addr ISR verlassen |
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
; ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ; INTERRUPT REQUEST 0 INT0 ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ; _INT0addr: ;sbi LED_PORT,led.ge ;LED-Gelb einschalten T E S T Z W E C K E ############################# ;cbi LED_PORT,led.ge ;LED-Gelb ausschalten T E S T Z W E C K E ############################# in s_sreg,SREG ;CPU-Statusregister sichern ; ;INT0 Interrupt sperren ; in ia,GIMSK ;General Interrupt Mask Register laden.. cbr ia,1<<INT0 ;..INT0 Interrupt sperren vorbereiten und.. out GIMSK,ia ;..ausfuehren.. ; ;Timer/Counter0 Overflow Interrupt ( TOV0-IRQ ) einrichten ; in ia,TIMSK0 ;Timer/Counter0 Interrupt Mask Register laden und.. sbr ia,1<<TOIE0 ;..Timer/Counter0 Overflow Interrupt Enable setzen.. out TIMSK0,ia ;..somit den TOV0-IRQ ermoeglichen ldi ia,1<<TOV0 ;Nun dass Timer/Counter0 Overflow Flag im.. out TIFR0,ia ;..Timer/Counter0 Interrupt Flag Register loeschen.. in ia,TCCR0B ;..dass Timer/Counter0 Control Register B laden.. sbr ia,1<<CS00 ;..Clock Select = 1:1 einstellen.. out TCCR0B,ia ;..und den T/C0 gleichzeitig starten _exit_INT0addr: out SREG,s_sreg ;Statusregister restaurieren ;sbi LED_PORT,led.ge ;LED-Gelb einschalten T E S T Z W E C K E ############################# ;cbi LED_PORT,led.ge ;LED-Gelb ausschalten T E S T Z W E C K E ############################# reti ;_INT0addr ISR verlassen |
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
;670 im Windows Editor ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ; Timer0 Overflow ISR ( Interrupt Service Routine ) ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ; _OVF0addr: in s_sreg,SREG ;CPU-Statusregister sichern ;sbi LED_PORT,led.pla ;LED-PLA einschalten T E S T Z W E C K E ############################## ;cbi LED_PORT,led.pla ;LED-PLA ausschalten T E S T Z W E C K E ############################## ; ;CY800-Bits erfassen ; sec ;High-Bit vorgeben sbis CY800_PIN,cy800.data ;CY800 Signalpin = 1 ?.. clc ;..Nein -> Bit = 0 setzen ; ;Bits zusammenfassen ; rol byte_0 ;Carry-Bit und weitere Bits links rotieren.. rol byte_1 ;Carry-Bit und weitere Bits links rotieren rol byte_2 ;Carry-Bit und weitere Bits links rotieren.. dec bit_zlr ;Bitzaehler um eins verringern brne _next_bit ;Alle 24 Bits erfasst? NEIN -> springen.. ; ;INT0 Interrupt auf steigende Flanke einstellen ; _next_bit: in ia,MCUCR ;MCU Control Register laden.. sbr ia,1<<ISC01|1<<ISC00 ;..die steigende Flanke einstellen und dies.. out MCUCR,ia ;..nun uebernehmen, nun dass.. in ia,GIMSK ;..General Interrupt Mask Register laden, dort.. sbr ia,1<<INT0 ;..dass External Interrupt Request 0 Enable bit.. out GIMSK,ia ;..setzen und somit den INT0-IRQ freigeben.. ldi ia,1<<INTF0 ;..Nun dass External Interrupt Flag 0 Bit.. out GIFR,ia ;..im General Interrupt Flag Register loeschen rjmp _timer_stopp ; ; ;Timer/Counter0 stoppen. ; _timer_stopp: in ia,TCCR0B ;..dass Timer/Counter0 Control Register B laden.. cbr ia,1<<CS02|1<<CS01|1<<CS00;..Clock Select = T/C0 stopp einstellen.. out TCCR0B,ia ;..und nun den T/C0 stoppen ; ;Timer/Counter0 Zaehlregister fuer die Biterfassung einstellen ; ldi ia,$FF-#top ;Wert f. TOV0-IRQ ( Normal- Mode ).. out TCNT0,ia ;..ins Timer/Counter0 Zaehlregister laden ; ;Timer/Counter0 Overflow ISR verlassen ; _exit_OVF0addr: ;Timer0 Overflow ISR verlassen out SREG,s_sreg ;Statusregister restaurieren reti ;_OVF0addr ISR verlassen |
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
brne _next_bit ;Alle 24 Bits erfasst? NEIN -> springen.. ; ;Bitzaehler auf 24 Bits einstellen ; ldi bit_zlr,#bit_zlr ;Wert f. Bitzaehler laden.. ; ;CY800-Paket vergleichen ; lpm code,Z+ ;Code-Byte2 laden und Zeiger inkrementieren.. cp code,byte_2 ;..beide Bytes vergleichen.. brne _ungueltig ;Der Code stimmt nicht -> springen lpm code,Z+ ;Code-Byte1 laden und Zeiger inkrementieren.. cp code,byte_1 ;..beide Bytes vergleichen.. brne _ungueltig ;Der Code stimmt nicht -> springen lpm code,Z ;Code-Byte0 laden.. cp code,byte_0 ;..beide Bytes vergleichen.. brne _ungueltig ;Der Code stimmt nicht -> springen ; ;Pausenzeit laden ; ldi ia,#pausenzeit mov pausenzeit,ia ; ;Pruefen ob alle 3 Bytes, 3 mal direkt hintereinander gleich waren ;bzw. der Vergleichszaehler 0 ist ; tst vergleichs_zlr ;3x positiver Vergleich?.. breq _neues_paket ;..JA -> Auf ein neues Paket vorbereiten ; ;Vergleichszaehler dekrementieren ; dec vergleichs_zlr breq _umschalten ;Code akzeptiert -> Ausgang toggeln rjmp _neues_paket ;Auf ein neues Paket vorbereiten ; ;Ausgang Umschalten ; _umschalten: sbi LED_PIN,led.ora ;LED-Orange toggeln T E S T Z W E C K E ############################# rjmp _neues_paket ;Auf ein neues Paket vorbereiten |
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
;650,460 ;CY800-Paket vergleichen ; lpm code,Z+ ;Code-Byte2 laden und Zeiger inkrementieren.. cp code,byte_2 ;..beide Bytes vergleichen.. brne _ungueltig ;Der Code stimmt nicht -> springen lpm code,Z+ ;Code-Byte1 laden und Zeiger inkrementieren.. cp code,byte_1 ;..beide Bytes vergleichen.. brne _ungueltig ;Der Code stimmt nicht -> springen lpm code,Z ;Code-Byte0 laden.. cp code,byte_0 ;..beide Bytes vergleichen.. brne _ungueltig ;Der Code stimmt nicht -> springen ; ;Das Paket passt nicht zum Code ; _ungueltig: ;cbi LED_PORT,led.pla ;LED-PLA ausschalten T E S T Z W E C K E ############################# ;sbi LED_PORT,led.pla ;LED-PLA einschalten T E S T Z W E C K E ############################# ;cbi LED_PORT,led.pla ;LED-PLA ausschalten T E S T Z W E C K E ############################# ;sbi LED_PORT,led.pla ;LED-PLA einschalten T E S T Z W E C K E ############################# ;cbi LED_PORT,led.pla ;LED-PLA ausschalten T E S T Z W E C K E ############################# ;sbi LED_PORT,led.pla ;LED-PLA einschalten T E S T Z W E C K E ############################# ;cbi LED_PORT,led.pla ;LED-PLA ausschalten T E S T Z W E C K E ############################# ; ;Pruefen ob alle 3 Bytes 3 mal direkt hintereinander gleich waren ;bzw. der Vergleichszaehler 0 ist ; tst vergleichs_zlr ;3x positiver Vergleich?.. breq _pausenzeit ;..JA -> Pausenzeit -1 ; ;Vergleichszaehler laden f. Erkennung dass der Code 3x hintereinander ;OK war ; _vgz_laden: ldi ia,#vergleichs_zlr ;..Vergleichszaehler.. mov vergleichs_zlr,ia ;..laden ; ;Alles fuer die Erfassung eines neuen CY800-Paketes veranlassen ; _neues_paket: |
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
;670,610 ;Alles fuer die Erfassung eines neuen CY800-Paketes veranlassen ; _neues_paket: ; ;Variablen initialisieren ; clr byte_2 ;Die 3.. clr byte_1 ;..Bytes.. clr byte_0 ;..loeschen ; ;Codeadresse fuer Taste A laden ; ldi zh,high(_code*2) ;Z-Zeiger mit Vergleichscode-Adresse.. ldi zl,low (_code*2) ;..laden ; ;Sleep-Mode -> Power Down vorgeben ; sbr flag_reg,1<<pdm ;Power-Down-Mode FLAG setzen ; ;Systemtakt ( 4,8MHz ) durch 8 teilen ( 600kHz = 1,666µs ) ; ldi ia,1<<CLKPCE ;Im Clock Prescaler Register Bit.. out CLKPR,ia ;..Clock Prescaler Change Enable setzen.. ldi ia,1<<CLKPS1|1<<CLKPS0;..und CLKPS[3:0] loeschen (Sicherheitsprozedur).. out CLKPR,ia ;..nun mit CLKPCE=0 und CLKPS[3:0] SYS-Takt aendern ; ;PCINT0-IRQ einrichten ; in ia,PCMSK ;Pin Change Mask Register laden.. sbr ia,1<<PCINT0 ;..den Pin Change Enable Mask 1.. out PCMSK,ia ;..auswaehlen in ia,GIMSK ;General Interrupt Mask Register laden.. sbr ia,1<<PCIE ;..Pin Change Interrupt Enable Bit setzen.. out GIMSK,ia ;..und somit den PCI1-IRQigeben ldi ia,1<<PCIF ;Pin Change Interrupt Flag im.. out GIFR,ia ;..General Interrupt Flag Register laden loeschen ; ;Timer/Counter0 stoppen. ; _timer_stopp: in ia,TCCR0B ;..dass Timer/Counter0 Control Register B laden.. cbr ia,1<<CS02|1<<CS01|1<<CS00;..Clock Select = T/C0 stopp einstellen.. out TCCR0B,ia ;..und nun den T/C0 stoppen ; ;Timer/Counter0 Zaehlregister fuer die Biterfassung einstellen ; ldi ia,$FF-#top ;Wert f. TOV0-IRQ ( Normal- Mode ).. out TCNT0,ia ;..ins Timer/Counter0 Zaehlregister laden ; ;Timer/Counter0 Overflow ISR verlassen ; _exit_OVF0addr: ;Timer0 Overflow ISR verlassen out SREG,s_sreg ;Statusregister restaurieren reti ;_OVF0addr ISR verlassen |
Forensoftware: Burning Board® 3.1.7, entwickelt von WoltLab® GmbH