- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: ATtiny13A: Wo kommt der eine Takt her?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von Bernd_Stein Beitrag anzeigen
    Da hat man mal einen kompetenten Schreiber der sich der Sache annimmt,...
    Kompetent? Na ja, ich bin auch nur Hobbyist und versuche in diesem Fall aus dem Datenblatt klug zu werden.

    Meines Wissens her, ist bei einem Latch im transparenten Teil, der Eingang gleich dem Ausgang ( D = Q ). Das Latch ist in der High-Phase des Systemtaktes transparent, also ab der steigenden Flanke bis zur fallenden Flanke des Systemtaktes.

    Höchstwahrscheinlich ist dies wieder nur ein Prinzipschaltbild und dass PINxn-Register speichert mit der steigenden Flanke immer nur den gespreicherten Zustand des Latches und nicht den im transparenten Moment, oder es ist grundsätzlich so, dass ein Latch nicht so schnell vom Latch-Zustand in den Transparenten umschaltet wie ich es jetzt annehme.
    Ich glaube, so langsam komme ich dahinter was Du meinst:
    - Die positive Systemtaktflanke leitet die transparente Phase des ersten Synchronizerlatches ein
    - Eine positive Systemtaktflanke übernimmt aber auch den Ausgang des ersten Synchronizerlatches in das PIN-Flip-Flop.

    Es könnte also sein, daß der Eingang mit positiver Systemtaktflanke transparent durch das Latch zum Eingang des PIN-Flip-Flop geht und auch gleich mit der gleichen positiven Systemtaktflanke übernommen wird.?


    Ich meine nein. Das Pin-Flip-Flop ist dem Schaltzeichen nach taktflankengesteuert, kann also nur während der Taktflanke auf den Eingang reagieren. Das Latch hat mit Sicherheit ein Propagation Delay (Laufzeit) in der der Eingang zum Ausgang durchgeschaltet wird. Hier behaupte ich jetzt, daß das länger ist als eine Taktflanke dauert. Auch wenn das Latch mit positiver Systemtaktflanke transparent wird, kann es nicht rechtzeitig den Eingang zum Ausgang durchschalten, so daß der Ausgang mit gleicher positiver Systemtakflanke auch gleich ins PIN-Flip-Flop übernommen wird. Ich versuche das jetzt nicht zu belegen, sondern verlasse mich da auf das Datenblatt Figure 10-3. Sozusagen Erklärung nach Datenblatt passend gemacht, aber für mich plausibel. Man könnte jetzt gängige D-Latch/Flip-Flop (taktzustandsgsteuerte/ taktflankengesteuerte) Datenblätter suchen und Laufzeiten und Flankenzeiten durchsehen - das überlasse ich Dir

    Ich glaube also auch, daß immer nur der gespeicherte Zustand ins PIN-Flip-Flop übernommen wird und kein transparent durchgereichter.

    Dass man ein Latch nimmt und nicht ein zweites D-FF mit negiertem Takteingang, muss irgend etwas damit zu tun haben, dass man versucht kurze Pegelwechsel auszublenden, wir aber nur ein Prinzipschaltbild zu sehen bekommen, wo dies nicht ersichtlich ist.
    Da kann ich nichts zu sagen. Ich glaube jedoch nicht, daß man kurze Pegelwechsel von der µC Seite her versucht auszublenden.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Wenn ich auch mal eine andere Ansicht einbringen darf, würde ich sagen, das Latch übernimmt den Zustand an seinem Eingang und gibt ihn direkt an den Ausgang weiter. Ändert sich der Zustand am Eingang wieder, kommt irgendwann die steigende oder fallende Flanke, wo das Latch wieder die Information übernimmt. Die Information bleibt erhalten, selbst wenn sie am Eingang nicht mehr vorhanden ist. Mehr würde ich da nicht vermuten.

    MfG

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo Moppi,
    ich beziehe mich auf Figure "10-2. General Digital I/O" aus dem ATtiny13A Datenblatt. Der Synchronizer dort besteht aus zwei D-Flip-Flops. Das erste, an dem der Portpin der D-Eingang ist, ist ein taktzustandsgesteuertes. Nenn ich kurz Latch. Das zweite ist ein taktflankengesteuertes und nenne ich hier PIN-Flip-Flop. Das ist dann auch das PIN-Register für einen Portpin. Dessen D-Eingang ist der Ausgang des Latches.

    Zitat Zitat von Moppi Beitrag anzeigen
    ... das Latch übernimmt den Zustand an seinem Eingang und gibt ihn direkt an den Ausgang weiter.
    Aber nur wenn der Systemtakt "high" ist. Wenn Systemtakt low, dann ist das Latch nicht transparent.

    Ändert sich der Zustand am Eingang wieder, kommt irgendwann die steigende oder fallende Flanke, wo das Latch wieder die Information übernimmt.
    Welches Latch? Das erste im Sychronizer ist taktzustandsgesteuert. Das zweite, auch PIN-Flip-Flop übernimmt nur bei steigender Flanke.

    Die Information bleibt erhalten, selbst wenn sie am Eingang nicht mehr vorhanden ist. Mehr würde ich da nicht vermuten.
    Wenn die Information nicht bei einer fallenden Systemtakt Flanke am Eingand des ersten Latches anliegt, geht sie verloren, bzw wird ein falscher gepeichert. Wie oben schon mal erwähnt, meine ich, daß ein Signal, um es sicher zu erkennen, mindestens ein Systemtakt lang anliegen muß. Sie bleibt dann einen halben Systemtakt lang im Latch gespeichert. Hier kann das Signal sich am Portpin ändern ohne Auswirkung auf die Weitergabe zum PIN-Flip-Flop. Nach dem halben Systemtakt wird der gespeicherte Zustand vom PIN-Flip-Flop mit einer positiven Systemtaktflanke übernommen.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von Bernd_Stein
    Registriert seit
    19.09.2008
    Ort
    Deutschland : Nordrhein-Westfalen ( NRW )
    Alter
    53
    Beiträge
    407
    Zitat Zitat von Searcher Beitrag anzeigen
    ...
    Ich glaube, so langsam komme ich dahinter was Du meinst:
    - Die positive Systemtaktflanke leitet die transparente Phase des ersten Synchronizerlatches ein
    - Eine positive Systemtaktflanke übernimmt aber auch den Ausgang des ersten Synchronizerlatches in das PIN-Flip-Flop.
    ...

    Gruß
    Searcher
    Schön,

    ich denke es liegt auch ein wenig daran, dass meine Screenshots hier eher wie Piktogramme erscheinen.



    Deshalb habe ich hier mal versucht meine Überlegungen zum Best-Case-Fall deutlich zu machen und würde mich freuen deine Sichtweise hierzu zu erfahren :

    https://www.edv-dompteur.de/forum/in...=4004#post4004


    Bernd_Stein
    CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von Bernd_Stein Beitrag anzeigen
    ich denke es liegt auch ein wenig daran, dass meine Screenshots hier eher wie Piktogramme erscheinen.
    Deshalb habe ich hier mal versucht meine Überlegungen zum Best-Case-Fall deutlich zu machen und würde mich freuen deine Sichtweise hierzu zu erfahren :
    Ich denke, daß man hier auch alles deutlich darstellen kann, was nötig ist. Vielleicht nicht so komfortabel und mit einiger Formatiererei von Bildern verbunden. Aber es geht. Ich mag auch nicht forenübergreifend referenzieren.

    Zum best case ist es nötig, daß das Signal, also das high an PB1 zu einem Zeitpunkt gerade vor einer fallenden Flanke des Systemtaktes angelegt wird. Dann wird es gelatcht (gespeichert). Das SBIS aus dem Assembler code muß dann zu Beginn der unmittelbar folgenden steigenden Systemtaktflanke beginnen. Dann ist auch das Signal in das PINxn übernommen worden (nach Fig. 10.3) und kann von SBIS gültig abgefragt werden. SBIS führt einen SKIP über den RJMP durch und schaltet die LED ein.

    0,5T von fallender Falnke des Latches und speichern
    2T vom SBIS (mit SKIP)
    2T vom SBI zum LED einschalten.

    Also 4,5 Systemtakttakte sehe ich als best case.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von Bernd_Stein
    Registriert seit
    19.09.2008
    Ort
    Deutschland : Nordrhein-Westfalen ( NRW )
    Alter
    53
    Beiträge
    407
    Zitat Zitat von Searcher Beitrag anzeigen
    ...
    Also 4,5 Systemtakttakte sehe ich als best case.

    Gruß
    Searcher
    Oh, ja stimmt. Was habe ich wieder für ein Quatsch gedacht. Das zeichne ich konkret den Codeablauf Takt für Takt auf und interpretiere es dann doch falsch.

    @avr_racer
    Das war erstmal eine zu geballte Informationsflut, die ich mir einmal durchgelesen habe. Du scheinst ja mächtig viel in AVR8ASM zu programmieren, was ja schon mal gut ist. Das DB zu zitieren ist schon mal nicht schlecht, aber mit dem Verstehen des englischen hapert es leider bei mir. Werde evtl. irgendwann später auf dein Post eingehen, jetzt will ich aber auch mal weiterkommen.


    Bernd_Stein
    Geändert von Bernd_Stein (16.04.2020 um 10:22 Uhr) Grund: Jetzt erst gesehen, dass noch Jemand geantwortet hat.
    CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

  7. #7
    Erfahrener Benutzer Roboter-Spezialist Avatar von Bernd_Stein
    Registriert seit
    19.09.2008
    Ort
    Deutschland : Nordrhein-Westfalen ( NRW )
    Alter
    53
    Beiträge
    407

    ATtiny13A: Funksteckdosen-Protokoll auswerten ( CY800 -> HESUNSE )

    @avr_racer und alle anderen Interessierten natürlich !
    Da fällt mir heute ein um weiter zu kommen ist es vielleicht doch hilfreich mal komplett zu erklären was ich vor habe.
    Damit sind evtl. auch schon viele Fragen beantwortet.

    In der Header-Datei steht was ich vor habe. Derzeitiges Problem ist, dass das erste Bit zu spät eingelesen wird.

    Header.inc -> Header-Datei
    Code:
    ;
    ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
    ; Headerdatei
    ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
    ;Programm CY800_E.ASM
    ;
    ;Auswerten eines Funksteckdosen-Protokolls des Bausteins CY800.
    ;
    ;Für ATtiny13A mit internem RC-Oszillator 4,8MHz 
    ;FUSE-BITS High = $FF ; Low = $3B 
    ;
    ;Am  Pin 6 ( INT0 ) wird dass Signal des CY800 eingelesen.
    ;Am  Pin 5 ( PCINT0 ) dieses  Signal des CY800 ueber ein Monoflop.
    ;Der Pin 3 ( PB4 ), wird bei jedem neu empfangenem und uebereinstimmendem 3 Byte 
    ;Bitmuster getoggelt. 
    ;
    ;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 fallende Flanke erzeugt, wodurch die PCINT0-IRQ ausgeloest wird.
    ;In dieser ISR wird dann, unter anderem, die INT0-IRQ auf steigende Flanke ein-
    ;gestellt, um den Beginn des Datenpaketes zu erfassen. Mittels Timer/Couter0 
    ;Overflow IRQ, wird dann nach 550µs dass erste Bit eingelesen und alle weiteren
    ;23 Bits mit 1100µs Abstand. Hiernach werden die drei eingelesen Bytes mit denen
    ;im Flash abgelegten ( Tastencode ) verglichen und bei Uebereinstimmung die 
    ;LED-PLA getoggelt.
    ;
    ;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 bytezeiger          = r4  
    .DEF ovf0_zlr          = r5  ;Timer0 Overflow-Zaehler
    .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 bytezeiger          = r18 ;Zeiger f. dass jeweilige Byte  
    .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 #ovf0_zlr               = 5    ;fuer PLA-LED blinken ( Werte von 0-7 )
    .EQU #bit_zlr                = 8    ;Bitzaehler innerhalb eines Bytes
    .EQU #vergleichs_zlr         = 3    ;Die 3 Bytes x mal vergleichen
    ;
    ;
    ;Bitbezeichner fuer das allgemeine Flaggenregister flag_reg
    ;
    ;.equ            = 0    ;
    ;.equ            = 1    ;
    ;.equ            = 2    ;
    .equ    pdm            = 3 ;Power-Down-Mode ist erwuenscht
    .equ    pla.flg        = 4    ;Programmlaufanzeige-Flagge
    .equ    fertig       = 5    ;CY800 Paket ( 24-Bits ) erfasst
    ;.equ            = 6    ;
    ;.equ            = 7    ;
    ;
    Um ein detailreicheres Bild sehen zu können, bitte hier kurz reinschauen :

    https://www.mikrocontroller.net/topic/487338#6099487

    Im unteren Link ist zu sehen, dass nach der steigenden Flanke am INT0-Pin ( Hier durch IN/Data repräsentiert ) , dass Signal erst nach 969,333µs eingelesen werden würde ( LED-PLA = High ).
    LED-Gelb High zeigt den Zeitpunkt, wo der Code in der INT0-ISR ausgeführt wird und LED-Gelb Low, dass Ende dieser ISR.

    Das Erwachen aus dem IDLE-Mode dauert 16 Takte -> 16 x 9,827µs ~ 157µs, dann würde in die INT0-ISR eingesprungen werden. Dort wird der SYS-Takt auf Nominal 600kHz geändert und bereits der Timer/Counter0 Overflow Interrupt initialisiert, sowie gestartet. Ovfl-IRQ also nach 256 x 2,435µs ~ 626µs. 626 + 157 ~ 783µs. Ist zwar schon zu viel ( 550µs ), aber egal, da es mir jetzt erstmal um diese Diskrepanz zwischen Therorie und Praxis geht.


    Verstehe einfach nicht, wieso ~186µs mehr entstehen ( 969 - 783 ~ 186µs bzw. ~76 Takte )?


    Die 9,827µs sind die Echte Taktzeit bei Nominal 150kHz und die 2,435µs die bei Nominal 600kHz.

    Also hier im unteren Link die jeweilige xyz.jpg Datei anklicken um die Bilder sichtbar zu machen :

    https://www.edv-dompteur.de/forum/in...=4015#post4015


    Hauptprogrammschleife
    :
    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:
    ;
    ;Systemtakt ( 4,8MHz ) durch 32 teilen ( 150kHz = 6,666µs )
    ;
     in   a,CLKPR                ;Clock Prescaler Register laden..
     sbr  a,1<<CLKPCE            ;..Sicherheitsprozedur..
     cbr  a,1<CLKPS3|1<<CLKPS2|1<<CLKPS1|1<<CLKPS0;.. 
     out  CLKPR,a               ;..durchfuehren..
     in   a,CLKPR                ;Clock Prescaler Register laden..
     cbr  a,1<<CLKPCE            ;..jetzt den Teiler..
     sbr  a,1<<CLKPS2|1<<CLKPS0    ;..neu einstellen..
     out  CLKPR,a                ;..und ueberschreiben
    ;
    ;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
    ;
    ;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
    ;
    ;Variablen initialisieren ( r0-r31 haben unbestimmten Inhalt )
    ;
     clr  flag_reg              ;Allgemeines Flaggenregister;
     clr  ovf0_zlr              ;Timer0 Overflow-Zaehler initialisieren
     clr  bit_zlr               ;CY800 Bitzaehler
    
     sbr  flag_reg,1<<pdm        ;Power-Down-Mode ist gewuenscht
     sbr  bytezeiger,1<<2       ;Zeiger auf Byte2 setzen
    
     ldi  zh,high(_code*2)      ;Z-Zeiger mit Vergleichscode-Adresse..
     ldi  zl,low (_code*2)      ;..laden
    ;
    ;Pin Change Interrupt 0 -> PCI0 initialisieren
    ;
     in   a,PCMSK               ;Pin Change Mask Register laden und..
     sbr  a,1<<PCINT0           ;..Pin Change Interrupt 0 auswaehlen
     out  PCMSK,a               ;..und Register ueberschreiben
     in   a,GIMSK                ;General Interrupt Masken Register laden und..
     sbr  a,1<<PCIE             ;..Pin Change Interruput 0 Freigabebit setzen..
     out  GIMSK,a                ;..INT0 Interrupt freigeben und..
     ldi  a,1<<PCIF             ;..Pin Change Interrupt Flag..
     out  GIFR,a                ;..loeschen
    
     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<<SM1|1<<SM0|1<<SE    ;..auf Werkseinstellung..
     out  MCUCR,a                ;..setzen
     
     sbr  flag_reg,1<<pla.flg   ;Programmlaufanzeige-Flag quitieren
     sbrc flag_reg,fertig       ;CY800-Paket erfasst?
     rjmp _fertig               ;..JA -> LED-Gelb ( TEST ) einschalten
     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 ###########################
    
     in   a,MCUCR                ;MCU Control Register laden..
     sbr  a,1<<SM1|1<<SE        ;..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 ###########################
    
     in   a,MCUCR                ;MCU Control Register laden..
     cbr  a,1<<SM1|1<<SM0       ;..IDLE-Mode und..
     sbr  a,1<<SE                ;..Sleep Enable vorbereiten..
     out  MCUCR,a                ;..und freigeben
     sleep
     
     rjmp _main                 ;Arbeitsschleife ausfuehren
    ;
    ;Der Code stimmt nicht
    ;
    _gescheitert:
     ldi  a,#vergleichs_zlr     ;..NEIN -> Vergleichszaehler neu..
     mov  vergleichs_zlr,a      ;..laden
     rjmp  _loeschen             ;..Bytes sind ungleich, also alle 3 Bytes loeschen
    ;
    ;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
    ;
    ;Systemtakt ( 4,8MHz ) durch 32 teilen ( 150kHz = 6,666µs )
    ;
    _loeschen:
     cli                        ;Alle globalen Interrupts sperren
     in   a,CLKPR                ;Clock Prescaler Register laden..
     sbr  a,1<<CLKPCE            ;..Sicherheitsprozedur..
     cbr  a,1<CLKPS3|1<<CLKPS2|1<<CLKPS1|1<<CLKPS0;.. 
     out  CLKPR,a               ;..durchfuehren..
     in   a,CLKPR                ;Clock Prescaler Register laden..
     cbr  a,1<<CLKPCE            ;..jetzt den Teiler..
     sbr  a,1<<CLKPS2|1<<CLKPS0    ;..neu einstellen..
     out  CLKPR,a                ;..und ueberschreiben
     sei                        ;Alle globalen Interrupts wieder freigeben
    
     clr  byte_2                ;Die 3..
     clr  byte_1                ;..Bytes..
     clr  byte_0                ;..loeschen
    
     cbr  flag_reg,1<<fertig    ;CY800 Paket erfasst FLAG loeschen
     sbr  bytezeiger,1<<2       ;Zeiger auf Byte2 setzen
     sbr  flag_reg,1<<pdm       ;Power-Down-Mode freigeben
    ;
    ;Pin Change Interrupt 0 -> PCI0 initialisieren
    ;
     in   a,PCMSK               ;Pin Change Mask Register laden und..
     sbr  a,1<<PCINT0           ;..Pin Change Interrupt 0 auswaehlen
     out  PCMSK,a               ;..und Register ueberschreiben
     in   a,GIMSK                ;General Interrupt Masken Register laden und..
     sbr  a,1<<PCIE             ;..Pin Change Interruput 0 Freigabebit setzen..
     out  GIMSK,a                ;..INT0 Interrupt freigeben und..
     ldi  a,1<<PCIF             ;..Pin Change Interrupt Flag..
     out  GIFR,a                ;..loeschen
    
     rjmp _main                 ;Arbeitsschleife ausfuehren
    ;
    ;Ausgang Umschalten
    ; 
    _umschalten:
     ;sbi  LED_PORT,led.ge       ;LED-Gelb einschalten T E S T Z W E C K E ############################
     ldi  a,#vergleichs_zlr     ;Vergleichszaehler neu..
     mov  vergleichs_zlr,a      ;..laden
    
     rjmp _main                 ;Arbeitsschleife ausfuehren
    
    ; rjmp PC                    ;Endlosschleife
    ;
    ;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 )
    
    .EXIT                       ;Ende des Quelltextes
    Hardware.inc :
    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      = PB1         ;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 INT0_PIN      = PINB     ;CY800 Eingabeport
    
    .EQU PIN_PLA      = PINB     ;Eingabeport wo die LED-ProgrammLaufAnzeige ist
    IRQt13.inc -> Restliche Interrupt Vektortabelle :
    Code:
    ;
    ;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
    ; Interruptvektortabelle des ATtiny13 Mikrocontrollers
    ;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
    ;
    ; ***** INTERRUPT VECTORS ************************************************
     rjmp    _INT0addr    ; External Interrupt 0
     rjmp    _PCI0addr    ; External Interrupt Request 0
     rjmp    _OVF0addr    ; Timer/Counter0 Overflow
     reti   ;rjmp    _ERDYaddr    ; EEPROM Ready
     reti   ;rjmp    _ACIaddr    ; Analog Comparator
     reti   ;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.inc -> Interrupt Service Routinen ( ISR ):
    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 #############################
     
     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..
    ;
    ;Systemtakt ( 4,8MHz ) durch 8 teilen ( 600kHz = 1,666µs )
    ;
     cli                        ;Alle globalen Interrupts sperren
     in   ia,CLKPR                ;Clock Prescaler Register laden..
     sbr  ia,1<<CLKPCE            ;..Sicherheitsprozedur..
     cbr  ia,1<CLKPS3|1<<CLKPS2|1<<CLKPS1|1<<CLKPS0;.. 
     out  CLKPR,ia               ;..durchfuehren..
     in   a,CLKPR                ;Clock Prescaler Register laden..
     cbr  ia,1<<CLKPCE            ;..jetzt den Teiler..
     sbr  ia,1<<CLKPS1|1<<CLKPS0    ;..neu einstellen..
     out  CLKPR,ia                ;..und ueberschreiben
     sei                        ;Alle globalen Interrupts wieder freigeben
    ;
    ;Timer/Counter0 im CTC-Mode betreiben und Overflow-Interrupt initialisieren
    ;
     in   ia,TCNT0              ;Timer/Counter0 Zaehlregister laden und..
     clr  ia                    ;..ruecksetzen ( Null )..
     out  TCNT0,ia              ;..ausfuehren
     ldi  ia,1<<TOIE0           ;Timer/Counter0 Overflow Interrupt... 
     out  TIMSK0,ia             ;...enablen (TOIE0) und..
     in   ia,TCCR0B                ;..Timer/Counter0 ControlregisterB lesen..
     sbr  ia,1<<CS00            ;..Timer0 mit 1:1 Teiler..
     out  TCCR0B,ia                ;..starten
     ldi  ia,1<<TOV0            ;..Timer/Counter0 Overflow Interrupt Flag..
     out  TIFR0,ia              ;..loeschen..
    ;
    ;Bitzaehler einstellen
    ;
     ldi  ia,#bit_zlr           ;Wert f. Bitzaehler laden..
     mov  bit_zlr,ia            ;..und Bitzaehler einstellen
    
    _exit_INT0addr:
     out  SREG,s_sreg           ;Statusregister wiederherstellen
    
     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:    
     in   s_sreg,SREG           ;CPU-Statusregister sichern 
    ;
    ;Pin Change Interrupt 0 -> PCI0 sperren
    ;
     in   ia,PCMSK              ;Pin Change Mask Register laden und..
     cbr  ia,1<<PCINT0          ;..Pin Change Interrupt 0 sperren
     out  PCMSK,ia              ;..und Register ueberschreiben
     in   ia,GIMSK              ;General Interrupt Masken Register laden und..
     cbr  ia,1<<PCIE             ;..Pin Change Interruput 0 Freigabebit loeschen..
     out  GIMSK,ia                ;..INT0 Interrupt sperren
    
     cbr   flag_reg,1<<pdm        ;Power-Down-Mode sperren
    ;
    ;INT0 Interrupt initialisieren
    ;
     in   ia,MCUCR              ;MCU Control Register laden..
     sbr  ia,1<<ISC01|1<<ISC00  ;..INT0 Interrupt auf steigende Flanke einstellen..
     out  MCUCR,ia              ;..und ausfuehren
     in   ia,GIMSK              ;General Interrupt Mask Register laden..
     sbr  ia,1<<INT0            ;..INT0 Interrupt Freigabe vorbereiten und..
     out  GIMSK,ia              ;..ausfuehren..
     ldi  ia,1<<INTF0           ;..jetzt noch dass INT0 Interrupt-Flag..
     out  GIFR,ia               ;..loeschen
     
    _exit_PCI0addr:
     out  SREG,s_sreg           ;Statusregister wiederherstellen
    
     reti                       ;Ruecksprung aus der PCI0-ISR
    ;
    ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
    ; Timer0 Overflow ISR ( Interrupt Service Routine )
    ;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
    ;
    _OVF0addr:
     
     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 ###########################
     
     in   s_sreg,SREG           ;CPU-Statusregister sichern 
    ;
    ;CY800-Bits erfassen
    ; 
     sec                        ;High-Bit vorgeben
     sbis INT0_PIN,cy800.data    ;CY800 Signalpin = 1 ?..               
     clc                        ;..Nein -> Bit = 0 setzen
    
     sbrc bytezeiger,0              ;Ist dass Bit von Byte0 drann?..
     rjmp _byte0                ;..JA -> dann dorthin springen
     sbrc bytezeiger,1            ;Ist dass Bit von Byte1 drann?..
     rjmp _byte1                ;..JA -> dann dorthin springen
     rol  byte_2                ;Carry-Flag und weitere Bits links rotieren..
     rjmp _bitzlr                ;..und Bitzaehler verringern
    _byte0:
     rol  byte_0                ;Carry-Flag und weitere Bits links rotieren..
     rjmp _bitzlr                ;..und Bitzaehler verringern
    _byte1:
     rol  byte_1                ;Carry-Flag und weitere Bits links rotieren
    _bitzlr:
     dec  bit_zlr                ;Bitzaehler um eins verringern
     brne _systemtakt            ;8-Bits erfasst?..
     ldi  bit_zlr,#bit_zlr         ;..JA -> Bitzaehler neu setzen
    ;
    ;Alle 24 CY800-Bits erfasst?
    ; 
     lsr  bytezeiger            ;Naechstes Byte auswaehlen..
     tst  bytezeiger            ;..Alle 24 CY800-Bits erfasst ( 3x8 Bits )?..
     breq _bits_erfasst         ;..JA -> Dekodieren in Main veranlassen
     rjmp _pla                  ;ProgrammLaufAnzeige-LED ( PLA-LED ) bearbeiten
    ;
    ;Timer/Counter0 Overflow Interrupt sperren
    ;
    _bits_erfasst:
     in   ia,TIMSK0             ;Timer/Counter0 Mask Register laden und.. 
     cbr  ia,1<<TOIE0           ;..Timer/Counter0 Overflow Interrupt..
     out  TIMSK0,ia             ;...sperren
    ;
    ;CY800-Paket fertig FLAG setzen ( Vergleich in _main: veranlassen )
    ;
     sbr  flag_reg,1<<fertig    ;CY800-Paket ( 24-Bits ) erfasst
    ;
    ;Systemtakt ( 4,8MHz ) durch 16 teilen ( 300kHz = 3,333µs )
    ;
    _systemtakt: 
     cli                        ;Alle globalen Interrupts sperren
     in   ia,CLKPR                ;Clock Prescaler Register laden..
     sbr  ia,1<<CLKPCE            ;..Sicherheitsprozedur..
     cbr  ia,1<CLKPS3|1<<CLKPS2|1<<CLKPS1|1<<CLKPS0;.. 
     out  CLKPR,ia               ;..durchfuehren..
     in   ia,CLKPR                ;Clock Prescaler Register laden..
     cbr  ia,1<<CLKPCE            ;..jetzt den Teiler..
     sbr  ia,1<<CLKPS2           ;..neu einstellen..
     out  CLKPR,ia                ;..und ueberschreiben
     sei                        ;Alle globalen Interrupts wieder freigeben
    ;
    ;ProgrammLaufAnzeige-LED ( PLA-LED ) bearbeiten  
    ;
    _pla: 
     sbrs flag_reg,pla.flg      ;PLA-Flag in der Mainschleife quitiert?...
     rjmp _exit_OVF0addr        ;...Nein => ISR verlassen -> Kein blinken
    
     ;inc  ovf0_zlr                ;Overflowzaehler inkrementieren...
     ;sbrs ovf0_zlr,#ovf0_zlr    ;...bis Bitposition X gezaehlt...
     ;rjmp _exit_OVF0addr       ;...Nein => ISR verlassen
     ;clr  ovf0_zlr                ;Overflowzaehler ruecksetzen
    
     ;sbi  PIN_PLA,led.pla       ;PLA-LED toggeln bzw. blinken erzeugen
    ;
    ;Timer0 Overflow ISR verlassen
    ; 
    _exit_OVF0addr:             ;Timer0 Overflow ISR verlassen
     cbr flag_reg,1<<pla.flg    ;Programmlaufanzeige-Flag quitieren
    
     out  SREG,s_sreg           ;Statusregister wiederherstellen
     
     reti                       ;Ruecksprung aus der Interrupt Service Routine

    Wer sich mit dem ATMEL Studio 7 auskennt, kann dass ZIP-Projekt im Anhang dort öffnen. Geht leider doch nicht :

    Klicke auf die Grafik für eine größere Ansicht

