- 3D-Druck Einstieg und Tipps         
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 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

  2. #2
    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.

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

    Mein Programmierstil und OC0A Interrupt

    Zitat Zitat von avr_racer Beitrag anzeigen
    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.
    Versteh zwar nicht wie dies passieren konnte, dass die wesentliche ( .include "IRQt13.inc" ;Restliche Interrupt Vektortabelle ) fehlt !
    In meinem Eröffnungspost ist dies auf jeden Fall mit drinn, deshalb denke ich dass Hausaufgabe 1 erledigt ist

    https://www.roboternetz.de/community...l=1#post659203

    Zu HA2 :
    UP's nutze ich meistens nur, wenn ein und die selbe Codesequenz öfters benutzt werden soll. Halte mich aber nicht sklavisch daran ( siehe Hauptprogrammschleife -> SLEEP deaktivieren ).
    Ich finde, es ist halt eine Sache des Programmierstils, den ich wahrscheinlich nicht mehr verändern werde.

    Zu HA3 :
    Ich habe sie verstanden, aber ist halt nicht mein Stil. Um die Struktur besser zu erkennen, benutze ich lieber den PAP.

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

    Ich verstehe zwar immer noch nicht warum diese Diskrepanz entsteht und glaube auch nicht dass sich irgendjemand durch meinen " Spaghetticode " arbeiten wird, um der Ursache auf den Grund zu gehen.

    Deswegen arbeite ich jetzt mal mit der OC0A-Interrupt. Dort kann man dann wenigstens mittels Änderung des TOP-Wertes ( OC0RA ) im CTC-Mode bestimmen, wann genau die OC0A-IRQ auftreten soll.


    Falls es überhaupt jemandem aufgefallen ist, habe ich erstens - a in ia geändert und zweitens cli & sei weggelassen, da ich mich ja hier in einer ISR befinde, die nicht unterbrochen wird.

    ISR.inc -> Interrupt Service Routinen ( ISR ) :
    Code:
    ; 
    ;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

    Bernd_Stein

    - - - Aktualisiert - - -

    Ach, mal wieder was zum Simulator im Atmel Studio 7 ( AS7 ).

    Ich bin ja leider ein wenig Lernresistent bei den Befehlen CBR & SBR und dann kommt noch dieser Simulator hinzu und schon ist die Verwirrung perfekt.

    Beim SFR-CLKPR und noch so anderen SFR's sollte ich mir abgewöhnen RMW ( Read Modify Write ) per CBR & SBR zu realisieren, denn damit verarsche ich mich regelmäßig selbst.

    Siehe hier :

    https://www.edv-dompteur.de/forum/in...=4034#post4034


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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    174
    Zitat Zitat von Bernd_Stein;659466
    Zu HA3 :
    Ich habe sie verstanden, aber ist halt nicht mein Stil. Um die Struktur besser zu erkennen, benutze ich lieber den PAP.

    [SIZE=3
    Verstehe einfach nicht, wieso ~186µs mehr entstehen ( 969 - 783 ~ 186µs bzw. ~76 Takte )?
    [/SIZE]
    Ich verstehe zwar immer noch nicht warum diese Diskrepanz entsteht und glaube auch nicht dass sich irgendjemand durch meinen " Spaghetticode " arbeiten wird, um der Ursache auf den Grund zu gehen.

    Deswegen arbeite ich jetzt mal mit der OC0A-Interrupt. Dort kann man dann wenigstens mittels Änderung des TOP-Wertes ( OC0RA ) im CTC-Mode bestimmen, wann genau die OC0A-IRQ auftreten soll.
    Das was du in PAP beschreibst ist rein der Programmablauf wie dieser umgesetzt wird und mit welchen Befehlen, ist jedem natürlich selbst überlassen.
    Wenn du aber möchtest das wir dir helfen dann geht es nur über eine annehmbare Programmstruktur. Dies beginnt schon nur damit das man nicht sinnlos alles in irgendwelche INC packt was absolut nicht notwendig ist Beispiel folgt.

    Die Zeit wird auch mit dem OC-Int bleiben!!! Weil nicht verstanden wurde die Programmteile strukturiert zu erstellen um diese einzelnd prüfen zu können. Nur so wirst du den Fehler finden.


    Jetzt zum Beispiel welches vereinfacht deine Stil dastellt.
    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
    .include IRQt13.inc
    .ORG INT_VECTORS_SIZE       ;Programmadresse nach den ganzen IRQ-Vektor
    Sinvoller so

    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 $0001
     rjmp  IRQ_?              ;Sprung zu
    .ORG $0002
     rjmp  IRQ_??             ;Sprung zu
    .ORG $0003
     reti                     ;zur Sicherheit RETI falls INT für $0003 doch ausgelöst wird ist keine ISR vorhanden aber 
                              ;der STACK wird nicht zerschoßen bzw falsche Ausführung von unerwünschten Programm
    oder so

    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
    INT0addr    
    PCI0addr   
    OVF0addr   
    ERDYaddr  
    ACIaddr  
    OC0Aaddr  
    OC0Baddr  
    WDTaddr   
    ADCCaddr
    Die ISR-Routinen selbst KÖNNEN natürlich in einer separaten INC stehen.

    Somit erkennt jeder das die ISR sauber eingetragen sind und vorallem welche. Alles auf den ersten Blick erkennbar.

Ä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
  •  

LiFePO4 Speicher Test