Hallo zusammen,
dort ist dass Protokoll zu sehen, wenn die Taste A der Funk-Fernbedienung gedrückt wurde und wie es der vermeindliche CY800-Baustein dann am Data-Ausgang ausgibt.
Das 1te Bit lese ich nach 550µs ein und alle weiteren im Abstand von 1100µs.
Dort bitte auf die XYZ.jpg Datei klicken um den Screenshot zu sehen :
https://www.edv-dompteur.de/forum/in...=4113#post4113
Ich verstehe nicht warum die kontinuierlichen Abstände von 1100µs, Werte zwischen 1092µs und 1098µs annehmen, wenn doch jedes mal dass Gleiche passiert?
Nämlich aus dem IDLE-Mode per OC0A-IRQ geweckt werden, in die OC0A-ISR springen und danach wieder in den IDLE-Mode usw.
Hier mal der komplette Code. In der Header-Datei steht wie es funktioniert :
Header-Datei:
Hauptprogramm:Code:; ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ; Headerdatei ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ;Programm CY800_E.ASM ; ;Auswerten eines Funksteckdosen-Protokolls des Bausteins CY800. ; ;Für ATtiny13A mit internem RC-Oszillator 4,8MHz ( 14CK+64 ) ; ;FUSE-BITS High = $FF ; Low = $39 ; ;Am Pin 5 ( PCINT0 ) wird dass Signal des CY800 eingelesen ( Data ) ;Am Pin 6 ( INT0 ) ueber ein retriggerbares Monoflop das Einlesen vorbereitet. ; ;Der µC soll moeglichst stromsparend betrieben werden, deshalb wird er mit ver- ;schiedenen SLEEP-Modes und Systemtakten betrieben. Zu Beginn wird der µC in den ;SLEEP-Mode, PowerDown versetzt. ; ;Da der CY800 immer irgendwelche Signale ausgibt, wird hiermit ein retrigger- ;bares Monoflop ( 8,3ms ) beaufschlagt, was somit die meiste Zeit einen High- ;Pegel erzeugt. Im CY800-Protokoll kommt es nach dem Synchronisationsbit zu ;einer 8,5ms langen Low-Phase, wodurch dass MF nicht mehr nachgetriggert wird ;und es eine Level-Interupt an INT0 erzeugt. ;In dieser INT0-ISR wird nun, unter anderem, die PCINT0-IRQ intialisiert, um den ;Beginn des Datenpaketes zu erfassen. INT0-IRQ wird danach wieder abgeschaltet. ;In der PCINT0-ISR wird unter anderem der Timer/Counter0 Compare Match A IRQ ;initialisiert (OC0A), welcher durch den CTC-Mode erzeugt wird, wo der OC0A-Pin ;als normaler Portpin betrieben wird bzw. als PCINT0-Eingang. ;Hiernach wird ebenfalls der PCINT0-IRQ abgeschaltet. ;In der OC0A-ISR wird dann nach 550µs dass erste Bit eingelesen und alle wei- ;teren 23 Bits mit 1100µs Abstand. In der Mainloop werden die drei eingelesen ;Bytes mit denen im Flash abgelegten ( Tastencode ) verglichen und bei Ueber- ;einstimmung zum Test die LED-ge eingeschaltet ( High-Pegel ). ; ;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC ; Einbinden der Controllerspezifischen Definitionsdatei ;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC ; .NOLIST ;List-Output ausschalten ;.INCLUDE "tn13Adef.inc" ;AVR-Definitionsdatei einbinden .LIST ;List-Output wieder einschalten ; ;RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR ;RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR ; Arbeitsregister umbenennen ;RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR ;RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR ; .DEF byte_0 = r0 ;Byte0 vom CY800-Paket .DEF byte_1 = r1 ;Byte1 vom CY800-Paket .DEF byte_2 = r2 ;Byte2 vom CY800-Paket .DEF code = r3 ;Wird f. den Codevergleich benoetigt ;.DEF = r4 ; ;.DEF = r5 ; .DEF vergleichs_zlr = r6 ;Vergleichszaehler f. 3maligen Vergleich ;.DEF = r7 ; ;.DEF = r8 ; ;.DEF = r9 ; ;.DEF = r10 ; ;.DEF = r11 ; ;.DEF = r12 ; ;.DEF = r13 ; ;.DEF = r14 ; .DEF s_sreg = r15 ;Zum Sichern des Statusregisters ( Nur 1 Takt ) .DEF ia = r16 ;Interrupt Arbeitsregister ia ( Nur in ISR genutzt ) ;.DEF ib = r17 ;Interrupt Arbeitsregister ib ( Nur in ISR genutzt ) ;.DEF = r18 ; .DEF flag_reg = r19 ;Allgemeines Flaggen-Register .DEF bit_zlr = r20 ;CY800 Bitzaehler ;.DEF = r21 ; ;.DEF = r22 ; ;.DEF = r23 ; .DEF a = r24 ;Register 24 und 25 kann als universelles.. ;.DEF b = r25 ;..Doppelregister dienen ;.DEF xl = r26 ;Der X-Zeiger ;.DEF xh = r27 ;..adresse ;.DEF yl= r28 ; ;.DEF yh= r29 ; ;.DEF zl = r30 ;Verwendung als Z-Zeiger, also wie bereits in der.. ;.DEF zh = r31 ;..Definitionsdatei von ATMEL angegeben ; ;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK ;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK ; Konstanten als Symbole ;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK ;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK ; .EQU #bit_zlr = 24 ;Bitzaehler der empfangenen Bits .EQU #vergleichs_zlr = 3 ;Die 3 Bytes x mal vergleichen .EQU #ocr0a = 66 ;Fuer Timer0, CTC-Mode -> TOP-Wert > 58 .EQU #ocr0a_rest = 192 ;Fuer restlichen 23 Bits -> TOP-Wert > 58 ; ; ;Bitbezeichner fuer das allgemeine Flaggenregister flag_reg ; ;.equ = 0 ; ;.equ = 1 ; ;.equ = 2 ; .equ pdm = 3 ;Power-Down-Mode ist erwuenscht ;.equ = 4 ; .equ fertig = 5 ;CY800 Paket ( 24-Bits ) erfasst ;.equ = 6 ; ;.equ = 7 ; ;
Code:; .include "Header.inc" ;Label und Werte Zuweisungen .include "Hardware.inc" ;Hardware Label Zuweisungen ; ;Programmstart nach RESET ( Interrupt Vektoren Tabelle ) ; .CSEG ;Was ab hier folgt kommt in den FLASH-Speicher .ORG $0000 ;Programm beginnt an der FLASH-Adresse 0x0000.. rjmp _reset ;..mit der RESET-Vectortabelle .include "IRQt13.inc" ;Restliche Interrupt Vektortabelle .ORG INT_VECTORS_SIZE ;Programmadresse nach den ganzen IRQ-Vektoren ; ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ;I Erstinitialisierungen ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ; _reset: ; ;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 rcall _loeschen ;Anfangsbedingungen herstelllen ; ;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 ; ;Variablen initialisieren ( r0-r31 haben unbestimmten Inhalt ) ; clr flag_reg ;Allgemeines Flaggenregister; sei ;Alle programmierbaren Interrupts freigeben ; ;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 sbrc flag_reg,fertig ;CY800-Paket erfasst? rjmp _fertig ;..JA -> Paket vergleichen 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 ; ;Der Code stimmt nicht ; _gescheitert: 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 ############################# rcall _loeschen ;..Bytes sind ungleich, also alles von vorn rjmp _main ;Arbeitsschleife ausfuehren ; ;CY800-Paket vergleichen ; _fertig: lpm code,Z+ ;Code-Byte2 laden und Zeiger inkrementieren.. cp code,byte_2 ;..beide Bytes vergleichen.. brne _gescheitert ;Der Code stimmt nicht -> springen lpm code,Z+ ;Code-Byte1 laden und Zeiger inkrementieren.. cp code,byte_1 ;..beide Bytes vergleichen.. brne _gescheitert ;Der Code stimmt nicht -> springen lpm code,Z ;Code-Byte0 laden.. cp code,byte_0 ;..beide Bytes vergleichen.. brne _gescheitert ;Der Code stimmt nicht -> springen ;tst vergleichs_zlr ;3 maliger Vergleichen der 3 Bytes positiv? breq _umschalten ;JA -> Ausgang Umschalten dec vergleichs_zlr ;Vergleichszaehler dekrementieren rcall _loeschen ;Neubeginn einrichten rjmp _main ;Arbeitsschleife ausfuehren ; ;Ausgang Umschalten ; _umschalten: sbi LED_PORT,led.pla ;LED-PLA einschalten T E S T Z W E C K E ############################# rcall _loeschen ;Neubeginn einrichten rjmp _main ;Arbeitsschleife ausfuehren ; ;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ;U Beginn der verwendeten Unterprogramme ;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ; .include "UP.inc";Unterprogramme ; ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ;Q Beginn der verwendeten Interrupt Service Routinen ( ISR ) ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ; .include "ISR.inc" ;Interrupt Service Routinen ; ;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK ;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK ;K Beginn der Programmkonstanten ;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK ;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK ; _code: .DB $C3,$50,$43,00 ;3 Codebytes f. Taste A ( Byte2,Byte1,Byte0 ) ;.DB $FC,$00,$00,00 ;3 Codebytes f. T E S T ( Byte2,Byte1,Byte0 ) .EXIT ;Ende des Quelltextes
Hardware:
Code:; ;******************************************************************************* ;* Hardware Zuweisungen ;******************************************************************************* ; ;.EQU XTAL = 1843200 ;Quarzfrequenz in Hertz .EQU LED_PIN = PINB ;Eingabeport an dem die LED angeschlossen ist .EQU LED_DDR = DDRB ;Datenrichtungsregister fuer die LED .EQU LED_PORT = PORTB ;Ausgabeport fuer die Programmlaufanzeige-LED .EQU cy800.data = PB0 ;Pin Dataausgang vom CY800 .EQU led.ge = PB2 ;Pin an dem die LED-Gelb angeschlossen ist .EQU led.ora = PB3 ;Pin an dem die LED-Orange angeschlossen ist .EQU led.pla = PB4 ;Pin wo die LED-ProgrammLaufAnzeige dran ist .EQU CY800_PIN = PINB ;CY800 Eingabeport .EQU PIN_PLA = PINB ;Eingabeport wo die LED-ProgrammLaufAnzeige ist
IRQt13 ( Interrupt Vektortabelle ):
UP's ( Unterprogramme ):Code:; ;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV ; Interruptvektortabelle des ATtiny13 Mikrocontrollers ;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV ; ; ***** INTERRUPT VECTORS ************************************************ rjmp _INT0addr ; External Interrupt 0 rjmp _PCI0addr ; External Interrupt Request 0 reti ;rjmp _OVF0addr ; Timer/Counter0 Overflow reti ;rjmp _ERDYaddr ; EEPROM Ready reti ;rjmp _ACIaddr ; Analog Comparator rjmp _OC0Aaddr ; Timer/Counter Compare Match A reti ;rjmp _OC0Baddr ; Timer/Counter Compare Match B reti ;rjmp _WDTaddr ; Watchdog Time-out reti ;rjmp _ADCCaddr ; ADC Conversion Complete
ISR ( Interrupt Service Programme ):Code:; ;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ;U Beginn der verwendeten Unterprogramme ;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ; _loeschen: ; ;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 ; ;Die drei Bytes loeschen ; clr byte_2 ;Die 3.. clr byte_1 ;..Bytes.. clr byte_0 ;..loeschen ; ;Bitzaehler einstellen ; ldi a,#bit_zlr ;Wert f. Bitzaehler laden.. mov bit_zlr,a ;..und Bitzaehler einstellen ; ;Vergleichszaehler einstellen ; ldi a,#vergleichs_zlr ;..Vergleichszaehler.. mov vergleichs_zlr,a ;..laden ; ;Codeadresse fuer Taste A laden ; ldi zh,high(_code*2) ;Z-Zeiger mit Vergleichscode-Adresse.. ldi zl,low (_code*2) ;..laden ; ;Job-FLAGS bearbeiten ; cbr flag_reg,1<<fertig ;CY800 Paket erfasst FLAG loeschen sbr flag_reg,1<<pdm ;Power-Down-Mode FLAG setzen ; ;INT0 Low-Level-interrupt initialisieren ; cli ;Global Interrupts sperren ldi a,1<<INTF0 ;External Interrupt Flag 0 im.. out GIFR,a ;General Interrupt Flag Register loeschen in a,GIMSK ;General Interrupt Mask Register laden.. sbr a,1<<INT0 ;..und External Interrupt Request 0 freigeben.. out GIMSK,a ;..zurueckschreiben sei ;Globale Interruptfreigabe ; ;OCR0A fuer dass 1te Bit einstellen ; ldi ia,#ocr0a ;Wert f. Timer0 CTC-Mode Compare Match A laden und.. out OCR0A,ia ;..ins Output Compare0 Match A Register schreiben ret ;UP_loeschen verlassen
Code:; ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ;Q Beginn der verwendeten Interrupt Service Routinen ( ISR ) ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ; ; ;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 ; ;Pin Change Interrupt 0 -> PCI0 initialisieren ; in ia,PCMSK ;Pin Change Mask Register laden und.. sbr ia,1<<PCINT0 ;..Pin Change Interrupt 0 auswaehlen out PCMSK,ia ;..und Register ueberschreiben in ia,GIMSK ;General Interrupt Masken Register laden und.. sbr ia,1<<PCIE ;..Pin Change Interruput 0 Freigabebit setzen.. out GIMSK,ia ;..INT0 Interrupt freigeben und.. ldi ia,1<<PCIF ;..Pin Change Interrupt Flag.. out GIFR,ia ;..loeschen ; ;INT0 Interrupt sperren ; in ia,GIMSK ;General Interrupt Mask Register laden.. cbr ia,1<<INT0 ;..INT0 Interrupt sperren vorbereiten und.. out GIMSK,ia ;..ausfuehren.. ; ;Systemtakt ( 4,8MHz ) durch 16 teilen ( 300kHz = 3,333µs ) ; ldi a,1<<CLKPCE ;Im Clock Prescaler Register Bit.. out CLKPR,a ;..Clock Prescaler Change Enable setzen.. ldi a,1<<CLKPS2 ;..Sicherheitsprozedur nun mit CLKPCE=0 und out CLKPR,a ;..CLKPS[3:0] SYS-Takt aendern, abschliessen _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 ; ;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 ; ;Timer0 ruecksetzen ; clr ia out TCNT0,ia ; ;Timer/Counter0 im Waveform Generation Mode 2 -> CTC betreiben ;und Compare Match A interrupt initialisieren ; in ia,TIMSK0 ;Timer/Counter0 Masken Register laden und.. sbr ia,1<<OCIE0A ;..T/C0 Output Compare Match A Interrupt enabeln.. out TIMSK0,ia ;..und dies zurueckschreiben ldi ia,1<<OCF0A ;Output Compare Flag 0 A.. out TIFR0,ia ;..im T/C0 Interrupt Flag Register loeschen in ia,TCCR0A ;Timer/Counter0 Control Register A laden.. sbr ia,1<<WGM01 ;..Waveform Generations Mode 2 ( CTC ) einstellen.. out TCCR0A,ia ;..und in ia,TCCR0B ;Timer/Counter0 Control Register B laden.. sbr ia,1<<CS00 ;..Timer0 mit 1:1 Teiler einstellen.. out TCCR0B,ia ;..und starten ; ;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 ;..INT0 Interrupt freigeben und.. cbr flag_reg,1<<pdm ;Power-Down-Mode sperren _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 ; ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ; Timer/Counter0 Compare Match A ISR ( Interrupt Service Routine ) ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ ; _OC0Aaddr: 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 _pla ;Alle 24 Bits erfasst? NEIN -> springen.. ; ;Timer/Counter0 Compare Match A Interrupt sperren ; _bits_erfasst: in ia,TIMSK0 ;Timer/Counter0 Mask Register laden und.. cbr ia,1<<OCIE0A ;..T/C0 Output Compare Match A Interrupt.. out TIMSK0,ia ;...sperren ; ;CY800-Paket fertig FLAG setzen ( Vergleich in _main: veranlassen ) ; sbr flag_reg,1<<fertig ;CY800-Paket ( 24-Bits ) erfasst _pla: ; ;Wert fuer den Timer0 CTC-Mode Compare Match speichern ( restlichen 23 Bits ) ; ldi ia,#ocr0a_rest ;Wert f. Timer0 CTC-Mode Compare Match A laden und.. out OCR0A,ia ;..ins Output Compare0 Match A Register schreiben ; ;Timer0 ruecksetzen ; clr ia out TCNT0,ia _exit_OC0Aaddr: out SREG,s_sreg ;Statusregister restaurieren reti ;_OC0Aaddr ISR verlassen
Bernd_Stein
Lesezeichen