Xmega 128a1u Timer D0 ohne funktion

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Xmega 128a1u Timer D0 ohne funktion

      a_475_f10f3094
      Hallo Ihr Lieben hier im Forum, ich bin das erste mal hier mit vieleicht einer simplen frage.

      Wie geschrieben habe ich einen Xmega 128a1u. Ich brauche eine simple Funktion des Timer D0 aber irgendwie bin ich zu doof oder habe das Brett vor dem Kopf.

      Die idee ist den Timer zu starten und auch zu stoppen und logisch wieder neu zu starten.

      Ablauf

      Ueber den loop wird mir momentan der Timer wert ausgedruckt wie ich sehe ist der immer der gleiche, logisch Timer ist noch nicht gestartet.
      Jetzt schicke ich im auf der Serial ein zeichen. So soll der Timer anlaufen und nach dem letzten emfangenen byte ca. 400ms einen Interrupt auslösen und nach RX springen. Dort soll der Timer gestoppt werden. In der Interruption wird den Timer wieder die 5000 vergeben, ein LED am Ausgang Q3 soll mir anzeigen, das die Interruption angelaufen wurde. Was ich sehe ist, der Timer im Anlauf hat 5000, schicke ich im ueber serial un oder mehr byte's, wechselt der Timer wert auf 1000. Von dem wechsel weiß ich, die Interruption serial ist in betrieb und wird richtig aus geführt. Aber der Timer will nicht auslösen. Wo ist der Hund begraben. Ueber Eure Hilfe währe ich dankbar. Dietmar

      mein Code ist dieser:

      $Regfile="xm128a1udef.dat"
      $Crystal=32000000
      $hwstack=40
      $swstack=16
      $framesize=32

      Config Osc = Disabled , 32mhzosc = Enabled

      Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
      Config Portq.3 = Output 'Led


      'Serialport
      Config Com1 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
      config serialin0 = Buffered , Size = 255 , Bytematch = all
      Open "COM1:" For Binary As #1

      'Timer Port D0
      Config tcd0 = Normal , Prescale = 256
      Tcd0_per = 5000 'Periode einstellen 0,4 sec

      On Tcd0_ovf RX
      Enable Tcd0_ovf , Lo

      enable interrupts
      stop tcd0
      dim i as byte


      Do
      wait 1
      print #1, Tcd0_per
      loop

      Serial0bytereceived:
      start tcd0
      Tcd0_per = 1000
      return

      'timer interrupt
      rx:
      Tcd0_per = 2000
      stop tcd0
      toggle portq.3

      Print #1,"byte IN"; _rs_bufcountr0; "Byte total in Buffer"
      for i = 1 to _rs_bufcountr0
      Print #1,"byte IN" ;chr(_rs232inbuf0(i)); "Byte in Buffer"
      next

      return



      end 'end program
    • Wenn ich das lese, sollte es auch ohne config priority gehen
      When you do not specify the priority when enabling an interrupt like : ENABLE Tcc0_ovf , the compiler will use the MED interrupt level. This means that you must enable this as well when using CONFIG PRIORITY. When you do NOT use CONFIG PRIORITY, but only ENABLE INTERRUPTS, the compiler will activate the MED interrupt automatically.
      So when not using CONFIG PRIORITY all will work out just fine, but when using CONFIG PRIORITY, do not forget to enable the MED priority.
      Obiges findet man hier avrhelp.mcselec.com/config_priority.htm
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • @Dietmar74 vielleicht läuft dein timer garnicht. Ich sehe zu anderen Beispielen einen Unterschied bei config osc. Schreib mal probehalber config osc=enable.....
      (da ich eigentlich keine Ahnung hab' probier' ich öfters nur rum, das gerade genannte ist also auch nur ein Probieren, weil es andere auch so gemacht haben)
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • @Dietmar74 was du auch mal versuchen kannst, in deinem Programm den Timerstand alle Sekunde zu printen und den timer natürlich auch vorher starten. Wenn dabei verschiedene Werte angezeigt werden, weiß man zumindest, dass der timer läuft.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hi,
      ich habe zur Entspannung und nach längerer Programmierabstinenz mal wieder den Atmel ICE Debugger angeworfen und nach einiger Sucherei sogar den benötigten PDI-Adapter wiedergefunden...

      Was ich gesehen habe ist dass die ISR nur dann angesprochen wird, wenn
      Enable Tcd0_ovf , Med oder Hi eingestellt wird. Lo ging nicht.
      Ausserdem hatte ich die beiden stop tcd0 herausgenommen.
      Bascom Version 2082.