Anfangsschwierigkeiten mit einem xmega

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

    • Anfangsschwierigkeiten mit einem xmega

      Ich will mich mal mit einem xmega befassen, weil ich für ein Projekt (Elektrosandkasten) mal mehr Rechenpower haben möchte. Dazu hab' ich mir ein breakoutboard mit einem xmega32a4u besorgt und auch schon eine blinkende Led hingekriegt.
      Jetzt möchte ich mein vorhandenes Programm von einem mega168 auf den xmega32 bringen.

      Ich verwende den timer0 im ctc-modus. Jetzt geht es schon los, config timer0=timer, prescale=256,clear_timer=1 wird akzeptiert, aber ein On Compare0a Steppertakt_isr wird bemeckert.
      Wo bekommt man die richtigen Bezeichner her? Hat jemand einen Tipp für Lesestoff, der mehr bringt, als 'die ersten Schritte..' hier im Forum?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • das sagst du so leicht. In den samples von bascom stöber ich gerade und finde dann sowas (Ausschnitt), da wird's mir ganz anders <X

      BASCOM Source Code

      1. '---------------------DECLARATION OF COUNTER/TIMER SUB--------------------------
      2. 'TC0_ConfigClockSource
      3. 'Configures clock source for the Timer/Counter 0
      4. Declare Sub Tc0_configclocksource(byval Port As String , Byval Clockselection As Byte)
      5. 'Tc0_setoverflowintlevel
      6. 'This function sets the overflow interrupt level of this Timer/Counter 0
      7. Declare Sub Tc0_setoverflowintlevel(byval Port As String , Byval Tc0_ovfintlvl As Byte)
      8. 'TC_SetPeriod
      9. 'Sets the timer period
      10. 'The period buffer register is not used, so the new period will be valid immediately after the 16-bit write is finished.
      11. Declare Sub Tc_setperiod(byval Port As String , Byval Period As Word)
      12. '-----------------Interrupts----------------------------------------------------
      13. Config Priority = Static , Vector = Application , Lo = Enabled
      14. On Tcc0_ovf Second_tick 'Timer 0 on Port C = Second Timer
      15. Enable Tcc0_ovf , Lo
      16. Main:
      17. 'Set period/TOP value = 1 Second in Timer 0 on Port C
      18. Call Tc_setperiod( "C" , 31250) '32MHz/1024 = 31250
      19. 'sets the overflow interrupt level of Timer/Counter 0 Port C to LOW Level Interrupt
      20. Call Tc0_setoverflowintlevel( "C" , 1)
      21. 'Start timer by selecting a clock source
      22. Call Tc0_configclocksource( "C" , 7) 'Timer 0 Port C --> DIV1024
      23. Enable Interrupts
      24. Do
      25. If Second = 1 Then
      26. Second = 0
      27. Incr Number
      28. Print #1 , "Second Tick " ; Number
      29. Toggle Portd.0 'Toggle LED
      30. End If
      31. Loop
      32. End 'end program
      33. '-------Interrupt Service Routines----------------------------------------------
      34. Second_tick:
      35. Set Second
      36. Return
      37. '----------COUNTER/TIMER----Subroutines-----------------------------------------
      38. 'TC0_ConfigClockSource
      39. 'Configures clock source for the Timer/Counter 0
      40. 'Clockselection [0 = OFF, 1 = DIV1, 2 = DIV2, 3 = DIV4, 4= DIV8, 5 = DIV64, 6 = DIV256, 7 = DIV1024, 8 = EventChannel 0 ....15 = Event Channel 7
      41. Sub Tc0_configclocksource(byval Port As String , Byval Clockselection As Byte)
      42. Select Case Port
      43. Case "C": 'Port C
      44. Select Case Clockselection
      45. Case 0 : Tcc0_ctrla = &B0000_0000 'OFF
      46. Case 1 : Tcc0_ctrla = &B0000_0001 'DIV1
      47. Case 2 : Tcc0_ctrla = &B0000_0010
      48. Case 3 : Tcc0_ctrla = &B0000_0011
      49. Case 4 : Tcc0_ctrla = &B0000_0100
      50. Case 5 : Tcc0_ctrla = &B0000_0101
      51. Case 6 : Tcc0_ctrla = &B0000_0110
      52. Case 7 : Tcc0_ctrla = &B0000_0111 'DIV1024
      53. Case 8 : Tcc0_ctrla = &B0000_1000 'Event Channel 0
      54. Case 9 : Tcc0_ctrla = &B0000_1001
      55. Case 10 : Tcc0_ctrla = &B0000_1010
      56. Case 11 : Tcc0_ctrla = &B0000_1011
      57. Case 12 : Tcc0_ctrla = &B0000_1100
      58. Case 13 : Tcc0_ctrla = &B0000_1101
      59. Case 14 : Tcc0_ctrla = &B0000_1110
      60. Case 15 : Tcc0_ctrla = &B0000_1111 'Event Channel 7
      61. End Select
      62. Case "D": 'Port D
      63. Select Case Clockselection
      64. Case 0 : Tcd0_ctrla = &B0000_0000 'OFF
      65. Case 1 : Tcd0_ctrla = &B0000_0001 'DIV1
      66. Case 2 : Tcd0_ctrla = &B0000_0010
      67. Case 3 : Tcd0_ctrla = &B0000_0011
      68. Case 4 : Tcd0_ctrla = &B0000_0100
      69. Case 5 : Tcd0_ctrla = &B0000_0101
      70. Case 6 : Tcd0_ctrla = &B0000_0110
      71. Case 7 : Tcd0_ctrla = &B0000_0111 'DIV1024
      72. Case 8 : Tcd0_ctrla = &B0000_1000 'Event Channel 0
      73. Case 9 : Tcd0_ctrla = &B0000_1001
      74. Case 10 : Tcd0_ctrla = &B0000_1010
      75. Case 11 : Tcd0_ctrla = &B0000_1011
      76. Case 12 : Tcd0_ctrla = &B0000_1100
      77. Case 13 : Tcd0_ctrla = &B0000_1101
      78. Case 14 : Tcd0_ctrla = &B0000_1110
      79. Case 15 : Tcd0_ctrla = &B0000_1111 'Event Channel 7
      80. End Select
      81. End Select
      82. End Sub
      83. 'Tc0_setoverflowintlevel
      84. 'This function sets the overflow interrupt level of this Timer/Counter 0
      85. Sub Tc0_setoverflowintlevel(byval Port As String , Byval Tc0_ovfintlvl As Byte)
      86. Select Case Port
      87. Case "C" : 'Port C
      88. Select Case Tc0_ovfintlvl
      89. Case 0 :
      90. Reset Tcc0_intctrla.0 'OFF
      91. Reset Tcc0_intctrla.1
      92. Case 1 :
      93. Set Tcc0_intctrla.0 'Lo Level
      94. Reset Tcc0_intctrla.1
      95. Case 2 :
      96. Reset Tcc0_intctrla.0 'Medium Level
      97. Set Tcc0_intctrla.1
      98. Case 3 :
      99. Set Tcc0_intctrla.0 'High Level
      100. Set Tcc0_intctrla.1
      101. End Select
      102. Case "D" : 'Port D
      103. Select Case Tc0_ovfintlvl
      104. Case 0 :
      105. Reset Tcd0_intctrla.0 'OFF
      106. Reset Tcd0_intctrla.1
      107. Case 1 :
      108. Set Tcd0_intctrla.0 'Lo Level
      109. Reset Tcd0_intctrla.1
      110. Case 2 :
      111. Reset Tcd0_intctrla.0 'Medium Level
      112. Set Tcd0_intctrla.1
      113. Case 3 :
      114. Set Tcd0_intctrla.0 'High Level
      115. Set Tcd0_intctrla.1
      116. End Select '
      117. End Select
      118. End Sub
      119. 'TC_SetPeriod
      120. 'Sets the timer period
      121. 'The period buffer register is not used, so the new period will be valid immediately after the 16-bit write is finished.
      122. Sub Tc_setperiod(byval Port As String , Byval Period As Word)
      123. Select Case Port
      124. Case "C" :
      125. Tcc0_per = Period 'Port C
      126. Case "D" :
      127. Tcd0_per = Period 'Port D
      128. End Select
      129. End Sub
      Display All
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Wie soll man das verstehen? Rot markiert, was ich nicht raller.
      Ausschnitt aus dem sample 'xm128-TIMER-S2.bas'


      'config timer to normal mode
      Config Tcd0 = Normal , Prescale = 64
      Tcd0_per = &HFFFF ' period register
      Tcd0_cca = &H300 'compare A match value

      Do
      If Tcd0_intflags.0 = 1 Then ' if timer overflowed
      Tcd0_intflags.0 = 1 ' clear flag by writing 1
      Porte.0 = 1 ' toggle led
      End If
      If Tcd0_intflags.4 = 1 Then ' CCA compare match
      Tcd0_intflags.4 = 1 ' clear interrupt
      Tcd0_ccabuf = Tcd0_ccabuf + &H1000
      Porte.0 = 0
      End If
      Loop
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Bisschen weiter bin ich gekommen
      avrhelp.mcselec.com/config_tcxx.htm
      kampis-elektroecke.de/?page_id=876
      jtronics.de/avr-projekte/xmega-tutorial.html

      Aber den code aus post#5 versteh' ich immer noch nicht.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • six1 wrote:

      Naja, das Register zeigt ein Ereignis an und kann gelöscht werden, indem man in das Register eine "1" schreibt.
      Ist nicht mehr dahinter...

      Im SUSI Projekt in Datei ETH_WEBRADIO_DECLARATIONS.inc siehst du auch eine einfache konfiguration des Timer3
      mit =1 setzten zum Löschen hab' ich kein Problem, nur kommt man zu dem Befehl, wenn die if-Abfrage true ist und da ist das bit ja schon =1 und ja somit schon gelöscht??
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • six1 wrote:

      Nein, das "Flag" ist gesetzt, weil das Ereignis eingetreten ist.
      dann sollte das flag doch auf 0 stehen. damit ich das erkenne, frage ich 'if tcd0_intflags.0=0 then.. und nicht

      If Tcd0_intflags.0 = 1 Then ' if timer overflowed
      Tcd0_intflags.0 = 1 ' clear flag by writing 1
      Porte.0 = 1 ' toggle led
      End If
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • gibt's da jetzt eine Logik der anderen Art?

      wenn ich schreibe
      if was_passiert=1 then 'flag gesetzt
      was_passiert=0 'flag wird zurück gesetzt
      end if
      dann lese ich fas flag 'was_passiert' aus, wenn es gesetzt ist, setze ich es zurück.

      warum ist dann tcd0_intflags.0 beim Lesen gesetzt, wenn es =1 ist und ich setze es zurück durch Schreiben von =1? Wenn ich das flag jetzt wieder lesen würde, was bekomme ich für einen Wert?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Jetzt wird's ja immer komplizierter! Du verwendest doch jetzt 2 unabhängige flags. Wenn die jetzt irgendwo verknüpft sind und sich so gegenseitig beeinflussen, ok, dann kann das funktionieren, ist aber nicht einfach zu lesen.
      In dem Beispiel mit den tcd0 gibt es aber nur 1 flag. Ich lese eine 1, aha, gesetzt, und schreibe eine 1, um es zurück zu setzen. Wenn ich es jetzt wieder lese, dann ist doch da wieder die 1.
      Wenn ein 'gesetzt' in diesem Fall eine 0 ist und mit 1 resettet wird, dann müsste ich doch auch mal eine 0 lesen, bevor ich die mit 1 überschreibe. Dann ist aber die if-Abfrage nicht =true. Manoman.
      (inzwischen komm ich auf mein breakoutboard auch nicht mehr mit Usb hin. Blinkt zwar noch mit meinem Programm, aber ist vom Pc nicht mehr über Usb erreichbar a_166_29aea317 )
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Ja, offensichtlich.
      Vielleicht such' ich mir ein anderes Hobby. Nicht so anspruchsvoll, Schmelzklebern zB. Mit Eicheln kann man schöne Sachen basteln, oder mit Kronenkorken.

      Wenn das anders geht, warum werden dann dieselben bascombefehle verwendet, die man normal auch nimmt?
      'Fähnchen hoch' soll bit=0 sein, 'Fähnchen wieder runter' wird mit bit=1 erreicht. Wenn ich das bit anschaue und es ist 1, muss ich jetzt wissen, dass es eigentlich 0 ist??
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hallo tschoeatsch,

      mehr Rechenpower???

      Die Peripherie der ATXmega Controler hat kaum noch was mit der ATmega Generation gemeinsam.
      Leider ist die Xmega-Reihe zu den AVR-Prozessoren der Mega- oder Tiny-Serien nicht kompatibel (viel komplizierter, anderer Aufbau der IO-Baugruppen, der Interrupts, Funktionen etc.).
      Die „Vorteile“ der neueste Generation von AVR-Controllern mit neuem internen Aufbau, hoher Taktrate (32 MHz), niedriger Spannung (1,6 - 3,6V), vielen Schnittstellen usw. Besonderheiten: ADC mit 2 Megasample/12 Bit, vierpoliges Programm- und Debug- Interface PDI (VTref, CLK, DATA, GND) erfordert z.B. einen AVR_JTAGICE-mkII Programmer damit PDI (Flash und Debug) funktioniert.
      Persönliche Meinung:
      Momentan ist Bascom ungeeignet.(Die C-Programmierer sind nach meines Wissen auch nicht begeistert) Auch meine Versuche diese Dinger nur mit ASM zu programmieren waren nicht so erfreulich.
      Ja muss auch nicht völlig neu lernen wie die Steuerregister mit den Statusregistern verschachtelt sind. Da einige schon intern verknüpft und ich den Sinn nicht erkennen kann.
      Soll es die Jugend machen!!!
      Nun nutze ich wenn nötig mehre Atmega644p/128 parallel. Da kommt Freude auf wenn man sieht wie die sich die Arbeit teilen und Informationen austauschen(richtig Rechenpower).
      Gruß
      P.S
      Mit Stack Gosub und Co hattest Du auch völlig Recht das mit Bascom ein Unterprogramm immer mit Return verlassen werden muss da sonst der Adressspeicher überläuft. Ist aber zu 100% eine Bascomsache. Da warum auch immer kein Bush und Pop vorhanden.
      Dies konnte ich mit Praxistest nachvollziehen und war paff.
    • fredred wrote:

      mehr Rechenpower???
      genau, durch die höhere Taktfrequenz.

      Warum soll bascom ungeeignet sein? Ungewohnt ist es erst mal. Wenn ich mein vorhandenes Programm auf den xmega portieren will, muss ich halt dessen Einstellungen für den Systemtakt und eben den timer samt interrupt hin kriegen. Sind nur 2 Posten, Sytemtakt ist einfach, timer und dessen interrupt grad bisschen schwieriger, wegen der verdrehten Logik. Das versteh' ich vielleicht nach paar Bierchen besser.. Das ist halt der Preis für die Erweiterung des Bastelhorizontes.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hallo tschoeatsch,
      Warum meinst, dass die Logik verdreht ist? Ich kenne mich mit den XMegas auch nicht aus aber was ich lese ist doch so wie bei den Megas.
      Meiner Minuten nach ist nur die Konfiguration bei den Xs aufwendiger. Aber das hatte ich wegen der erweiterten Möglichkeiten auch erwartet.
    • tschoeatsch wrote:

      genau, durch die höhere Taktfrequenz.
      Ja wenn die höhere Taktfrequenz für mehr Rechenpower benötigt wird okay. Heißt aber nicht je höher der Takt je schneller die Ergebnisse. Speziell bei Verwendung synchronerTeilnehmern oder z.B. Temperatursensoren.

      tschoeatsch wrote:

      Warum soll bascom ungeeignet sein?
      Bitte richtig zitieren und nicht „Momentan“ weglassen.
      Mit ungeeignet meine ich die Nutzung der vielen Config und Lib die ja nach meinem erachten das Plus++ bei Bascom sind.
      Ja vielleicht habe ich zu schell aufgegeben beim Versuch $Lib „i2c_twi.lbx“ und gleichzeitig Config Dcf77 zum laufen zu bekommen. Mit ein paar Tricks jede einzelne zum laufen gebracht aber beide gleichzeitig nicht.
      Wenn man natürlich fast neu beginnen möchte ist es völlig okay und zwingend nötig die neuen Registereigenschaften zu verstehen.
      Der µC ist bestimmt eine geile Sache aber eben nichts mehr für mich.
      Gruß