-         

Ergebnis 1 bis 7 von 7

Thema: Problem mit ICF1

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473

    Problem mit ICF1

    Anzeige

    Moinsen,

    ich möchte die Input Capture Unit nutzen, um die Anzahl von Interrupten zwischen zwei externen Events zu zählen. Genauer gesagt nehme ich nur das Flag.
    Ich lasse in der ISR eine Speicherstelle hochzählen, bis das Flag gesetzt ist, gebe zu Kontrolle den Wert über LED´s aus und setzte den Zähler dann wieder 0 und lösche wie im Datenblatt angegeben das Flag mit log. 1.

    Nur es funktioniert gar nicht. Wenn ich das Flag mit sbrs teste passiert nix, und mit sbrc geht unkontroliert die Lutzie.
    Hat dazu jemand eine Idee?

    Danke

    Code:
    ldi r30,116;Interruptcounter laden
    ld tmp,Z
    inc tmp
    
    st Z,tmp
    in tmp,TIFR
    sbrs tmp,0b00000101
    rjmp same
    ori tmp,0b00100000;das Verhalten ändert sich nicht, wenn ich die T1 Flags ändere...
    out TIFR,tmp
    ld tmp,Z
    out PORTD,tmp
    ldi tmp,0
    st Z,tmp
    same:
    Um genau zu sein: ich habe ca. alle 10ms einen Int über Timer1 und an dem ICP1 ein DCF Modul. Um den intern erzeugten Takt mit dem genauen DCF Signal zu synchronisieren, zähle ich zwischen zwei steigenden Flanken die Interrupte, um zu sehen ob ich die Werte in OCR1L/H angleichen muss.

    PS.: ist das bei euch auch so, das ihr bei sbrs/c die Bit Nummer in einer Binären Zahl kodieren müsst ( also 0b00000101 für Bit 5)?
    Chuck Norris kann Windows Vista auf einem Atmel in Assembler implementieren!
    Chuck Norris coded mit 3 Tasten:"1","0" und "compile"

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Bei dem SBRS/C Befehl wird die Bit Nr angegeben (Binär, dezimal oder Octal ist egal). Oft nimmt man aber gleich den Symolischen Namen und keine feste Zahl:
    also z.B. SBRS tmp,ICF1

    Das ICF1 Bit könnte man auch direkt testen per SBIS TIFR,ICF1.


    Offensichtlich ist der Code ein Teil des Timer interrupts. Weden denn alle benutzten Register gerettet und der stack initialisiert ?.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Bei SBRS wird ja nur nach einem Bit gefragt.
    Folglich steht nach der Anweisung eine Zahl von 0 bis 7.
    Da Du ja binäre Schreibweise vorgibst kommst Du dann auf 0b00000101.
    Du könntest da ebenso gut "5" hinschreiben.

    Zu deinem Problem, wie schaut das denn im Simulator aus ?

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    Ich habe im Simulator dieses Programm getestet:

    Code:
    .include "m8def.inc"
    
    .def tmp = r16
    .def tmp2 = r17
    .def status_reg = r18
    ;BIT 0 zeigt an, ob PINB,1 während der ISR LOW war, dann = 1
    ;BIT 1 warten auf dcf Anfang =1 => freigabe
    ;Bit 2 Fehlerbit
    ;BIT 3 wird auf rising edge 1
    ;BIT 4 wird in dcf_einholen gesetzt, wenn 59 Bits da. enable für dcf_auswerten
    ;BIT 5 Signal wird ignoriert, bis 1
    ;BIT 6
    ;BIT 7 warten auf 2 komplette Signale
    .def pw = r19
    .def pw2 = r20
    .def pw_alt = r21
    
    .def dcf_shift_reg = r24
    .def sreg_save = r25
    
    .equ dcf_BIT_counter = 104
    .equ eins = 1
    .equ zwei = 2
    .equ vier = 4
    .equ acht = 8
    .equ zehn = 10
    .equ zwanzig = 20
    .equ vierzig = 40
    
    .org 0x000
      rjmp reset
    .org OC1Aaddr
         rjmp timer1_int
    
    ;*****************************************	
    ;*****************************************	
    ;         Pointer Z
    ; 
    ;              ms = RAM 100
    ;              sc = RAM 101
    ;             min = RAM 102
    ;          stunde = RAM 103
    ; dcf_BIT_counter = RAM 104
    ;         dcf_min = RAM 113     
    ;     dcf_min_alt = RAM 114
    ;         dcf_stu = RAM 115   
    ;    flag_counter = RAM 116   
    ;
    ;******************************************
    
    ;******************************************
    ;        Pointer Y
    
    ;     dcf BIT 0-7 = RAM 105
    ;    dcf BIT 8-15 = RAM 106
    ;   dcf BIT 16-23 = RAM 107
    ;   dcf BIT 24-31 = RAM 107
    ;   dcf BIT 32-39 = RAM 108
    ;   dcf BIT 40-47 = RAM 109     
    ;   dcf BIT 48-55 = RAM 110
    ;   dcf BIT 56-59 = RAM 111
    
    reset:
       ;Stack wird bei Interrupts benötigt! 
       ldi tmp,HIGH(RAMEND) 
       out SPH,tmp 
       ldi tmp,LOW(RAMEND) 
       out SPL,tmp
       ldi tmp,0xFF
       out DDRD,tmp
       ldi tmp,0
    
       ldi r28,105
       ldi r29,0
    
       ldi r31,0
       ldi r30,100
       st Z+,tmp
       st Z+,tmp
       st Z+,tmp 
       st Z+,tmp 
       st Z,tmp
       ldi r30,100
       
       ldi tmp,0
       out DDRC,tmp
       ldi tmp,0b00110000
       out PORTC,tmp
       ldi tmp,0
       out DDRB,tmp
       ldi tmp,0
       out PORTB,tmp
       ldi tmp,0b00110000
       out TIMSK,tmp
       
    ldi tmp,0b00000010
       out OCR1AH,tmp
       ldi r17,0b01110001
       out OCR1AL,r17
    
       ldi tmp,0b00000000
       out TCCR1A,tmp
       ldi tmp,0b01001011 ;input capture enable
       out TCCR1B,tmp
       ldi r17,0
       ldi status_reg,0
       
       ldi r28,105
       
    ldi dcf_shift_reg,0
    st Y+,dcf_shift_reg
    st Y+,dcf_shift_reg
    st Y+,dcf_shift_reg
    st Y+,dcf_shift_reg
    st Y+,dcf_shift_reg
    st Y+,dcf_shift_reg
    st Y+,dcf_shift_reg
    st Y,dcf_shift_reg
    ldi r28,105
    
    ldi pw_alt,0
       sei
    
       main:
    ;**********************************  
       
       
       
       
       rjmp main
    
    
    
    
     
    
     timer1_int:
    in sreg_save,SREG
    ldi r30,116;Interruptcounter laden
    ld tmp,Z
    inc tmp
    
    st Z,tmp
    in tmp,TIFR
    sbrs tmp,0b00000101
    rjmp same
    ori tmp,0b00100000;das Verhalten ändert sich nicht, wenn ich die T1 Flags ändere...
    out TIFR,tmp
    ld tmp,Z
    out PORTD,tmp
    ldi tmp,0
    st Z,tmp
    same:
    
    ldi r30,100
     out SREG,sreg_save
    reti
    da läuft auch alles so wie geplant.
    Die Sache mit
    sbis TIFR,ICF1
    geht nicht, da bekomme ich die meldung, dass der Operand out of Range ist.
    Was die bebutzten Register aneht, habe ich ohnehin für jeen Zweck eine Speicherstelle im RAM benutzt.
    Also immer
    st und ld über die Pointerregister.
    Chuck Norris kann Windows Vista auf einem Atmel in Assembler implementieren!
    Chuck Norris coded mit 3 Tasten:"1","0" und "compile"

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Ich hab dein Programm auch mal bei mir im Simulator laufen lassen und bin da auf ein paar Ungereimtheiten gekommen.

    Du gibst den Input Captur Interrupt frei, legst aber keine Routine dahinter - das macht so wenig sinn und wenn da auf dem Platz nur ein RETI steht.

    Das Input Capture Flag wird gelöscht, weil der Controller ja versucht den Interrupt zu starten. Beim Aufruf des zugehörigen Interrupts werden die dazugehörigen Flags immer Automatisch gelöscht.

    Deshalb wird deine SBRS Abfrage nicht aktiv und Deine Soft funktioniert nicht.

    Die Sequenz

    in tmp,TIFR
    sbrs tmp,ICF1

    funktioniert bei mir im Simulator ohne Probleme.

    Das mit SBRS TIFR,ICF1 funktioniert nicht weil das TIFR kein Register sondern ein Conf Register ist. SBIS funktioniert aber auch nicht, warum das weiß nur ATMEL.

    Prüf das noch mal nach Ich hab die AVR Studio Version 4.13 Built 528

  6. #6
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Das der SBIS Befehl nicht funktionier, liegt an der Addresse om TIFR Register. Beim Mega8 ist die zu hoch, beim Mega88 sollte es gehen, da ist es eine andere (niedrigere) Adresse.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    Also Firma dankt. Ich weiß nicht, wie das kam, dass ich das TICIE gesetzt habe. Jedenfalls läufts jetzt.

    Danke

Berechtigungen

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