www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CrossWorks AVR 2.0 - ATmega2560 - Timer0 läuft im Simulator nicht


Autor: Tom R. (t0m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe µC Freunde,
ich habe mich heute mal rangemacht um meinen Code vom Atmega2560 
(geschrieben im AVR Studio) in Crossworks AVR 2.0 zu portieren. 
Allerdings bin ich hier schon sehr früh gescheitert.

Ich wollte den Timer0 für die CTL als Timer einbinden, doch leider 
funktioniert der Timer0 im Simulator garnicht.

Diese Zeilen Code funktionieren im AVRStudio mit 1ms Ticks:
TCNT0 = 0;
OCR0A = 249;
TIMSK0 = 0x02;
TCCR0A = 0x02;
TCCR0B= 0x01;
SREG |= 0x01;

Wenn ich die Zeilen allerdings in den Standard CTL (Code nach dem 
Erstellen des CTL Projektes) einfüge, werden die Werte richtig in die 
Register geschrieben, aber TCNT0 bewegt sich kein Stück.
Hier der gesamte CTL Code:
#include <string.h>
#include <ctl_api.h>
#include <ATmega2560.h>

CTL_TASK_t main_task, new_task;

#define CALLSTACKSIZE 16 // this is only required for AVR builds
#define STACKSIZE 64          
unsigned new_task_stack[1+STACKSIZE+1];

void 
new_task_code(void *p)
{  
  unsigned int v=0;

  

  while (1)
    {      
      // task logic goes here      
      v++;
    }  
}

void
ctl_handle_error(CTL_ERROR_CODE_t e)
{
  while (1);
}

int main(void)
{
  unsigned int v=0;

  TCNT0 = 0;
  OCR0A = 249;
  TIMSK0 = 0x02;
  TCCR0A = 0x02;
  TCCR0B= 0x01;
  SREG |= 0x01;

  ctl_task_init(&main_task, 255, "main"); // create subsequent tasks whilst running at the highest priority.
  ctl_start_timer(ctl_increment_tick_from_isr); // start the timer 
  memset(new_task_stack, 0xcd, sizeof(new_task_stack));  // write known values into the stack
  new_task_stack[0]=new_task_stack[1+STACKSIZE]=0xfacefeed; // put marker values at the words before/after the stack
  ctl_task_run(&new_task, 1, new_task_code, 0, "new_task", STACKSIZE, new_task_stack+1, CALLSTACKSIZE);
  //ctl_task_set_priority(&main_task, 0); // drop to lowest priority to start created tasks running.
  
  while (1)
    {    
      // power down can go here if supported      
      v++;
    }
  return 0;
}


Würde mich sehr über einige Hilfestellungen freuen.

Gruß Tom

Autor: Zipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja. Eigentlich musst du dem Hersteller des Tools einheizen. Die haben 
sicher ein forum.

Autor: Tom R. (t0m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe es nun selbst rausbekommen. Der AVR Simulator simmuliert nur den 
CPU Core. Für die Peripherie muss ein JS-Skript geschrieben werden 
(siehe 
http://www.crossstudio.co.uk/documentation/avr_1_4...).

Für meinen speziellen Fall des Timer0 sieht das Skript wie folgt aus:
// ATmega2560

peripherals = new Array(0x200);
var totalCycleCount;

function reset()
{  
  totalCycleCount = 0;
  for (i=0; i<peripherals.length;i++)
    peripherals[i] = 0xcd;
  
  peripherals[0x44] = 0; // TCCR0A
  peripherals[0x45] = 0; // TCCR0B
  peripherals[0x46] = 0; // TCNT0
  peripherals[0x47] = 0; // OCR0A
  peripherals[0x48] = 0; // OCR0B
  peripherals[0x6E] = 0; // TIMSK0
  peripherals[0x35] = 0; // TIFR0
}

function pollForInterrupts(cycleCount)
{  
  switch (peripherals[0x45] & 0x7)
    {
      case 0: // not enabled
        return 0;
      case 1:
        ls = 0; // div 1
        break;
      case 2:        
        ls = 3; // div 8
        break;
      case 3:       
        ls = 6; // div 64
        break;
      case 4:        
        ls = 8; // div 256
        break;
      case 5:       
        ls = 10; // div 1024
        break;
    }
  var newCycleCount = totalCycleCount + cycleCount;  // calc new cpu cycle counter
  var increment = (newCycleCount>>ls) - (totalCycleCount>>ls);  //calc counter tick increment
  peripherals[0x46] = (peripherals[0x46] + increment) & 0xFF;  // increment counter
  totalCycleCount = newCycleCount;   // increment cpou cycle counter
  if (peripherals[0x46] >= peripherals[0x47])
    {
      peripherals[0x46] = 0;     
      if (peripherals[0x6E] & 2)
    {
    
        return 22;
    }
    }
  return 0;
}

function loadPeripheral(address)
{ 
  if (address >= 0x20 && address < 0x200)
    return peripherals[address];
  return 0xcd;
}

function storePeripheral(address, value)
{
  if (address >= 0x20 && address < 0x200)
  {
  return peripherals[address]=value;   
  }
}


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.