Name:	Zip-Datei_RN.jpg
Hits:	6
Größe:	32,1 KB
ID:	34946


    Bernd_Stein
    Geändert von Bernd_Stein (18.04.2020 um 12:51 Uhr)
    CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

  8. #8
    Erfahrener Benutzer Roboter-Spezialist Avatar von Bernd_Stein
    Registriert seit
    19.09.2008
    Ort
    Deutschland : Nordrhein-Westfalen ( NRW )
    Alter
    53
    Beiträge
    407

    CY800-Funksteckdosenempfänger -> Programmablaufpläne ( PAP )

    Da es sicherlich für die aller, aller Meisten sehr schwer zu durchschauen ist, was im Code passiert, habe ich mal hier den überwiegenden Teil der Programmablaufpläne ( PAP ) hinterlegt.

    Dort wieder einfach mit Linksklick auf das xyz.jpg klicken, wenn das Pfeil-Symbol in ein Hand-Symbol umschaltet :

    https://www.edv-dompteur.de/forum/in...=4026#post4026


    Ich kann diesen kostenlosen PAP-Designer, gerade bei der Assemblerprogrammierung, nur empfehlen :

    https://www.heise.de/download/product/papdesigner-51889

    Wer ihn schon hat -> siehe Anhang. Oder doch wieder einmal nicht -> Ungültige => Datei CY800.pap


    Bernd_Stein
    Geändert von Bernd_Stein (18.04.2020 um 13:56 Uhr) Grund: PAP als Anhang
    CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    174
    So mal ein AUSZUG aus der INC des TINY13A
    Code:
    ; ***** INTERRUPT VECTORS ************************************************
    .equ    INT0addr    = 0x0001    ; External Interrupt 0
    .equ    PCI0addr    = 0x0002    ; External Interrupt Request 0
    .equ    OVF0addr    = 0x0003    ; Timer/Counter0 Overflow
    .equ    ERDYaddr    = 0x0004    ; EEPROM Ready
    .equ    ACIaddr    = 0x0005    ; Analog Comparator
    .equ    OC0Aaddr    = 0x0006    ; Timer/Counter Compare Match A
    .equ    OC0Baddr    = 0x0007    ; Timer/Counter Compare Match B
    .equ    WDTaddr    = 0x0008    ; Watchdog Time-out
    .equ    ADCCaddr    = 0x0009    ; ADC Conversion Complete
    
    .equ    INT_VECTORS_SIZE    = 10    ; size in words
    
    #endif  /* _TN13ADEF_INC_ */
    
    ; ***** END OF FILE ******************************************************
    Also nochmal meinen ersten POST LESEN UND VERSTEHEN was die INT_VECTORS_SIZE aussagt nur das es 10 Vectoren gibt nicht mehr und nicht weniger.

    Simuliert im AS 4.19 und was passiert er fängt das Programm direkt von vorn an abzuarbeiten wenn man auf PB0 den INT0 auslöst, weil der Sprungverweis per RJMP zur ISR fehlt, weil du meinst
    so ein BOCKMIST zu machen
    Code:
    .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
    
    .ORG INT_VECTORS_SIZE       ;Programmadresse nach den ganzen IRQ-Vektoren
    Hausaufgabe 1
    Setze die Sprungmarken für die ISR richtig das die ISR's auch angesprungen werden können!

    Hausaufgabe 2
    Lerne den Unterschied zwischen Spaghetticode und das arbeiten mit Unterprogrammen(UP) kennen und nutze den Vorteil von UP's die mit dem StackPointer arbeiten.

    Hausaufgabe 3
    Wenn du UP's verstanden hast, fange an dein Gesamtprogramm strukturiert mit UP's aufzubauen. Es gibt Pogrammteile die du immer wiederbrauchst und nur 1 mal schreiben musst z.B. die SleepRoutine.

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von Bernd_Stein Beitrag anzeigen

    Um ein detailreicheres Bild sehen zu können, bitte hier kurz reinschauen :

    https://www.mikrocontroller.net/topic/487338#6099487

    Im unteren Link ist zu sehen, dass nach der steigenden Flanke am INT0-Pin ( Hier durch IN/Data repräsentiert ) , dass Signal erst nach 969,333µs eingelesen werden würde ( LED-PLA = High ).
    LED-Gelb High zeigt den Zeitpunkt, wo der Code in der INT0-ISR ausgeführt wird und LED-Gelb Low, dass Ende dieser ISR.
    Ich würde Dir ja gerne helfen. Finde mich aber überhaupt nicht mehr durch Deine Angaben. Wo ist zB der untere Link? Du verweist in diesem thread zu Deinen eigenen Infos in mindestens zwei weiteren Foren in dessen threads auch noch weiterführende Links existieren. Hast Du schon mal ein zusammenhängendes Programm gepostet?

    Und überhaupt: Das ursprüngliche Topic wo denn der eine Takt herkommt ist doch schon geklärt?
    Zum "Funksteckdosen-Protokoll auswerten ( CY800 -> HESUNSE )" solltest Du einen neuen thread aufmachen in dem alle Infos zu dem zu spät eingelesenen Signal existieren. Ich blicke in diesem thread jedenfalls nicht mehr durch.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. [ERLEDIGT] ATtiny13A: Pin Change Interrupt vs. INT0
    Von Bernd_Stein im Forum Assembler-Programmierung
    Antworten: 7
    Letzter Beitrag: 17.04.2020, 16:17
  2. [ERLEDIGT] Empfängersignal mit ATtiny13A erkennen
    Von Lichti01 im Forum Elektronik
    Antworten: 14
    Letzter Beitrag: 24.06.2017, 07:19
  3. ATTiny13A Schalter abfragen/entprellung mit Variablen
    Von Denn Is im Forum C - Programmierung (GCC u.a.)
    Antworten: 19
    Letzter Beitrag: 01.07.2014, 11:21
  4. Attiny13a RS232
    Von flecralf im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 09.10.2013, 18:27
  5. CLK Takt höher als Datenbus Takt (SDRAM)
    Von saoirse im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 25.08.2007, 17:12

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress